НЛТК Лемматизатор - PullRequest
       106

НЛТК Лемматизатор

0 голосов
/ 18 сентября 2018

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

Я собираюсь выполнить обработку естественного языка до этого.

Есть несколько слов списка.

      sent ='The laughs you two heard were triggered 
             by memories of his own high j-flying 
             moist moisture moisturize moisturizing '.lower().split()

Я сделал следующий код.Я ссылался на этот URL. NLTK: лемматизатор и pos_tag

from nltk.tag import pos_tag
from nltk.tokenize import word_tokenize
from nltk.stem import WordNetLemmatizer
def lemmatize_all(sentence):
    wnl = WordNetLemmatizer()
    for word, tag in pos_tag(word_tokenize(sentence)):
        if tag.startswith("NN"):
            yield wnl.lemmatize(word, pos='n')
        elif tag.startswith('VB'):
            yield wnl.lemmatize(word, pos='v')
        elif tag.startswith('JJ'):
            yield wnl.lemmatize(word, pos='a')



words = ' '.join(lemmatize_all(' '.join(sent)))

Полученные значения показаны ниже.

laugh heard be trigger memory own high j-flying moist moisture moisturize moisturizing

Я удовлетворен следующими результатами.

laughs -> laugh 
were -> be
triggered -> trigger 
memories -> memory 
moist -> moist 

Однако следующие значения не выполняются.

heard -> heard 
j-flying -> j-flying 
moisture -> moisture 
moisturize -> moisturize 
moisturizing -> moisturizing 

Хотя это было лучше, чем начальные значения, я хотел бы получить следующие результаты.

heard -> hear
j-flying -> fly
moisture -> moist
moisturize -> moist
moisturizing -> moist

Если у вас есть какие-либоДругой хороший способ извлечь значимые слова, пожалуйста, дайте мне знать.Спасибо

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

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: Нет определенного ответа.(ср Стеммерс против лемматизаторов )

0 голосов
/ 18 сентября 2018

Лемматизация не легкая задача.Вы не должны ожидать идеальных результатов.Однако Yiu может убедиться, что вам больше нравятся результаты других библиотек лемматизации.

Простота - очевидный вариант Python для оценки.Stanford core nlp - другое (на основе JVM и под GPL).

Есть другие варианты, но ни один не будет идеальным.

...