Pos Tag Lemmatize дает только одну строку на выходе

Используя Pos Tag для токенизации данных, он преобразуется в слово pos_tag. При передаче того же для лемматизации лемматизируется только первое значение.

Фрейм данных с двумя столбцами-

ID Text 
1  Lemmatization is an interesting part

После токенизации и удаления стоп-слов -

ID Tokenize_data
1  'Lemmatization', 'interesting', 'part'



#Lemmatization with postag
#Part of Speech Tagging
df2['tag_words'] = df2.tokenize_data.apply(nltk.pos_tag)
#Treebank to Wordnet
from nltk.corpus import wordnet

def get_wordnet_pos(treebank_tag):

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

from nltk.stem.wordnet import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()

def tagging(text):
#tagged = nltk.pos_tag(tokens)
    for (word, tag) in text:
        wntag = get_wordnet_pos(tag)
        if wntag is None:# not supply tag in case of None
            lemma = lemmatizer.lemmatize(word) 
        else:
            lemma = lemmatizer.lemmatize(word, pos=wntag) 
        return lemma

tag1 = lambda x: tagging(x)
df2['lemma_tag'] = df2.tag_words.apply(tag1)

Вывод идет как -

ID Lemma_words 
1  'Lemmatize'

Ожидал -

ID Lemma_words
1  'Lemmatize', 'interest', 'part'

person Dr.Chuck    schedule 16.04.2019    source источник
comment
Как вы вызываете функцию тегирования? Как вы пишете этот вывод?   -  person Josep Valls    schedule 16.04.2019
comment
он был вызван в переменной wntag   -  person Dr.Chuck    schedule 17.04.2019


Ответы (1)


Ниже функция работает -

Мой код не сохранял значения всех кортежей в моем списке почтовых тегов, поэтому на выходе появлялось только одно значение.

def lemmatize_sentence(text):
    #tokenize the sentence and find the POS tag for each token
    nltk_tagged = nltk.pos_tag(nltk.word_tokenize(text))  
    #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 lemmatized_sentence
person Dr.Chuck    schedule 17.04.2019
comment
Поднимите один для решения, которое вы могли бы придумать самостоятельно после публикации вопроса. - person Wiktor Stribiżew; 28.05.2019