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

StackOverflow https://stackoverflow.com/questions/190775

Вопрос

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

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

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

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

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

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

В моем примере (сообщество / communities) Снежный ком связан с "communiti".

Вопрос

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top