我正在使用Andreas Mueller的Python中的wordcloud模块来可视化我的学生将完成的调查结果。 Brilliant模块,非常漂亮的图片,但是即使设置stopwords=None
和ranks_only=True
,我也无法识别所有单词。调查回复长度在一到三个字之间,可能包含连字符。
这是一个例子。首先,我在Jupyter笔记本中安装依赖项:
import matplotlib.pyplot as plt
%matplotlib inline
from wordcloud import WordCloud
from scipy.misc import imread
然后假设我把所有的回复都放到一个字符串中:
words = "do do do do do do do do do do re re re re re mi mi fa fa fa fa fa fa fa fa fa fa-so fa-so fa-so fa-so fa-so so la ti do"
然后我执行剧情:
wordcloud = WordCloud(ranks_only = True,stopwords=None).generate(words)
plt.imshow(wordcloud)
plt.axis('off')
plt.show()
但出于某种原因,尽管频率很高,但它忽略了“做”和“发送”。
任何提示?除了“不要使用文字云”。这是一个愚蠢的调查,它邀请一个愚蠢的可视化。谢谢。
更新
仍然无法包含带连字符的单词(例如“fa-so”),他们只是辍学。
答案 0 :(得分:2)
查看wordcloud.py,如果stopwords参数为None,则使用内置的STOPWORDS集 - 因此您不会禁止使用停用词。尝试使用stopwords=set()
调用它。
wordcloud.py中的内置标记化将一个单词识别为一系列字母数字字符(因此fa-so被分成fa等)忽略大小写,并且还合并简单的复数(例如狗进入狗)并忽略单个数字。如果你想绕过这个,你需要建立一个元组列表,每个元组包含一个单词及其频率,然后调用WordCloud.generate_from_frequencies(freqs)。
我无法安装wordcloud,但是在wordfreq函数中使用\ S +(即它将连续的非空格字符识别为单词)的简化标记化肯定有效:
import re
from operator import itemgetter
words = "do do do do do do do do do do re re re re re mi mi fa-so fa fa fa fa fa fa fa fa fa-so fa-so fa-so fa-so fa-so so la ti do"
item1 = itemgetter(1)
def wordfreq(text):
d = {}
for word in re.findall(r"\S+", text):
# for word in re.findall(r"\w[\w']*", text):
if word.isdigit():
continue
word_lower = word.lower()
# Look in lowercase dict.
if word_lower in d:
d2 = d[word_lower]
else:
d2 = {}
d[word_lower] = d2
# Look in any case dict.
d2[word] = d2.get(word, 0) + 1
d3 = {}
for d2 in d.values():
# Get the most popular case.
first = max(d2.items(), key=item1)[0]
d3[first] = sum(d2.values())
return d3.items()
freqs = wordfreq(words)
print freqs
# prints: [('do', 11), ('la', 1), ('fa-so', 6), ('mi', 2), ('fa', 8), ('so', 1), ('ti', 1), ('re', 5)]
# pass freqs to WordCloud.generate_from_frequencies()
# maybe something like:
# wordcloud = WordCloud(ranks_only = True,stopwords=set()).generate_from_frequencies(freqs)
您可以查看wordcloud.py的源代码 - 您可以直接修改它,也可以更安全地修改它,并且可以扩展/修改行为,就像这个示例一样。