【问题标题】:Force wordcloud python module to include all words强制 wordcloud python 模块包含所有单词
【发布时间】:2015-11-25 14:29:18
【问题描述】:

我正在使用 Andreas Mueller 编写的 Python 中的 wordcloud 模块来可视化我的学生将完成的调查结果。出色的模块,非常漂亮的图片,但是即使设置stopwords=Noneranks_only=True,我也无法让它识别所有单词。调查回复的长度在 1 到 3 个单词之间,并且可能包含连字符。

这是一个例子。首先,我在 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()

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

有什么建议吗?除了“不要使用词云”。这是一个愚蠢的调查,它邀请了一个愚蠢的可视化。谢谢。

更新

仍然无法包含连字符(例如“fa-so”),它们就会退出。

【问题讨论】:

  • 尝试不带任何参数的调用,例如:WordCloud().generate(words)
  • 那是我的第一次尝试。没有骰子。同样的问题。

标签: python visualization


【解决方案1】:

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

wordcloud.py 中的内置标记化将单词识别为一系列字母数字字符(so fa-so 被拆分为 fa 等),忽略大小写,还合并简单的复数(例如 dog 为 dog)并忽略单个数字.如果你想绕过这个,你需要构建一个元组列表,每个元组都包含一个单词及其频率,然后调用 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 的源代码 - 您可以直接修改它,或者更安全和抗更新,您可以像这个示例一样扩展/修改行为。

【讨论】:

  • 很好的提示,现在所有单个单词都已计算在内。然而连字符的单词仍然被忽略:fa-so 应该在那里,但没有运气。如何告诉算法包含连字符的字符串?
  • 如果你看一下代码,我会发现它把连字符的 fa-so 放到了频率中——也许其他东西在 wordcloud 代码中阻止了它们?
猜你喜欢
  • 1970-01-01
  • 2011-06-13
  • 2018-10-10
  • 1970-01-01
  • 2017-03-31
  • 2014-09-23
  • 2016-04-05
  • 1970-01-01
  • 2021-11-09
相关资源
最近更新 更多