Лемматизация панд (Python)

Я новичок в Pandas и пытаюсь понять, как лемматизировать один столбец моего фрейма данных. Возьмем следующий пример (это некоторый текст после удаления (не)распространенного слова, который я хотел бы лемматизировать):

0 хорошо нуждается в изменениях virgils natural micro brewe...

1 новый фаворит с восхитительным сюрпризом находит фл...

2 любимых соуса с красным соусом, наслаждайтесь сильными танинами, ок, тяните...

3 качественных фантастических напитка 1800-х годов 21-го века...

4 красных первый раз пробую любовь 100отличная смесь ...

Это код, который я использую для лемматизации (взято из здесь):

df['words'] = df['words'].apply(lambda x: "".join([Word(word).lemmatize() for word in x]))
df['words'].head()

Но как только этот код запускается, вывод не меняется:

0 хорошее, нужно изменить virgil, натуральный микропивоваренный р ...

1 новый фаворит с восхитительным сюрпризом находит фл...

2 любимых соуса с красным соусом, наслаждайтесь сильными танинами, ок, тяните...

3 качественных фантастических напитка 1800-х годов 21-го века...

4 красных первый раз пробую любовь 100отличная смесь ...

Любая помощь будет принята с благодарностью :)

P.S: words — это список токенизированных слов


person Stefano Pozzi    schedule 10.07.2018    source источник
comment
Это выглядит так: needs => need, changes => change и virgils => virgil, поэтому вывод действительно меняется.   -  person Scratch'N'Purr    schedule 10.07.2018
comment
@Scratch'N'Purr О, да... Я больше сосредоточился на trying, не должно ли оно стать try? Или brewed должно стать brew   -  person Stefano Pozzi    schedule 10.07.2018
comment
Честная оценка. В этом случае ваша проблема может быть более сложной, чем она есть, потому что вам придется указать части речи (POS) для глаголов, на которые вы только что намекнули. Если вы запустите метод lemmatize без указания POS, произойдет сбой. Следовательно, в случае trying и brewed код должен быть Word('trying').lemmatize('v') и Word('brewed').lemmatize('v'). Источник   -  person Scratch'N'Purr    schedule 10.07.2018


Ответы (1)


Вам, вероятно, больше не нужно решение, но если вы хотите лемматизировать многие позиции, вы можете использовать:

Если вы хотите больше, вы можете попробовать следующий код:

import nltk
from nltk.corpus import stopwords
from nltk.tokenize import word_tokenize
from nltk.stem.wordnet import WordNetLemmatizer
from nltk.corpus import wordnet
lemmatizer = nltk.stem.WordNetLemmatizer()
wordnet_lemmatizer = WordNetLemmatizer()
stop = stopwords.words('english')


def nltk_tag_to_wordnet_tag(nltk_tag):
    if nltk_tag.startswith('J'):
        return wordnet.ADJ
    elif nltk_tag.startswith('V'):
        return wordnet.VERB
    elif nltk_tag.startswith('N'):
        return wordnet.NOUN
    elif nltk_tag.startswith('R'):
        return wordnet.ADV
    else:
        return None

def lemmatize_sentence(sentence):
    #tokenize the sentence and find the POS tag for each token
    nltk_tagged = nltk.pos_tag(nltk.word_tokenize(sentence))
    #tuple of (token, wordnet_tag)
    wordnet_tagged = map(lambda x: (x[0], nltk_tag_to_wordnet_tag(x[1])), nltk_tagged)
    lemmatized_sentence = []
    for word, tag in wordnet_tagged:
        if tag is None:
            #if there is no available tag, append the token as is
            lemmatized_sentence.append(word)
        else:
            #else use the tag to lemmatize the token
            lemmatized_sentence.append(lemmatizer.lemmatize(word, tag))
    return " ".join(lemmatized_sentence)



# Lemmatizing
df['Lemmatize'] = df['word'].apply(lambda x: lemmatize_sentence(x))
print(df.head())

результат:

         word                       |        Lemmatize

0  Best scores, good cats, it rocks | Best score , good cat , it rock

1          You received best scores |          You receive best score

2                         Good news |                       Good news

3                          Bad news |                        Bad news

4                    I am loving it |                    I be love it

5                    it rocks a lot |                   it rock a lot

6     it is still good to do better |     it be still good to do good
person Renaud    schedule 27.01.2020