Сегментирование слов и группировка переносов и апострофных слов из текста - PullRequest
5 голосов
/ 15 февраля 2012

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

Эти индексы будут позже использоваться для проверки сходства документов, поиска и т. Д. Какие-либо предложения, как я могу бороться с этими проблемами?Я подумал о том, чтобы сопоставить отсканированное слово со списком слов, но проблема в том, что правильные существительные и не словарные слова будут опущены.

Информация: мой код на Java

1 Ответ

3 голосов
/ 19 февраля 2012

Я думаю, вам следует применить комбинацию методов.

1) Для распространенных вариантов написания я бы выбрал метод, основанный на словаре.Так как они распространены, я не буду беспокоиться о пропущенных словарных словах.Это должно решить проблему цвета / цвета.

2) Для опечаток и других нестандартных вариантов написания вы можете применить алгоритм Metaphone (http://en.wikipedia.org/wiki/Metaphone)) для преобразования токенов в представление их английского произношения. Подобные варианты звучатаналогично, таким образом вы можете сопоставить их друг с другом (например, от Джона до Джона). Вы также можете использовать алгоритмы сопоставления на основе расстояния редактирования во время запроса, чтобы сопоставить очень похожие токены только с парой символов, расположенных рядом или с пропущенными символами (например, Huseyin против Housein).

3) Для апострофов и составных слов с дефисом между ними можно сохранить оба варианта.Например, «Джон» будет индексироваться как «Джон с» и «Джонс».«Пробел» может быть преобразован (или сохранен вместе) в «Пробел» и «Пробел».

4) Для составных слов без дефиса между ними вы можете использовать внешнюю библиотеку, такую ​​как HyphenationCompoundWordTokenFilterFactoryкласс Solr (http://lucene.apache.org/solr/api/org/apache/solr/analysis/HyphenationCompoundWordTokenFilterFactory.html). Хотя он может использовать словарь, он не обязан. Он предназначен для работы со сложными словами, которые часто встречаются в немецком и аналогичных языках. Я не вижу причин, почему вы не можете применить егона английский (вам нужно будет предоставить английский словарь и файлы правил переносов).

На самом деле, последний вопрос поднимает важный вопрос. Я не думаю, что вам нужно создавать собственную библиотеку поиска с нуля.Если это правда, почему бы вам не использовать Lucene (или Solr, основанный на Lucene), библиотеку поиска на основе Java, в которой уже есть методы и способы решения этих проблем? Например, метод внедрения позволяетиндексировать как цвет, так и цвет в одном и том же месте документа, поэтому не имеет значения, гдеВы также ищете «цветные машины» или «цветные машины» (при условии, что вы позаботитесь о том, чтобы остановить).Есть фильтры, которые выполняют фонетическую индексацию (http://lucene.apache.org/solr/api/org/apache/solr/analysis/PhoneticFilterFactory.html). Существует даже компонент FuzzyQuery, который позволяет вам разрешить определенное количество расстояний редактирования для соответствия аналогичным терминам (http://lucene.apache.org/core/old_versioned_docs/versions/3_2_0/api/all/org/apache/lucene/search/FuzzyQuery.html)

. Вам также необходимо решить, в какой точке выЯ хочу решить эти проблемы: один из крайних подходов - индексировать все возможные варианты этих терминов во время индексации и использовать запросы такими, как они есть. Это обеспечит простоту обработки запросов, но обойдется вам в больший индекс (поскольку всеварианты, которые вам нужно хранить.) Другой крайний случай - индексировать документы такими, как они есть, и расширять запросы во время поиска. Это позволит вам поддерживать индекс на низком уровне за счет более сложной обработки запросов. Фонетическая индексация потребует от вас обработкии ваши документы во время индексации, и запросы во время поиска. Нечеткое сопоставление будет возможно только во время поиска, потому что, по-видимому, вы не сможете сохранить все варианты редактирования всех терминов в индексе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...