Я пробовал PorterStemmer и Snowball, но оба работают не со всеми словами, пропустив некоторые очень распространенные.
Мои тестовые слова: « кошки, бегущие, бегали, кактусы, кактусы, сообщества кактусов », и оба получают менее половины правильных ответов.
Смотрите также:
nlp
stemming
lemmatization
Manixrock
источник
источник
Ответы:
Если вы знаете Python, в The Natural Language Toolkit (NLTK) есть очень мощный лемматизатор, использующий WordNet .
Обратите внимание, что если вы впервые используете этот лемматизатор, вы должны загрузить корпус перед его использованием. Это можно сделать:
Вам нужно сделать это только один раз. Предполагая, что вы скачали корпус, он работает следующим образом:
В модуле nltk.stem есть и другие лемматизаторы , но я сам их не пробовал.
источник
dies
, он даст вамdy
вместоdie
. Нет ли какого-нибудь жестко запрограммированного стеммерного словаря?WordNetLemmatizer
неправильно лемматизируются?Для лемматизации я использую stanford nlp. Я сталкивался с похожей проблемой в последние несколько дней. Все благодаря stackoverflow, который помог мне решить проблему.
Также может быть хорошей идеей использовать стоп-слова, чтобы минимизировать выходные леммы, если они будут использоваться позже в классификаторе. Пожалуйста, обратите внимание на расширение coreNlp, написанное Джоном Конвеллом.
источник
Я попробовал ваш список терминов на этом демо-сайте снежного кома, и результаты выглядят нормально ....
Предполагается, что стеммер сводит изменяемые формы слов к некоторому общему корню. Сделать этот корень «правильным» словарным словом - не совсем задача стеммера. Для этого вам нужно взглянуть на морфологические / орфографические анализаторы .
Я думаю, что этот вопрос примерно об одном и том же, и Каарел ответил на этот вопрос, откуда я взял вторую ссылку.
источник
Споры о стеммерах и лемматизаторах продолжаются. Дело в том, что точность важнее эффективности. Вы должны лемматизировать, чтобы получить лингвистически значимые единицы, и основу, чтобы использовать минимум вычислительных ресурсов и при этом индексировать слово и его варианты с одним и тем же ключом.
См. « Стеммеры против лемматизаторов»
Вот пример с Python NLTK:
источник
WordNetLemmatizer
«slemmatize()
может принимать POS тег. Итак, из вашего примера:" ".join([wnl.lemmatize(i, pos=VERB) for i in sent.split()])
дает'cat run run cactus cactuses cacti community communities'
.pos=NOUN
? BTW: Давно не виделись, надеюсь, мы скоро встретимся на конференции =)pos=VERB
вы выполняете лемматизацию только для глаголов. Существительные остались прежними. Мне просто нужно было написать немного моего собственного кода, чтобы вращаться вокруг реальных тегов POS Penn Treebank, чтобы применить правильную лемматизацию к каждому токену. Кроме того,WordNetLemmatizer
неприятно лемматизировать токенизатор по умолчанию nltk. Так что примеры вродеdoes n't
не лемматизироватьdo not
.port.stem("this")
производитthi
иport.stem("was")
wa
, даже если для каждого предоставлен правильный pos.Официальная страница Мартина Портера содержит Porter Stemmer на PHP, а также на других языках .
Если вы действительно серьезно относитесь к хорошему стеммингу, хотя вам нужно будет начать с чего-то вроде алгоритма Портера, доработайте его, добавив правила для исправления неправильных случаев, общих для вашего набора данных, а затем, наконец, добавьте к правилам множество исключений. . Это может быть легко реализовано с помощью пар ключ / значение (dbm / hash / dictionaries), где ключ - это слово для поиска, а значение - это слово с корнем для замены оригинала. Коммерческая поисковая машина, над которой я когда-то работал, закончила с 800 некоторыми исключениями из модифицированного алгоритма Портера.
источник
http://wordnet.princeton.edu/man/morph.3WN
Для многих моих проектов я предпочитаю лемматизатор WordNet на основе лексикона более агрессивному портеру.
http://wordnet.princeton.edu/links#PHP содержит ссылку на интерфейс PHP к API-интерфейсам WN.
источник
Основываясь на различных ответах на Stack Overflow и блогах, с которыми я сталкивался, это метод, который я использую, и, похоже, он довольно хорошо возвращает реальные слова. Идея состоит в том, чтобы разбить входящий текст на массив слов (используйте тот метод, который вам нравится), а затем найти части речи (POS) для этих слов и использовать их, чтобы помочь определить и лемматизировать слова.
Вышеупомянутый образец не работает слишком хорошо, потому что POS не может быть определен. Однако, если использовать реальное предложение, все работает намного лучше.
источник
Загляните в WordNet, большую лексическую базу данных для английского языка:
http://wordnet.princeton.edu/
Есть API для доступа к нему на нескольких языках.
источник
Это выглядит интересно: MIT Java WordnetStemmer: http://projects.csail.mit.edu/jwi/api/edu/mit/jwi/morph/WordnetStemmer.html
источник
Взгляните на LemmaGen - библиотеку с открытым исходным кодом, написанную на C # 3.0.
Результаты для ваших тестовых слов ( http://lemmatise.ijs.si/Services )
источник
Пакеты верхнего питона (в произвольном порядке) для лемматизации являются:
spacy
,nltk
,gensim
,pattern
,CoreNLP
иTextBlob
. Я предпочитаю реализацию spaCy и gensim (основанную на шаблоне), потому что они идентифицируют POS-тег слова и автоматически присваивают соответствующую лемму. Приводятся более релевантные леммы, сохраняя смысл.Если вы планируете использовать nltk или TextBlob, вам нужно позаботиться о том, чтобы вручную найти правильный тег POS и найти правильную лемму.
Пример лемматизации с помощью spaCy:
Пример лемматизации с помощью Gensim:
Приведенные выше примеры были заимствованы из этой страницы лемматизации .
источник
Сделайте поиск по Lucene, я не уверен, есть ли порт PHP, но я знаю, что Lucene доступен для многих платформ. Lucene - это библиотека индексации и поиска OSS (от Apache). Естественно, у него и у статистов сообщества есть на что посмотреть. По крайней мере, вы можете узнать, как это делается на одном языке, чтобы вы могли перевести «идею» на PHP.
источник
Могу я процитировать свой ответ на вопрос, упомянутый StompChicken:
Поскольку они не понимают язык и не используют словарь терминов, у них нет возможности распознать и отреагировать соответствующим образом на нестандартные случаи, такие как «бегать» / «бегать».
Если вам нужно обрабатывать нерегулярные случаи, вам нужно либо выбрать другой подход, либо дополнить свой стемминг собственным пользовательским словарем исправлений, которые будут запускаться после того, как стеммер сделает свое дело.
источник
Самая последняя версия стеммера в NLTK - Snowball.
Вы можете найти примеры того, как его использовать здесь:
http://nltk.googlecode.com/svn/trunk/doc/api/nltk.stem.snowball2-pysrc.html#demo
источник
Вы можете использовать стеммер Морфа. UW загрузил морфа-стеммер в Maven Central, если вы планируете использовать его из Java-приложения. Есть обертка, которая значительно упрощает использование. Вам просто нужно добавить его как зависимость и использовать
edu.washington.cs.knowitall.morpha.MorphaStemmer
класс. Экземпляры являются потокобезопасными (в исходном JFlex без необходимости были поля классов для локальных переменных). Создайте экземпляр класса, запуститеmorpha
и слово, которое вы хотите остановить.источник
.Net lucene имеет встроенный стеммер портера. Вы можете попробовать это. Но обратите внимание, что портер при выводе леммы не учитывает контекст слова. (Просмотрите алгоритм и его реализацию, и вы увидите, как он работает)
источник
Мартин Портер написал Snowball (язык для алгоритмов стемминга) и переписал «English Stemmer» на Snowball. Есть английский Stemmer для C и Java.
Он прямо заявляет, что Porter Stemmer был повторно реализован только по историческим причинам, поэтому проверка корректности стемминга против Porter Stemmer даст вам результаты, которые вы (должны) уже знать.
Доктор Портер предлагает использовать стеммеры English или Porter2 вместо стеммера Porter. Английский стеммер - это то, что фактически используется на демонстрационном сайте, как ранее ответил @StompChicken.
источник
В Java я использую tartargus-snowball для слов
Maven:
Образец кода:
источник
Попробуйте вот это: http://www.twinword.com/lemmatizer.php
Я ввел ваш запрос в демонстрацию
"cats running ran cactus cactuses cacti community communities"
и получил["cat", "running", "run", "cactus", "cactus", "cactus", "community", "community"]
необязательный флагALL_TOKENS
.Образец кода
Это API, поэтому вы можете подключиться к нему из любой среды. Вот как может выглядеть вызов PHP REST.
источник
Я настоятельно рекомендую использовать Spacy (базовый анализ текста и теги) и Textacy. (обработка текста более высокого уровня, построенная на основе Spacy).
Лемматизированные слова доступны по умолчанию в Spacy в качестве
.lemma_
атрибута токена, а текст может быть лемматизирован при выполнении множества других операций предварительной обработки текста с помощью текстового преобразования. Например, при создании набора терминов или слов или, как правило, непосредственно перед выполнением некоторой обработки, которая требует этого.Я рекомендую вам проверить оба, прежде чем писать какой-либо код, так как это может сэкономить вам много времени!
источник
источник