在为 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
我正在了解 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