Алгоритм Stemming, который производит реальные слова - PullRequest
36 голосов
/ 10 октября 2008

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

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

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

Это работает, до определенного момента, но не возвращает "настоящие" слова. В приведенном выше примере используется "commun".

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

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

Для моего примера (сообщество / сообщества) Снежок связан с "communiti".

Вопрос

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

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

Ответы [ 3 ]

47 голосов
/ 05 марта 2009

Если я правильно понимаю, тогда вам нужен не стеммер, а лемматизатор. Lemmatizer - это инструмент, обладающий знаниями об окончаниях, таких как -ies , -ed и т. Д., И исключительными формами слов, такими как написано и т. Д. Lemmatizer отображает входную словоформу в его лемма, которая гарантированно будет «настоящим» словом.

Есть много лемматизаторов для английского языка, но я использовал только 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

16 голосов
/ 10 октября 2008

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

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

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

13 голосов
/ 06 июня 2012

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

...