如何在Python中忽略词云中的某些单词?

3
在Python3和Pandas中,我有一个从列中制作词云的程序:
import pandas as pd
import numpy as np
from wordcloud import WordCloud
import matplotlib.pyplot as plt

autores_atuais = pd.read_csv("deputados_autores_projetos.csv", sep=',',encoding = 'utf-8', converters={'IdAutor': lambda x: str(x), 'IdDocumento': lambda x: str(x), 'CodOriginalidade': lambda x: str(x), 'IdNatureza': lambda x: str(x), 'NroLegislativo': lambda x: str(x)})

autores_atuais.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 6632 entries, 74057 to 84859
Data columns (total 10 columns):
IdAutor             6632 non-null object
IdDocumento         6632 non-null object
NomeAutor           6632 non-null object
AnoLegislativo      6632 non-null object
CodOriginalidade    5295 non-null object
DtEntradaSistema    6632 non-null object
DtPublicacao        6632 non-null object
Ementa              6632 non-null object
IdNatureza          6632 non-null object
NroLegislativo      6632 non-null object
dtypes: object(10)
memory usage: 569.9+ KB


wordcloud = WordCloud().generate(' '.join(autores_atuais['Ementa']))
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

enter image description here

请问,我如何在云中忽略某些单词?例如,小单词(“的”,“奥”)和特定单词(“Estado”)

3个回答

4
我想您正在使用amueller的wordcloud模块?如果是这样,那么有一个stopwords参数,可以让您指定一个包含要排除的单词的文件。
例如,如果您创建了一个名为stopwords.txt的文本文件,并将其保存在与csv文件相同的文件夹中,并将其包含以下内容:
de
ao
Estado

然后改为:

wordcloud = WordCloud(stopwords='stopwords.txt').generate(' '.join(autores_atuais['Ementa']))
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

这些词应该被正确地排除。默认的排除词集包含在模块文件夹中,应该被称为stopwords。如果您经常遇到相同的问题,修改此默认文件可能会有所帮助。

你也可以从 nltk 包中导入停用词列表。他们提供了许多语言的停用词列表。如果你只需要停用词,那么 nltk 包可能有些过于复杂,但如果你会在其他方面使用它,那么它可能会很有用。 - Silenced Temporarily
谢谢@asongtoruin。但是一些单词仍然会出现。看起来命令理解当某些单词连在一起时,它们必须被计算,或者它们的组合使它们变得不同(比如"da Constituição","do Estado","Constituição do")。这些都是巴西葡萄牙语中的词汇。可能是这个原因吗? - Reinaldo Chaves
抱歉,我现在才看到您的下方评论。 - Reinaldo Chaves

3
为了删除短词(比如说,两个字符或更少),您可以使用以下方法:
autores_atuais = autores_atuais[autores_atuais.Ementa.str.len() <= 2]

为了从列表中删除单词(例如 restricted = ['Estado']),您可以使用以下代码:
autores_atuais = autores_atuais[~autores_atuais.Ementa.isin(restricted)]

1
我认为需要使用带有~布尔索引来反转条件,使用isin过滤单词列表,并使用str.len按单词长度进行过滤,必要时可以通过|链接条件。请注意保留HTML标签。
autores_atuais = pd.DataFrame({'Ementa':['Estado','another','be','de','def','bax']})

print (autores_atuais)
    Ementa
0   Estado
1  another
2       be
3       de
4      def
5      bax

m1 = autores_atuais['Ementa'].isin(['Estado','another','next'])
m2 = autores_atuais['Ementa'].str.len() < 3

s = autores_atuais.loc[~(m1 | m2), 'Ementa']
print (s)
4    def
5    bax
Name: Ementa, dtype: object

使用&代替AND,用~表示第一个条件的相反条件,用>=表示第二个条件:

m1 = ~autores_atuais['Ementa'].isin(['Estado','another','next'])
m2 = autores_atuais['Ementa'].str.len() >= 3

s = autores_atuais.loc[m1 & m2, 'Ementa']
print (s)
4    def
5    bax
Name: Ementa, dtype: object

wordcloud = WordCloud().generate(' '.join(s))

谢谢。但是使用这个方法生成的词云是以列名而不是“Ementa”列中的单词为基础创建的。 - Reinaldo Chaves
看起来m1和m2从数据框中排除了所有包含这些单词的行。 - Reinaldo Chaves
再次感谢您。我这样做了:m1 = ~autores_atuais['Ementa'].isin(['宪法','规定','宪法', '条款']) m2 = autores_atuais['Ementa'].str.len() >= 2 - Reinaldo Chaves
sobra = autores_atuais.loc[m1 & m2, 'Ementa'] - Reinaldo Chaves
我觉得他并没有排除所有的单词。 - Reinaldo Chaves
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接