【发布时间】:2020-09-05 02:56:23
【问题描述】:
我正在处理一个以标记/单词列表形式存在的大型语料库。语料库包含约 1900,000 个单词,我运行了一个代码来获取最常用的单词,现在语料库有 140,000 个单词。
我想删除出现在文档中超过 95% 且不到 5% 的单词
语料库样本
['problems', 'guess', 'sleep', 'holy']
首先我找到了最常用的词
from nltk.probability import FreqDist
corpus_frequency = FreqDist(corpus)
corpus_commom=corpus_frequency.most_common()
然后,我应用这个 for 循环来查找出现率超过 95% 的单词列表
most_frequent=[mytuple for mytuple in corpus_commom if mytuple[1]<len(corpus*95)/100]
但是这段代码运行时间很长,而且没有返回任何输出。
我也尝试遵循我找到的一些答案并应用 CountVectorizer 但我收到一条错误消息
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer(min_df=0.05, max_df=0.95, lowercase=True)
X = cv.fit_transform(corpus)
错误信息
ValueError: After pruning, no terms remain. Try a lower min_df or a higher max_df.
更新
如果我这样做,CountVectorizer 就可以工作
cv = CountVectorizer(corpus,max_df=0.95)
count_vector=cv.fit_transform(corpus)
但它返回一个数字列表。我希望输出是我的语料库(单词列表)过滤。
谁能告诉我如何实现这一目标?谢谢
【问题讨论】:
-
这看起来不对:
if mytuple[1]<len(corpus*95)/100。应该是:if mytuple[1]<len(corpus)*0.95 -
感谢您的来信。它只是将数字更改为最接近的值。
-
您对 CountVectorizer 的调用看起来不错,因此您的语料库有问题。您可以尝试制作一个包含 10 个文档的小型语料库并确保它有效。另外,为了确认您的语料库看起来没问题,
print(corpus[0])的输出是什么? -
@polm23 请找到我添加到主题的更新
-
@leena:你似乎没有明白这一点。您的行
len(corpus*95)/100将您的语料库乘以 95 倍;它实际上有您的语料库的 95 个副本。那是您代码中的错误。将 95 移到len(corpus)之外。
标签: python for-loop text-processing