#python #pandas #nlp
#python #панды #nlp
Вопрос:
Я пытаюсь отобразить наиболее часто встречающиеся слова во фрейме данных, который содержит следующие столбцы tags
и text
.
Этот фрейм данных представляет собой смесь True
и Fake
новостей. Истинные новости имеют значение 0
во фрейме данных, а поддельные новости имеют значение 1
:
tags text
kt-rOnMBAC-oqacdW1Q- 1 On Monday night, Donald Trump traveled to West...
k9-rOnMBAC-oqacdW1Q- 1 Donald Trump is very busy right now trying to ...
lN-rOnMBAC-oqacdW1Q- 1 By now, we all know that upon having emergency...
ld-rOnMBAC-oqacdW1Q- 1 Donald Trump s horrible decisions and disgusti...
lt-rOnMBAC-oqacdW1Q- 1 It s tough sometimes to imagine that Donald Tr...
... ... ...
Y-CvOnMBAC-oqacdBwEJ 0 BRUSSELS (Reuters) - NATO allies on Tuesday we...
ZOCvOnMBAC-oqacdBwEJ 0 LONDON (Reuters) - LexisNexis, a provider of l...
ZeCvOnMBAC-oqacdBwEJ 0 MINSK (Reuters) - In the shadow of disused Sov...
ZuCvOnMBAC-oqacdBwEJ 0 MOSCOW (Reuters) - Vatican Secretary of State ...
Z-CvOnMBAC-oqacdBwEJ 0 JAKARTA (Reuters) - Indonesia will buy 11 Sukh...
Я уже строю данные, используя следующий код:
import nltk
from nltk import tokenize
tokenSpace = tokenize.WhitespaceTokenizer()
def counter(text, columnText, quantity):
allWords = ' '.join([text for text in text[columnText].astype('str')])
tokenPhrase = tokenSpace.tokenize(allWords)
frequency = nltk.FreqDist(tokenPhrase)
dfFrequency = pd.DataFrame({"Word": list(frequency.keys()), "Frequency": list(frequency.values())})
dfFrequency = dfFrequency.nlargest(columns = "Frequency", n = quantity)
plt.figure(figsize=(12,8))
ax = sns.barplot(data = dfFrequency, x = "Word", y = "Frequency", palette="deep")
ax.set(ylabel = "Count")
plt.xticks(rotation='horizontal')
plt.show()
Когда я вызываю функцию:
counter(df2[df2['tags'] == 1], 'text', 20)
Я получаю следующий график:
Итак, теперь мой вопрос:
Есть ли способ получить в результате только значимые слова? (Например, пропустить малозначащие слова. Например (это, то, чтобы …))
Ответ №1:
Автоматического способа сделать это нет. Обычно вы определяете свои стоп-слова:
my_stop_words = ['the','and','to','of','was','with','on','in','for','no','name',
'is','he','or','at','as','one','she','am','you','his',
'your','were','by','pt','not','her','be','this','are','there',
'had','date','from','first','an','that','have','but','has','please','which',
'namepattern','seen','every','fax', 'home', 'telephone', 'given', 'after',
'also','will', 'un', 'up', 'well', 'time', 'any']
А затем отфильтруйте их:
# remove stopwords
vect = CountVectorizer(max_features = 3000, tokenizer = note_flatner, stop_words = my_stop_words)
В вашем случае вы можете сделать это с помощью:
dfFrequency = dfFrequency [~dfFrequency ['Word'].str.contains('|'.join(my_stop_words))]
Ответ №2:
Вы должны отфильтровать эти слова с низким значением (стоп-слова) вручную. В библиотеке NLTK есть список стоп-слов, если вы не хотите определять свои собственные:
import nltk
from nltk.corpus import stopwords
stopwords = list(stopwords.words('english'))
NLTK загружается с помощью pip
pip install nltk
Затем установите стоп-слова с помощью
import nltk
nltk.download('stopwords')