Сегментация текста: разбиение слов на основе словаря

Задний план

Разделите имена столбцов базы данных на эквивалентный текст на английском языке, чтобы заполнить словарь данных. Словарь английского языка создан на основе корпоративных документов, вики-сайтов и электронной почты. Словарь (lexicon.csv) представляет собой файл CSV со словами и вероятностями. Таким образом, чем чаще кто-то пишет слово «терапевт» (в электронной почте или на вики-странице), тем выше вероятность того, что «имя терапевта» разделится на «имя терапевта», а не на что-то другое. (Скорее всего, в лексикон даже не войдет слово «насильник».)

Исходный код

Дата файлы

Проблема (обновлено 03 января 2011 г.)

Когда возникает следующая проблема:

dependentrelationship::end depend ent dependent relationship
end=0.86
ent=0.001
dependent=0.8
relationship=0.9

Существуют следующие возможные решения:

dependentrelationship::dependent relationship
dependentrelationship::dep end ent relationship
dependentrelationship::depend ent relationship

Лексикон содержит слова с их относительными вероятностями (в зависимости от частоты слов): dependent 0.8, end 0.86, relationship 0.9, depend 0.3 и ent 0.001.

Исключите решение dep end ent relationship, потому что dep отсутствует в лексиконе (т. е. используется 75% слов), тогда как два других решения охватывают 100% слов в лексиконе. Из оставшихся решений вероятность dependent relationship составляет 0,72, тогда как вероятность depend ent relationship составляет 0,00027. Поэтому мы можем выбрать dependent relationship как правильное решение.

Связанный

Вопрос

Данный:

// The concatenated phrase or database column (e.g., dependentrelationship).
String concat;

// All words (String) in the lexicon within concat, in left-to-right order; and
// the ranked probability of those words (Double). (E.g., {end, 0.97}
// {dependent, 0.86}, {relationship, 0.95}.)
Map.Entry<String, Double> word;

Как бы вы реализовали подпрограмму, которая генерирует наиболее вероятное решение на основе охвата словарного запаса и вероятностей? Например:

for( Map.Entry<String, Double> word : words ) {
  result.append( word.getKey() ).append( ' ' );

  // What goes here?

  System.out.printf( "%s=%f\n", word.getKey(), word.getValue() );
}

Спасибо!


person Dave Jarvis    schedule 02.01.2011    source источник
comment
Вы уверены, что хотите исключить слова, которых нет в вашем лексиконе? Всегда найдутся «интересные» слова, которых нет в лексиконе.   -  person Stompchicken    schedule 05.01.2011
comment
@StompChicken: 1) Технические руководства + деловые документы -> корпус. 2) Корпус + словарь (с леммами) -> вероятностный словарь. 3) Алгоритм (лексикон + столбцы) -> разделить слова. С тех пор я протестировал решение на более чем 3300 именах столбцов. Программное обеспечение правильно разделило 87% (случайная выборка из 100) слов. Оставшиеся 13%, которые я видел, можно было бы точно разделить, если бы (а) словарь включал леммы; и (б) в корпусе было больше данных. Обе эти проблемы могут быть легко и быстро решены.   -  person Dave Jarvis    schedule 05.01.2011
comment
@ Дэйв Джарвис, я не уверен, да это или нет. Я хочу сказать, что распределение слов имеет длинный хвост, и количество данных, необходимых для получения этих дополнительных %, увеличивается экспоненциально.   -  person Stompchicken    schedule 05.01.2011
comment
@StompChicken: слова, отсутствующие в лексиконе, обрабатываются правильно (например, ageconrolnoticeperiod -> age conrol период уведомления). Ближайший ответ на ваш вопрос — да, но это не означает, что «интересные» слова отбрасываются из решения. Имейте в виду, что цель не 100% конверсия. Достаточно будет 95%: остальное можно исправить вручную.   -  person Dave Jarvis    schedule 05.01.2011
comment
@Dave Jarvis Спасибо за объяснение. Должно быть, я неправильно понял ваш подход.   -  person Stompchicken    schedule 05.01.2011


Ответы (2)


Питер Норвиг написал кое-что на питоне.

http://norvig.com/ngrams/ngrams.py

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

Если вы конвертируете его в java, мне было бы интересно увидеть реализацию.

Спасибо.

Майк

person Mike St. John    schedule 24.01.2011

Ваша проблема очень распространена в НЛП — не начинайте с изобретения велосипеда — это займет у вас много времени и будет не так хорошо, как то, что уже существует.

Вы, безусловно, должны начать с просмотра того, что могут предложить библиотеки НЛП: http://en.wikipedia.org/wiki/Natural_language_processing и http://en.wikipedia.org/wiki/Category:Natural_language_processing_toolkits< /а>. Ваша проблема является общей, и существуют разные подходы, которые вам нужно будет изучить для вашего корпуса.

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

Но банального ответа нет — найдите то, что лучше всего подходит именно вам.

person peter.murray.rust    schedule 02.01.2011
comment
Мы разбираем химические названия - например. хлорметилбензол и использовать большой словарь фрагментов как для DFA, так и для регулярных выражений. Нам пришлось написать собственный код, на что ушло около 2 человеко-лет. Разбор может происходить с обоих концов. Мы также используем n-граммы, и я снова использовал попытки, начиная с обоих концов. Мы немного продвинулись в обнаружении неизвестных лексем (их бесконечное количество, поскольку химикам разрешено их изобретать) и орфографических ошибок. Я не знаю сразу, какие пакеты делают английское разделение слов, но я бы начал с переносов. В немецком языке это будет существенной функцией. - person peter.murray.rust; 03.01.2011
comment
Эта проблема намного проще, и решение не обязательно должно быть на 100 % идеальным. Мне не нужно анализировать слова на основе n-грамм. Последний абзац исправленной постановки задачи описывает алгоритм, необходимый для выбора наиболее вероятного ответа. Сомневаюсь, что на поиск решения такой проблемы уйдут годы... :-) Я ценю ваши отзывы. - person Dave Jarvis; 03.01.2011