为什么在使用 Python 的 wordcloud 库时不会从词云中排除停用词?

cod*_*joy 2 python nlp stop-words word-cloud

我想在我的词云中排除“The”、“The”和“My”。我正在使用 python 库“wordcloud”,如下所示,并使用这 3 个额外的停用词更新 STOPWORDS 列表,但 wordcloud 仍然包含它们。我需要更改什么才能排除这三个词?

我的代码截图

我导入的库是:

import numpy as np
import pandas as pd
from wordcloud import WordCloud, STOPWORDS
import matplotlib.pyplot as plt
Run Code Online (Sandbox Code Playgroud)

我已经尝试在下面的 STOPWORDS 集中添加元素,但是,即使成功添加了单词,wordcloud 仍然显示我添加到 STOPWORDS 集中的 3 个单词:

len(STOPWORDS) 输出:192

然后我跑了:

STOPWORDS.add('The')
STOPWORDS.add('They')
STOPWORDS.add('My')
Run Code Online (Sandbox Code Playgroud)

然后我跑了:

len(STOPWORDS) 输出:195

我正在运行 python 版本 3.7.3

我知道我可以在运行 wordcloud 之前修改文本输入以删除 3 个单词(而不是尝试修改 WordCloud 的 STOPWORDS 集),但我想知道 WordCloud 是否存在错误,或者我是否没有正确更新/使用 STOPWORDS?

bar*_*rny 5

Wordcloud 的默认设置是collocations=True,因此云中包含两个相邻单词的频繁短语 - 并且对于您的问题很重要,搭配使用停用词的删除是不同的,因此例如“谢谢”是一个有效的搭配并且可能即使“你”在默认停用词中,也会出现在生成的云中。只含有禁用词搭配删除。

听起来不无道理的理由是,如果在构建搭配列表之前删除停用词,那么例如“非常感谢”将提供“非常感谢”作为搭配,我绝对不想要。

因此,为了让您的停用词按照您的预期工作,即云中根本没有停用词,您可以collocations=False像这样使用:

my_wordcloud = WordCloud(
    stopwords=my_stopwords,
    background_color='white', 
    collocations=False, 
    max_words=10).generate(all_tweets_as_one_string)
Run Code Online (Sandbox Code Playgroud)

更新:

  • 使用搭配 False,停用词全部小写,以便在删除它们时与小写文本进行比较 - 因此无需添加“The”等。
  • 使用搭配 True(默认),而停用词是小写的,当寻找所有停用词搭配来删除它们时,源文本不是小写的,所以The文本中的蛋在被删除时不会the被删除 - 这就是为什么@Balaji Ambresh代码有效,您会看到云中没有上限。这可能是 Wordcloud 中的一个缺陷,不确定。但是,The在停用词中添加 eg不会影响这一点,因为停用词总是小写,无论搭配如何 True/False

这在源代码中都是可见的:-)

例如,collocations=True我得到的默认值:

在此处输入图片说明

并与collocations=False我得到: 在此处输入图片说明

代码:

from wordcloud import WordCloud
from matplotlib import pyplot as plt


text = "The bear sat with the cat. They were good friends. " + \
        "My friend is a bit bear like. He's lovely. The bear, the cat, the dog and me were all sat " + \
        "there enjoying the view. You should have seen it. The view was absolutely lovely. " + \
            "It was such a lovely day. The bear was loving it too."

cloud = WordCloud(collocations=False,
        background_color='white',
        max_words=10).generate(text)
plt.imshow(cloud, interpolation='bilinear')
plt.axis('off')
plt.show()
Run Code Online (Sandbox Code Playgroud)