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

2024-09-28 21:27:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python中使用andreasmueller编写的wordcloud模块来可视化学生将要完成的一项调查的结果。很棒的模块,非常漂亮的图片,但是我很难让它识别所有的单词,即使是在设置stopwords=None和{}时。调查回答的长度在一到三个单词之间,并且可能包含连字符。在

这里有一个例子。首先,我在Jupyter笔记本中安装依赖项:

import matplotlib.pyplot as plt
%matplotlib inline
from wordcloud import WordCloud
from scipy.misc import imread

然后假设我将所有的响应放入一个字符串中:

^{pr2}$

然后我执行这个情节:

wordcloud = WordCloud(ranks_only = True,stopwords=None).generate(words)
plt.imshow(wordcloud)
plt.axis('off')
plt.show()

但由于某些原因,它忽略了“做”和“fa-so”,尽管它们的频率很高。在

有什么提示吗?除了“不要用云”这个词。这是一个愚蠢的调查,它邀请了一个愚蠢的想象。谢谢。在

更新

仍然不能包括连字符的单词(例如“fa-so”),它们就退出了。在


Tags: 模块fromimportnonesomatplotlib可视化plt
1条回答
网友
1楼 · 发布于 2024-09-28 21:27:02

看着wordcloud.py,如果stopwords参数为None,则它使用内置的stopwords集-因此您不会禁止使用stopwords。尝试用stopwords=set()调用它。在

中的内置标记化wordcloud.py将一个单词识别为一系列字母数字字符(因此fa-so被拆分为fa-so),忽略大小写,同时合并简单的复数(例如dogs到dog)并忽略单个数字。如果您想绕过这个问题,您需要构建一个元组列表,每个元组都包含一个单词及其频率,然后调用WordCloud.generate_from_频率(频率)。在

我无法安装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-您可以直接或更安全地修改它,并且可以像这个例子一样扩展/修改行为。在

相关问题 更多 >