Мне нужно взять абзац текста и извлечь из него список «тегов». Большая часть этого довольно прямолинейна. Однако мне нужна некоторая помощь, которая теперь приводит к появлению списка слов, чтобы избежать дублирования. Пример: Сообщество / Сообщества
Я использовал реализацию алгоритма Porter Stemmer (кстати, я пишу на PHP):
http://tartarus.org/~martin/PorterStemmer/php.txt
Это работает, вплоть до точки, но не возвращает «настоящих» слов. Приведенный выше пример основан на «коммуне».
Я пробовал «Снежок» (предлагаемый в другом потоке переполнения стека).
http://snowball.tartarus.org/demo.php
Для моего примера (сообщества / сообщества) Snowball проистекает из «сообщества».
Вопрос
Существуют ли какие-либо другие алгоритмы, которые будут делать это? Кто-нибудь еще решил эту проблему?
Мое настоящее мышление заключается в том, что я мог бы использовать алгоритм извлечения, чтобы избежать дублирования, а затем выбрать кратчайшее слово, с которым я сталкиваюсь, чтобы быть фактическим словом для отображения.
Основная проблема здесь заключается в том, что алгоритмы генерации основаны на фонетической основе, основанной исключительно на правилах написания языка без реального понимания языка, с которым они работают. Чтобы создавать реальные слова, вам, вероятно, придется объединить вывод стеблемера с помощью какой-либо функции поиска, чтобы преобразовать основы обратно в реальные слова. В основном я вижу два возможных способа сделать это:
Лично я думаю, что так, как я бы это сделал, это была бы динамическая форма №1, создавая пользовательскую базу данных словарей, записывая каждое изученное слово вместе с тем, что оно было связано, а затем предполагая, что наиболее распространенным словом является то, которое должно быть используемый. (например, если в моем тексте исходного текста используются «сообщества» чаще, чем «сообщество», а затем сообщать об сообществах -> сообществах.). Основанный на словарях подход будет более точным в целом, и его построение на основе входных данных ствола даст результаты настроенный на ваши тексты, причем основным недостатком является требуемое пространство, что в наши дни не является проблемой.
Если я правильно понимаю, то то, что вам нужно, не является стволовым, а лемматизатором. 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
Эй, я не знаю, возможно ли это, возможно, слишком поздно, но есть только один сценарий PHP, который создает реальные слова: http://phpmorphy.sourceforge.net/ – мне потребовались годы, чтобы найти его. Все остальные стеблемеры должны быть скомпилированы, и даже после этого они работают только по алгоритму Портера, который создает основы, а не леммы (т. Е. Community = communiti). PhpMorphy работает отлично, его легко установить и инициализировать, а также английские, русские, немецкие, украинские и эстонские словари. Он также поставляется со сценарием, который вы можете использовать для компиляции других словарей. Документация на русском языке, но переводится через Google translate, и это должно быть легко.