我正在处理一个以标记/单词列表的形式出现的大型语料库。语料库包含约1900000个单词,我运行了一个代码来获取最频繁的单词,现在语料库有140000个单词。
我想删除出现在文档中超过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]
但这段代码需要很长时间才能运行,并且不会返回任何输出。
我也试图按照一些答案我发现和应用CountVectorzer但我得到一个错误消息
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.
使现代化
如果我这样做,计数向量器就会工作
cv = CountVectorizer(corpus,max_df=0.95)
count_vector=cv.fit_transform(corpus)
但它会返回一个数字列表。我希望输出是我的语料库(单词列表)过滤。
有人能给我一个如何实现这一目标的建议吗?谢啦
下面是一些计算列表中每个标记的频率分数的代码。您可以使用分数来执行筛选。
import nltk
def get_frac_dist(token_list):
'''
Computes frequency count and fraction of individual words in a list.
Parameters
----------
token_list : list
List of all (non-unique) tokens from some corpus
Returns
-------
dict
Dictionary of { token, (count, fraction) } pairs.
'''
token_list = nltk.word_tokenize(content)
total_token_count = len(token_list)
freq_dict = nltk.FreqDist(token_list)
frac_dict = {}
for token, count in freq_dict.items():
frac_dict[token] = (count, count / total_token_count)
return frac_dict
以下是如何使用它:
nltk标记它。word_tokenize()
,并将令牌列表传递到get\u frac\u dist()
with open('speech.txt') as f:
content = f.read()
token_list = nltk.word_tokenize(content)
frac_dist = get_frac_dist(token_list)
i = 0
for k, v in frac_dist.items():
i += 1
if i > 10:
break
token = k
count = v[0]
frac = v[1]
print('%-20s: %5d, %0.5f' % (token, count, frac))
打印出:
President : 2, 0.00081
Pitzer : 1, 0.00040
, : 162, 0.06535
Mr. : 3, 0.00121
Vice : 1, 0.00040
Governor : 1, 0.00040
Congressman : 2, 0.00081
Thomas : 1, 0.00040
Senator : 1, 0.00040
Wiley : 1, 0.00040
l = [ (k, v[0], v[1]) for k, v in frac_dist.items() if v[1] > 0.04 ]
print(l)
打印出:
[(',', 162, 0.0653489310205728), ('and', 104, 0.04195240016135539), ('the', 115, 0.0463896732553449)]
请注意,您希望获得95%以上出现的单词的愿望可能不会返回任何有效答案。你应该画出单词的分布图,看看它们的数量是多少。
正如错误提示的那样,转换后没有术语剩余。也就是说,每个单词出现的比例大于95%或小于5%。例如:
corpus = ['This is a good sentence',
'This is a good sentence',
'This is a good sentence',
'This is a good sentence',
'This is a good sentence']
cv = CountVectorizer(min_df=0.05, max_df=0.95)
X = cv.fit_transform(corpus)
将引发相同的错误。但当你的语料库有1900000个单词时,这就没有意义了。也许您可以检查您的语料库是否是CountVectorizer
的有效参数。请参阅中的更多详细信息https://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.CountVectorizer.html .
我有一个有数千行的pd数据帧。每一行都包含一列标记为text\u processed的包含文本的列。这些文本可能很长,每行/文本数百个单词。现在我想消除95%行中出现的单词。我所做的是将所有文本连接到一个大字符串中,并标记该字符串。我现在有了所有课文中所有单词的词汇表。现在我想得到每个单词所在的行数。一种简单(且缓慢)的方法是循环每个单词,比较该单词是否存在于列中,并对结果求和以获得该单词所在的行
我已经根据日期yyyy-mm-dd对配置单元表进行了分区。我想每天运行一个脚本,可以删除所有超过30天的分区,但在这种情况下,我不想超过日期。我希望它采取系统日期和删除超过30天的分区。
请问我要实现一个多表删除的功能,通过dishID删除下面三张表中的相关记录,我下面的SQL问题在哪呢? 虽然我可以通过程序的逻辑解决这个问题,但是那样的话不够简洁,而且我相信一条SQL可以解决问题。 执行结果: 第三张表是空的,但是前两张表中的数据没有删除。 我做过的尝试: 希望获得的结果:
问题内容: 有时我会在使用svn时出错,并将文件夹卡在我的存储库中。我想删除这些文件夹,但是我找不到解决方法。请记住,我对SVN非常陌生。我从苹果终端运行此命令: 我收到消息: 我也试过,和。 我需要做什么? 问题答案: 看起来是必需的提交消息,并且您没有将系统配置为启动要添加一个编辑器的编辑器(未在命令行上指定)。 尝试这个:
问题内容: 我正在使用python进行数据清理练习,正在清理的文本包含我要删除的意大利语单词。我一直在网上搜索是否可以使用nltk之类的工具包在Python上执行此操作。 例如给出一些文本: 我想留下: 有人知道如何做到这一点吗?任何帮助将非常感激。 问题答案: 您可以使用NLTK的语料库: 不幸的是, 艾奥 恰好是一个英语单词。通常,可能很难确定一个单词是否为英语。
我正在尝试做一个Java线程,这个线程必须从一个MySQL数据库中删除所有的记录,超过7天。 在我的表中,我有一列包含如下日期:。