word_tokenize с тем же кодом и тем же набором данных, но с другим результатом, почему? - PullRequest
0 голосов
/ 01 марта 2020

В прошлом месяце я попытался токенизировать текст и создать из слов, чтобы увидеть, какое слово появляется часто. Сегодня я хочу сделать это снова в том же наборе данных с тем же кодом. Это все еще работает, но результат другой, и, очевидно, сегодняшний результат неверен, потому что частота появления слов значительно уменьшается.

Вот мой код:

from nltk.tokenize import sent_tokenize, word_tokenize
from sklearn.feature_extraction.text import ENGLISH_STOP_WORDS
from nltk.stem import WordNetLemmatizer
import nltk
from collections import Counter

sent = nltk.word_tokenize(str(df.description))
lower_token = [t.lower() for t in sent]
alpha = [t for t in lower_token if t.isalpha()]
stop_word =  [t for t in alpha if t not in ENGLISH_STOP_WORDS]
k = WordNetLemmatizer()
lemma = [k.lemmatize(t) for t in stop_word]
bow = Counter(lemma)
print(bow.most_common(20))

Вот образец моего набора данных

Этот набор данных из Kaggle и имя его "Винные обзоры".

1 Ответ

0 голосов
/ 02 марта 2020

Добро пожаловать в StackOverflow.

У вашей проблемы может быть две причины.

1) Возможно, вы изменили набор данных. Для этого я бы проверил набор данных и проверил, вносили ли вы какие-либо изменения в сами данные. Потому что ваш код работает на других примерах и не будет меняться изо дня в день, потому что в нем нет случайных элементов.

2) Второй проблемой может быть использование df.description при вызове столбца данных в этой строке:

sent = nltk.word_tokenize(str(df.description))

вы получите усеченный вывод. Посмотрите на тип df.description, и это Series объект.

Я создал другой пример, и он выглядит следующим образом:

from nltk.tokenize import word_tokenize
import pandas as pd

df = pd.DataFrame({'description' : ['The OP is asking a question and I referred him to the Minimum Verifible Example page which states: When asking a question, people will be better able to provide help if you provide code that they can easily understand and use to reproduce the problem. This is referred to by community members as creating a minimal, reproducible example (reprex), a minimal, complete and verifiable example (mcve), or a minimal, workable example (mwe). Regardless of how it\'s communicated to you, it boils down to ensuring your code that reproduces the problem follows the following guidelines:']})


print(df.description)

0    The OP is asking a question and I referred him...
Name: description, dtype: object

Как вы видите выше, он усекается и это не полный текст в столбце description.

Я рекомендую вашему коду заглянуть в эту строку кода и найти другой способ сделать это:

sent = nltk.word_tokenize(str(df.description))

Обратите внимание, что метод, который вы использовали в своем коде, будет включать в себя номер индекса (который, как я понимаю, вы фильтровали по isalpha), а также этот Name: description, dtype: object в данных, которые вы обрабатываете.

Один из способов будет использовать map для обработки ваших данных. Пример:

pd.set_option('display.max_colwidth', -1)
df['tokenized'] = df['description'].map(str).map(nltk.word_tokenize)

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

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...