НЛТК слово Лемматизатор странное поведение - помощь в маркировке POS - Python 3

Пытался написать небольшую программу по анализу настроений в python3. Но во время работы со словом лемматизатор увидел странное преобразование "было" в "ва", что было совершенно неожиданным. Ниже приведен мой код предварительной обработки - пожалуйста, помогите мне понять, как я могу избежать этих проблем. Кроме того, если POS-теги необходимы для получения правильного лемматизатора, как правильно и эффективно включить его в функцию предварительной обработки

wordnet_lemmatizer = WordNetLemmatizer()
stoplist = stopwords.words('english') + list(string.punctuation)

def preprocess(text):
    return [wordnet_lemmatizer.lemmatize(word) for word in word_tokenize(text) if wordnet_lemmatizer.lemmatize(word.lower()) not in stoplist and not word.isdigit() and len(word)>2]

Входной текст был в основном корпусом из Multi-Domain Sentiment Dataset (версия 2.0), и строка, которая привлекла мое внимание, была ниже

<review_text> I just recieved my HDMI cable and am very impressed. The price is just what it should be about $5 and makes me wonder how somebody would spend over $100 for this cable at a store. The service was excellent and the cable arrived in 4 days! I highly recommend this cable. I just plugged it into my cable box and the other end into the TV and WOW what a great picture all around. The color is just so much more vivid using HDMI compared to component 3 wire connectors. Get this cable for your system and stay away from those high priced others </review_text>

И вывод функции после лемматизации

['recieved', 'HDMI', 'cable', 'impressed', 'price', 'make', 'wonder', 'somebody', 'would', 'spend', 'cable', 'store', 'service', 'wa', 'excellent', 'cable', 'arrived', 'day', 'highly', 'recommend', 'cable', 'plugged', 'cable', 'box', 'end', 'WOW', 'great', 'picture', 'around', 'color', 'much', 'vivid', 'using', 'HDMI', 'compared', 'component', 'wire', 'connector', 'Get', 'cable', 'system', 'stay', 'away', 'high', 'priced', 'others']

Что меня полностью потрясло, так это то, как "был" превращается в "ва"?? Есть и другие интересные вещи, такие как впечатленный, оставшийся впечатленный и не изменившийся на впечатляющий, что может быть из-за POS?

Если кто-то может помочь мне с пометкой POS в той же функции, будет отличной помощью

------------------- РЕДАКТИРОВАНИЕ ПОСЛЕ РЕШЕНИЯ И ВАЛИДАЦИИ ------------------

Спасибо за ссылку kaggle, я использовал точно такую ​​же функцию и получил лучшие результаты. Просто хотел проверить две вещи, которые могут быть, потому что у меня нет правильного понимания POS

import nltk
from nltk.corpus import stopwords
from nltk.corpus import wordnet
from nltk import word_tokenize
from nltk import pos_tag
from nltk.stem import WordNetLemmatizer
import numpy as np
from sklearn.linear_model import LogisticRegression
from bs4 import BeautifulSoup
import string

nltk.data.path.append('C:\\Users\\myuser\\AppData\\Roaming\\nltk_data\\')

actualSent = "<review_text> I just recieved my HDMI cable and am very impressed. The price is just what it should be about $5 and makes me wonder how somebody would spend over $100 for this cable at a store. The service was excellent and the cable arrived in 4 days! I highly recommend this cable. I just plugged it into my cable box and the other end into the TV and WOW what a great picture all around. The color is just so much more vivid using HDMI compared to component 3 wire connectors. Get this cable for your system and stay away from those high priced others </review_text>"


wordnet_lemmatizer = WordNetLemmatizer()
stoplist = stopwords.words('english') + list(string.punctuation)

def penn2morphy(penntag):
    """ Converts Penn Treebank tags to WordNet. Copied from kaggle post https://www.kaggle.com/alvations/basic-nlp-with-nltk"""

    morphy_tag = {'NN':'n', 'JJ':'a',
                  'VB':'v', 'RB':'r'}
    try:
        return morphy_tag[penntag[:2]]
    except:
        return 'n'

def lemmatize_sent(text): 
    # Text input is string, returns lowercased strings.
    return [wordnet_lemmatizer.lemmatize(word.lower(), pos=penn2morphy(tag)) 
            for word, tag in pos_tag(word_tokenize(text))]

def preprocess(text):
    return [word for word in lemmatize_sent(text) if word not in stoplist and not word.isdigit()]

token = preprocess(actualSent)

Приведенный выше код дал мне следующий вывод

['review_text', 'recieved', 'hdmi', 'cable', 'impressed', 'price', 'make', 'wonder', 'somebody', 'would', 'spend', 'cable', 'store', 'service', 'excellent', 'cable', 'arrive', 'day', 'highly', 'recommend', 'cable', 'plug', 'cable', 'box', 'end', 'tv', 'wow', 'great', 'picture', 'around',  'color', 'much', 'vivid', 'use', 'hdmi', 'compare', 'component', 'wire', 'connector', 'get', 'cable', 'system', 'stay', 'away', 'high', 'price',  'others', '/review_text']

Теперь, почему слово "получил" не изменилось на "получить" и "впечатлило", не изменилось на "произвести впечатление"

Мои идеи прояснятся, если кто-то может помочь мне понять вышеупомянутые два

0 ответов

Другие вопросы по тегам