Алгоритм строгания, создающий реальные слова - программирование
Подтвердить что ты не робот

Алгоритм строгания, создающий реальные слова

Мне нужно взять абзац текста и извлечь из него список "тегов". Большая часть этого довольно прямолинейна. Однако мне нужна некоторая помощь, которая теперь приводит к появлению списка слов, чтобы избежать дублирования. Пример: Сообщество/Сообщества

Я использовал реализацию алгоритма Porter Stemmer (кстати, я пишу на PHP):

http://tartarus.org/~martin/PorterStemmer/php.txt

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

Я пробовал "Снежок" (предлагается в другом потоке).

http://snowball.tartarus.org/demo.php

В моем примере (сообщество/сообщества) Snowball проистекает из "сообщества".

Вопрос

Есть ли какие-нибудь другие алгоритмы, которые будут делать это? Кто-нибудь еще решил эту проблему?

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

4b9b3361

Ответ 1

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

  • Найдите или создайте большой словарь, который отображает каждый возможный вывод обратно на фактическое слово. (например, сообщество → сообщество).
  • Создайте функцию, которая сравнивает каждый стебель с списком слов, которые были сведены к этому основанию, и пытается определить, что наиболее похоже. (например, сравнивая "communiti" с "сообществом" и "сообществами" таким образом, что "сообщество" будет признано более похожим вариантом).

Лично я думаю, что способ, которым я бы это сделал, был бы динамической формой №1, создавая пользовательскую базу данных словарей, записывая каждое изученное слово вместе с тем, что оно было связано, а затем предполагая, что наиболее распространенным словом является тот, который должен использоваться. (например, если в моем тексте исходного текста используются "сообщества" чаще, чем "сообщество", а затем сообщать об сообществах → сообществах.). Основанный на словарях подход будет более точным в целом, и его построение на основе входных данных ствола даст результаты настроенный на ваши тексты, причем основным недостатком является требуемое пространство, которое в наши дни не является проблемой.

Ответ 2

Если я правильно понимаю, то то, что вам нужно, не является стволовым, а лемматизатором. Lemmatizer - это инструмент со знанием о концах вроде -ies, -ed и т.д., А также исключительные текстовые формы, такие как написанные и т.д. Лемматизатор отображает входной словоформу в свою лемму, которая гарантируется как "реальное" слово.

Есть много lemmatizers для английского языка, я использовал только morpha. Morpha - это просто большой файл lex, который вы можете скомпилировать в исполняемый файл. Пример использования:

$ cat test.txt 
Community
Communities
$ cat test.txt | ./morpha -uc
Community
Community

Вы можете получить морфу из http://www.informatics.sussex.ac.uk/research/groups/nlp/carroll/morph.html

Ответ 3

Эй, я не знаю, возможно, это слишком поздно, но есть только один PHP-вывод script, который создает реальные слова: http://phpmorphy.sourceforge.net/ - потребовалось Мне нужно найти его. Все остальные стеблемеры должны быть скомпилированы, и даже после этого они работают только по алгоритму Портера, который создает основы, а не леммы (т.е. Community = communiti). PhpMorphy работает отлично, легко устанавливается и инициализируется, а также имеет английские, русские, немецкие, украинские и эстонские словари. Он также поставляется с script, который вы можете использовать для компиляции других словарей. Документация на русском языке, но переводится через Google, и это должно быть легко.