Улучшение проверки правописания - PullRequest
3 голосов
/ 13 ноября 2011

У меня есть индекс lucene, документы представлены примерно на 20 разных языках, и все они в одном индексе, у меня есть поле 'lng', которое я использую для фильтрации результатов только на одном языке.

На основе этого индекса я реализовал проверку орфографии, проблема в том, что я получаю предложения от всех языков, которые не имеют значения (если я ищу по-английски, предложения по-немецки не то, что мне нужно).Моя первая идея состояла в том, чтобы создать разные индексы проверки орфографии для каждого языка, а не выбирать индексы на основе языка запроса, но мне это не нравится, возможно ли добавить дополнительный столбец в индекс проверки орфографии и использовать его,или есть какой-то лучший способ сделать это?

Другой вопрос, как я могу улучшить предложения для 2 или более терминов в поисковом запросе, в настоящее время я просто делаю это для первого, который может быть значительно улучшен, чтобы использовать ихв комбинации, но я не смог найти ни примеров, ни реализаций, которые могли бы помочь мне решить эту проблему.

спасибо almir

Ответы [ 3 ]

2 голосов
/ 15 ноября 2011

Насколько я знаю, невозможно добавить поле 'language' в индекс проверки орфографии.Я думаю, что вам нужно определить несколько поисковых запросов SpellChecker s, чтобы достичь этого.

РЕДАКТИРОВАТЬ: Как выяснилось в комментариях, что язык запроса также вводится пользователем, тогда мой ответограничено: определить несколько проверок правописания.Что касается второго вопроса, который вы добавили, я думаю, что он обсуждался ранее, например здесь .

Однако, даже если бы это было возможно, это не решает самую большую проблему, которая заключается в обнаружении языка запросов.Это очень нетривиальная задача для очень коротких сообщений, которые могут включать в себя аббревиатуры, имена собственные и сленговые термины.Простые методы, основанные на n-граммах, могут быть неточными (как, например, детектор языка от Tika).Поэтому я думаю, что наиболее сложной частью является то, как использовать оценки достоверности как для детектора языка, так и для проверки орфографии, и какой порог следует выбрать для обеспечения значимых исправлений (например, детектор языка предпочитает немецкий, но проверка орфографии имеет хорошее соответствие на датском ...)

2 голосов
/ 17 ноября 2011

Если вы посмотрите на источник SpellChecker.SuggestSimilar, вы увидите:

    BooleanQuery query = new BooleanQuery();
    String[] grams;
    String key;

    for (int ng = GetMin(lengthWord); ng <= GetMax(lengthWord); ng++)
    {
      <...>
      if (bStart > 0)
      { 
         Add(query, "start" + ng, grams[0], bStart); // matches start of word
      }
      <...>

т.е. поиск предложений - это просто набор логических запросов OR. Вы, конечно, можете изменить этот код здесь что-то вроде:

  query.Add(new BooleanClause(new TermQuery(new Term("Language", "German")),
                    BooleanClause.Occur.MUST));

, который будет искать только предложения на немецком языке. Однако нет способа сделать это без изменения кода, за исключением нескольких проверок орфографии.


Для работы с несколькими терминами используйте QueryTermExtractor , чтобы получить массив ваших терминов. Сделайте проверку правописания для каждого, и объедините декартово. Возможно, вы захотите выполнить запрос для каждой комбинации, а затем отсортировать по частоте, с которой они происходят (например, как работает проверка орфографии из одного слова).

0 голосов
/ 13 ноября 2011

После реализации двух разных функций поиска на двух разных сайтах с lucene и sphinx я могу сказать, что sphinx - явный победитель.

Рассмотрите возможность использования http://sphinxsearch.com/ вместо люцена. Он используется Craigslist, среди других.

Они имеют функцию, называемую морфологическими препроцессорами:

 # a list of morphology preprocessors to apply
 # optional, default is empty
 #
 # builtin preprocessors are 'none', 'stem_en', 'stem_ru', 'stem_enru',
 # 'soundex', and 'metaphone'; additional preprocessors available from
 # libstemmer are 'libstemmer_XXX', where XXX is algorithm code
 # (see libstemmer_c/libstemmer/modules.txt)
 #
 # morphology  = stem_en, stem_ru, soundex
 # morphology = libstemmer_german
 # morphology = libstemmer_sv
 morphology  = none

Есть много доступных стеммеров, и, как вы можете видеть, среди них есть немецкий.

UPDATE:

Уточнение, почему я чувствую, что сфинкс стал для меня явным победителем.

  • Скорость: Сфинкс быстр. Как индексирование, так и обслуживание поисковых запросов.
  • Релевантность: Хотя это трудно измерить количественно, я чувствовал, что смог добиться более значимых результатов с помощью sphinx по сравнению с моей реализацией lucene.
  • Зависимость от файловой системы: С lucene я не смог разорвать зависимость от файловой системы. И хотя они являются обходными путями, как создание оперативного диска, я чувствовал, что было проще выбрать опцию «запускать только в память» для sphinx. Это имеет значение для веб-сайтов с более чем одним веб-сервером, добавлением динамических данных в индекс, переиндексацией и т. Д.

Да, это всего лишь точки зрения. Однако это мнение кого-то, кто пробовал обе системы.

Надеюсь, это поможет ...

...