在为 Python 使用 WordCloud 时,为什么在云中考虑了字母 "S" 的频率?

While using WordCloud for Python, why is the frequency of the letter "S" considered in the cloud?

我正在了解 Python 的 WordCloud 包,我正在使用 NLTK 的 Moby Dick Text 对其进行测试。摘录如下:

Snippet of my example string

正如您从图中的高亮部分看到的那样,所有所有格撇号都已转义为“/'S”,WordCount 似乎将其计入频率计数为“S”:

Frequency distribution of words

当然这会导致问题,因为“S”被算作高频,而其他所有词的频率在云中都是倾斜的:

Example of my skewed cloud

在我针对同一个 Moby Dick 字符串学习的教程中,WordCloud 似乎没有计算“S”。我是不是在某处遗漏了某个属性,还是必须从我的字符串中手动删除“/'s”?

下面是我的代码摘要:

example_corpus = nltk.corpus.gutenberg.words("melville-moby_dick.txt")
word_list = ["".join(word) for word in example_corpus]
novel_as_string = " ".join(word_list)

wordcloud = WordCloud().generate(novel_as_string)
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")

plt.show()

看起来你的输入是问题的一部分,如果你看起来是这样,

corpus = nltk.corpus.gutenberg.words("melville-moby_dick.txt")
words = [word for word in  corpus]
print word[215:230]

你得到

['RICHARDSON', "'", 'S', 'DICTIONARY', 'KETOS', ',', 'GREEK', '.', 'CETUS', ',', 'LATIN', '.', 'WHOEL', ',', 'ANGLO']

你可以做一些事情来尝试克服这个问题,你可以只过滤长度超过 1 的字符串,

words = [word for word in corpus if len(word) > 1]

您可以尝试使用 nltk 提供的不同文件,或者您可以尝试读取原始输入并正确解码。

在这样的应用中,通常先使用stopwords来过滤单词列表,因为您不希望a, an, the, it, ...等简单的单词支配您的结果。

稍微更改了代码,希望对您有所帮助。你可以查看stopwords.

的内容
import nltk
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from nltk.corpus import stopwords

example_corpus = nltk.corpus.gutenberg.words("melville-moby_dick.txt")
# word_list = ["".join(word) for word in example_corpus] # this statement seems like change nothing
# using stopwords to filter words
word_list = [word for word in example_corpus if word not in stopwords.words('english')]
novel_as_string = " ".join(word_list)

wordcloud = WordCloud().generate(novel_as_string)
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")

plt.show()

输出:见wordcloud Imgur