强制wordcloud python模块包含所有单词

时间:2015-08-31 14:05:43

标签: python visualization

我正在使用Andreas Mueller的Python中的wordcloud模块来可视化我的学生将完成的调查结果。 Brilliant模块,非常漂亮的图片,但是即使设置stopwords=Noneranks_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”),他们只是辍学。

1 个答案:

答案 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的源代码 - 您可以直接修改它,也可以更安全地修改它,并且可以扩展/修改行为,就像这个示例一样。