Разделить строку на значимые слова - PullRequest
1 голос
/ 07 августа 2011

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

Теперь проблема в том, что в файле XML есть такие слова, как "literacy_male", "infantmortalityrate_female" и т. Д. Для первого я могу разделитьслова в «_» перед сохранением, но для второго я не уверен, как я могу разбить слово на значащие слова.

Я использую Apache Lucene для полнотекстового поиска.

Ответы [ 6 ]

1 голос
/ 07 августа 2011

Одной из возможностей является увеличение размера индекса путем добавления всех подстрок одной и той же строки. поэтому для «abc» вы будете хранить: «a», «b», «c», «ab», «bc», «abc» (это O (n ^ 2) строк).

еще одна возможность - использование подстановочных знаков. индексировать все, что у вас есть, и искать:
<term>*, a*<term>*, ..., z*<term>* вместо <term>. это займет ОЧЕНЬ больше времени, но это не увеличит размер индекса.
примечание: необходимо искать так много терминов, потому что вы НЕ МОЖЕТЕ использовать подстановочный знак в качестве первой буквы термина.
a*<term>* означает, что поиск по всем терминам начинается с a, затем не имеет ни одного или каких-либо символов, затем <term>, а затем снова ни одного или каких-либо символов.

больше информации о терминах и подстановочных знаках в люцене: http://lucene.apache.org/java/2_0_0/queryparsersyntax.html

РЕДАКТИРОВАТЬ:

комбинация из них даст (на мой взгляд) лучшее решение:
индексировать все суффиксы строки, а затем для каждого члена (а не запроса!) - вместо поиска <term> искать <term>*. если термин существует как подстрока, он также запускает хотя бы один префикс и находит его.

например: если у вас есть "lifeexpectancy", вы будете индексировать:
"lifeexpectancy","ifeexpectancy","feexpectancy","eexpectancy",....,"y"
для того же примера, когда вы хотите искать life expectancy, вы будете искать life* expectancy*

1 голос
/ 07 августа 2011

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

Вы могли бы уточнить свою схему поиска, индексируя выбранные последовательности символов, а не слова. Например, создайте индекс всех последовательностей, которые начинаются с начального гласного, а затем аналогичным образом обрезайте поисковые термины до ведущего гласного.

0 голосов
/ 09 августа 2011

да, можно разбить строку на слова, даже если нет разделенных символов.Это может быть решено довольно эффективно вблизи O (n).Попробуйте использовать префикс строки регулярного выражения и извлекать слово за словом из вашей строки.Вы также можете проверить этот инструмент http://code.google.com/p/graph-expression/wiki/RegexpOptimization.

Существует более надежный (более эффективный подход, использующий глобальную оптимизацию, а не локальную в качестве предыдущих), использующий автомат проверки орфографии, который ищет наиболее подходящее разбиение строки.Посмотрите этот урок о том, как это делается на китайских словарных строках http://alias -i.com / lingpipe / demos / tutorial / chineseTokens / read-me.html

0 голосов
/ 07 августа 2011

Если у вас есть база данных строк, которые могут содержаться в этой строке, вы можете сделать это:

Разделить строку по разделителям, которые вы можете идентифицировать (например, _, ,, -, ...) и после этого каждая часть может быть разбита на столько частей, сколько вы можете определить по сумме самых коротких строк в БД

, как если бы у вас была строка в 10 символов, а самая короткая строка в БД - 4 символаВы можете получить эти комбо:

4,6
5,5
6,4 10

нет 4,4,2 или что-то подобное

и после этого вы можете искать каждую часть в БД, и если каждая часть присутствует, вы можете сказать, что она разделена на «средние слова»

, но без этой базы данных или со слишком общим словарем вы можете застрять наэто или это может быть почти невозможно

0 голосов
/ 07 августа 2011

компьютер не интеллектуален, они понимают, что вы им говорите. Так что было бы проще, если бы вы поддерживали какой-то стандарт при создании XML-файла. В противном случае я не думаю, что есть какой-либо способ конвертировать "infantmortalityrat" в "baby + смертность + скорость "

0 голосов
/ 07 августа 2011

Вам нужно установить некоторые правила о том, как XML-файл должен быть отформатирован, чтобы это работало.

Я полагаю, вы не можете манипулировать XML-файлом (или он уже создани заполнено)?

Если вы можете (или оно генерируется вашим кодом), вам нужно установить некоторые правила, такие как

  • Ключевые слова, разделенные ,
  • Ключевые слова не имеют пробелов, но вместо них используются _

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

Если вы не можете этого сделать, вам нужно проанализировать ключевое слово и попробовать разные варианты синтаксического анализа (например, «разбить по _») и посмотреть, какое из них дает лучший результат.Но это будет непросто и требует времени.

Пожалуйста, добавьте образец вашего XML-файла к исходному вопросу.

...