TL; DR
Проблема XY в том, что лемматизатор не соответствует вашим ожиданиям, когда используемый вами лемматизатор предназначен для решения другой проблемы.
В Long
Q: Что такое лемма?
Лемматизация (или лемматизация) в лингвистике - это процесссгруппировать изогнутые формы слова, чтобы их можно было проанализировать как единый элемент, идентифицируемый леммой слова или словарной формой.- Википедия
В: Что такое «словарная форма»?
NLTK использует алгоритм morphy
, который используетWordNet как основа «словарных форм»
См. Также Как работает spacy lemmatizer? .Примечание. В SpaCy добавлены дополнительные хаки для обработки более неправильных слов.
В: Почему moisture -> moisture
и moisturizing -> moisturizing
?
Потому что есть synset (своего рода «словарная форма») для «влаги» и «увлажнения»
>>> from nltk.corpus import wordnet as wn
>>> wn.synsets('moisture')
[Synset('moisture.n.01')]
>>> wn.synsets('moisture')[0].definition()
'wetness caused by water'
>>> wn.synsets('moisturizing')
[Synset('humidify.v.01')]
>>> wn.synsets('moisturizing')[0].definition()
'make (more) humid'
В: Как я могу получить moisture -> moist
?
Не очень полезно.Но, возможно, попробуйте стемер (но не ожидайте слишком многого)
>>> from nltk.stem import PorterStemmer
>>> porter = PorterStemmer()
>>> porter.stem("moisture")
'moistur'
>>> porter.stem("moisturizing")
'moistur'
Q: Тогда как мне получить moisuturizing/moisuture -> moist
? !!
Там нет обоснованного способа сделать это.Но прежде чем пытаться сделать это, какова конечная цель сделать moisuturizing/moisuture -> moist
.
Действительно ли это необходимо сделать?
Если вы действительно хотите, вы можете попробовать векторы слов и попытаться найти большинство похожих слов, но есть целый другой мир предостережений, который идет с векторами слов.
В: Подождите минутку, но heard -> heard
смешно?!
Да, POS-тегер неправильно помечает услышанное.Скорее всего, потому что предложение не является правильным предложением, поэтому POS-теги неверны для слов в предложении:
>>> from nltk import word_tokenize, pos_tag
>>> sent
'The laughs you two heard were triggered by memories of his own high j-flying moist moisture moisturize moisturizing.'
>>> pos_tag(word_tokenize(sent))
[('The', 'DT'), ('laughs', 'NNS'), ('you', 'PRP'), ('two', 'CD'), ('heard', 'NNS'), ('were', 'VBD'), ('triggered', 'VBN'), ('by', 'IN'), ('memories', 'NNS'), ('of', 'IN'), ('his', 'PRP$'), ('own', 'JJ'), ('high', 'JJ'), ('j-flying', 'NN'), ('moist', 'NN'), ('moisture', 'NN'), ('moisturize', 'VB'), ('moisturizing', 'NN'), ('.', '.')]
Мы видим, что heard
помечен как NNS
(существительное).Если мы лемматизировали его как глагол:
>>> from nltk.stem import WordNetLemmatizer
>>> wnl = WordNetLemmatizer()
>>> wnl.lemmatize('heard', pos='v')
'hear'
Q: Тогда как мне получить правильный POS-тег?!
Возможно, с SpaCy, вы получите ('heard', 'VERB')
:
>>> import spacy
>>> nlp = spacy.load('en_core_web_sm')
>>> sent
'The laughs you two heard were triggered by memories of his own high j-flying moist moisture moisturize moisturizing.'
>>> doc = nlp(sent)
>>> [(word.text, word.pos_) for word in doc]
[('The', 'DET'), ('laughs', 'VERB'), ('you', 'PRON'), ('two', 'NUM'), ('heard', 'VERB'), ('were', 'VERB'), ('triggered', 'VERB'), ('by', 'ADP'), ('memories', 'NOUN'), ('of', 'ADP'), ('his', 'ADJ'), ('own', 'ADJ'), ('high', 'ADJ'), ('j', 'NOUN'), ('-', 'PUNCT'), ('flying', 'VERB'), ('moist', 'NOUN'), ('moisture', 'NOUN'), ('moisturize', 'NOUN'), ('moisturizing', 'NOUN'), ('.', 'PUNCT')]
Но обратите внимание, в этом случае SpaCy получил ('moisturize', 'NOUN')
, а NLTK получил ('moisturize', 'VB')
.
Q: Но я не могу получить moisturize -> moist
с SpaCy?
Давайте не будем возвращаться к началу, где мы определяем, что такое лемма.Короче говоря:
>>> import spacy
>>> nlp = spacy.load('en_core_web_sm')
>>> sent
'The laughs you two heard were triggered by memories of his own high j-flying moist moisture moisturize moisturizing.'
>>> doc = nlp(sent)
>>> [word.lemma_ for word in doc]
['the', 'laugh', '-PRON-', 'two', 'hear', 'be', 'trigger', 'by', 'memory', 'of', '-PRON-', 'own', 'high', 'j', '-', 'fly', 'moist', 'moisture', 'moisturize', 'moisturizing', '.']
См. Также Как работает spacy lemmatizer? (снова)
Q: Хорошо, хорошо.Я не могу получить moisturize -> moist
... И POS-тег не идеален для heard -> hear
.Но почему я не могу получить j-flying -> fly
?
Возвращаясь к вопросу , зачем вам нужно конвертировать j-flying -> fly
, есть встречные примеры того, почему вы не захотитеЯ не хочу отделять что-то похожее на соединение.
Например:
- Должен ли
Classical-sounding
перейти к sound
? - Должен ли
X-fitting
перейти к fit
? - Если
crash-landing
перейти к landing
?
Зависит от конечной цели вашего приложения, преобразование токена в желаемую форму может или не может быть необходимым.
В: Тогда каков хороший способ извлечь значащие слова?
Я звучу как сломанная пластинка, но это зависит от вашей конечной цели?
Если ваша цель действительно понять значение слов, тогда вы должны задать себе вопрос: «Что означает значение?»
Имеет ли индивидуальное словоимеет значение вне контекста?Или же он будет иметь сумму значений из всех возможных контекстов, в которых он может встречаться.
Смородина Au, современный уровень техники в основном рассматривает все значения как массив чисел с плавающей точкой, и сравнения между множеством чисел с плавающей точкой - вот чтопридать смысл его смыслу.Но действительно ли это означает или просто средство для достижения цели?(Пун намеревался).
В: Почему у меня больше вопросов, чем ответов?
Добро пожаловать в мир компьютерной лингвистики, основанный на философии (например, на компьютере).наука).Обработка естественного языка широко известна как применение компьютерной лингвистики
Пища для размышлений
Q: Является ли лемматизатор лучше стеммера?
A: Нет определенного ответа.(ср Стеммерс против лемматизаторов )