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

强制wordcloud python模块包含所有单词,python,visualization,Python,Visualization,我正在使用Andreas Mueller在Python中的wordcloud模块来可视化我的学生将要完成的调查结果。出色的模块,非常好的图片,但是我很难让它识别所有单词,即使设置stopwords=None和ranks\u only=True。调查回答的长度在一到三个单词之间,可能包含连字符 这里有一个例子。首先,我在Jupyter笔记本中安装依赖项: import matplotlib.pyplot as plt %matplotlib inline from wordcloud import

我正在使用Andreas Mueller在Python中的wordcloud模块来可视化我的学生将要完成的调查结果。出色的模块,非常好的图片,但是我很难让它识别所有单词,即使设置
stopwords=None
ranks\u 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()
但出于某种原因,它忽略了“do”和“fa so”,尽管它们的频率很高

有什么建议吗?除了“不要用云这个词”。这是一个愚蠢的调查,它需要一个愚蠢的想象。谢谢

更新


仍然无法包含连字符的单词(例如“fa so”),它们只是退出

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

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

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

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

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

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

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

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

只需尝试在不使用任何参数的情况下调用:wordcloud().generate(words),这是我第一次尝试。没有骰子。同样的问题。请尝试在没有任何参数的情况下调用:WordCloud()。生成(words),这是我第一次尝试。没有骰子。同样的问题。请尝试在没有任何参数的情况下调用:WordCloud()。生成(words),这是我第一次尝试。没有骰子。同样的问题。请尝试在没有任何参数的情况下调用:WordCloud()。生成(words),这是我第一次尝试。没有骰子。同样的问题。很好的提示,现在所有的单词都被解释了。然而,连字符的单词仍然被忽略:
fa所以
应该在那里,但没有运气。如何告诉算法包含连字符字符串?如果你看代码,我显示它将连字符的fa如此放入freqs中-可能是其他东西在wordcloud代码中阻止了它们?很好的提示,现在所有单个单词都被考虑了。然而,连字符的单词仍然被忽略:
fa所以
应该在那里,但没有运气。如何告诉算法包含连字符字符串?如果你看一下代码,我会显示它将连字符的fa如此放入freqs中-可能是其他东西在wordcloud c中阻止了它们