Построение наиболее частых слов в тексте (удаление стоп-слов)

#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')