Алгоритм стемминга, который создает реальные слова
-
08-07-2019 - |
Вопрос
Мне нужно взять абзац текста и извлечь из него список "тегов".По большей части это довольно прямолинейно.Однако сейчас мне нужна некоторая помощь в составлении результирующего списка слов, чтобы избежать дубликатов.Пример:Сообщество / Сообщества
Я использовал реализацию алгоритма Porter Stemmer (кстати, я пишу на PHP).:
http://tartarus.org /~martin/PorterStemmer/php.txt
Это работает, до определенного момента, но не возвращает "настоящие" слова.Приведенный выше пример сводится к "общению".
Я попробовал "Snowball" (предлагается в другом потоке переполнения стека).
http://snowball.tartarus.org/demo.php
В моем примере (сообщество / communities) Снежный ком связан с "communiti".
Вопрос
Существуют ли какие-либо другие алгоритмы, которые будут это делать?Кто-нибудь еще решил эту проблему?
Мое текущее мышление заключается в том, что я мог бы использовать конечный алгоритм, чтобы избежать дубликатов, а затем выбрать самое короткое слово, с которым я сталкиваюсь, в качестве фактического слова для отображения.
Решение
Основная проблема здесь заключается в том, что работают исходные алгоритмы на фонетической основе исключительно на основе правил правописания языка, без какого-либо реального понимания языка, с которым они работают.Чтобы создать реальные слова, вам, вероятно, придется объединить выходные данные stemmer с какой-либо функцией поиска, чтобы преобразовать основы обратно в реальные слова.В принципе, я вижу два потенциальных способа сделать это:
- Найдите или создайте большой словарь, который сопоставляет каждую возможную основу с реальным словом.(например, communiti -> сообщество)
- Создайте функцию, которая сравнивает каждую основу со списком слов, которые были сведены к этой основе, и пытается определить, какая из них наиболее похожа.(например, сравнивая "коммьюнити" с "сообществом" и "сообществами" таким образом, чтобы "сообщество" было признано более похожим вариантом)
Лично я думаю, что способ, которым я бы это сделал, был бы динамической формой # 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, и это должно быть несложно.