当前位置: 首页 > 知识库问答 >
问题:

删除在Python语料库中出现超过x%的单词

万俟华辉
2023-03-14

我正在处理一个以标记/单词列表的形式出现的大型语料库。语料库包含约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)

但它会返回一个数字列表。我希望输出是我的语料库(单词列表)过滤。

有人能给我一个如何实现这一目标的建议吗?谢啦

共有2个答案

赫连开畅
2023-03-14

下面是一些计算列表中每个标记的频率分数的代码。您可以使用分数来执行筛选。

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

以下是如何使用它:

  1. 打开一个文件,用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%以上出现的单词的愿望可能不会返回任何有效答案。你应该画出单词的分布图,看看它们的数量是多少。

张通
2023-03-14

正如错误提示的那样,转换后没有术语剩余。也就是说,每个单词出现的比例大于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天。 在我的表中,我有一列包含如下日期:。