当前位置: 首页 > 面试题库 >

在python中有效地计算单词频率

闻人志
2023-03-14
问题内容

我想计算一个文本文件中所有单词的频率。

>>> countInFile('test.txt')

{'aaa':1, 'bbb': 2, 'ccc':1}如果目标文本文件如下所示,则应返回:

# test.txt
aaa bbb ccc
bbb

在一些帖子之后,我已经用纯python实现了它。但是,我发现由于巨大的文件大小(>
1GB),纯python方法是不够的。

我认为借用sklearn的能力是一个候选人。

如果让CountVectorizer为每一行计数频率,我想您将通过累加每一列来获得字频率。但是,这听起来有点间接。

用python计算文件中单词的最有效,最直接的方法是什么?

更新资料

我的代码(很慢)在这里:

from collections import Counter

def get_term_frequency_in_file(source_file_path):
    wordcount = {}
    with open(source_file_path) as f:
        for line in f:
            line = line.lower().translate(None, string.punctuation)
            this_wordcount = Counter(line.split())
            wordcount = add_merge_two_dict(wordcount, this_wordcount)
    return wordcount

def add_merge_two_dict(x, y):
    return { k: x.get(k, 0) + y.get(k, 0) for k in set(x) | set(y) }

问题答案:

最简洁的方法是使用Python提供的工具。

from future_builtins import map  # Only on Python 2

from collections import Counter
from itertools import chain

def countInFile(filename):
    with open(filename) as f:
        return Counter(chain.from_iterable(map(str.split, f)))

而已。map(str.split, f)使生成器list从每一行返回s个单词。包装chain.from_iterable将其转换为单个生成器,一次生成一个单词。Counter接受一个可迭代的输入,并计算其中的所有唯一值。最后,您return是一个类似
dict对象(a Counter),用于存储所有唯一单词及其计数,并且在创建期间,您一次只存储一行数据和总计数,而不是一次存储整个文件。

从理论上讲,在Python
2.7和3.1上,您可以自己更好地循环使用链结结果,并使用dictcollections.defaultdict(int)进行计数(因为Counter在Python中实现,在某些情况下会使其变慢),但让Counter工作更简单以及更多自我记录(我的意思是,整个目标都在计算,因此请使用Counter)。除此之外,在CPython(参考解释器)3.2和更高版本上,Counter还具有C级加速器,用于对可迭代的输入进行计数,其运行速度比纯Python中编写的任何代码都要快。

更新: 您似乎想删除标点符号并且不区分大小写,所以这是我以前的代码的一种变体,它可以做到:

from string import punctuation

def countInFile(filename):
    with open(filename) as f:
        linewords = (line.translate(None, punctuation).lower().split() for line in f)
        return Counter(chain.from_iterable(linewords))

你的代码的运行速度要慢得多,因为它创建和销毁许多小型Counterset对象,而不是.update-ing单Counter每行(其中,而稍比我在更新的代码块给速度较慢,至少会在比例因子算法类似的一次)。



 类似资料:
  • 问题内容: 我有一个具有以下格式的.txt文件, 尽管显然它要大得多,但实际上是这样。基本上,我试图总结每个单独字符串在文件中的次数(每个字母/字符串在单独的一行上,因此从技术上讲文件是C \ nV \ nEH \ n等。但是,当我尝试将这些文件转换为列表,然后使用count函数时,它会分离出字母,以使诸如’IRQ’之类的字符串为[‘\ n’I’,’R’ ,’Q’,’\ n’],这样当我计算它时,

  • 问题内容: 到目前为止,我的代码是这样的: 我想添加一个代码,该代码可以计算来自模式(此路径中的42个txt文件)中的唯一单词,但我不知道该怎么做。有谁能够帮助我? 问题答案: 在Python中计算对象的最佳方法是使用为此目的而创建的类。它的行为类似于Python字典,但计数时使用起来稍微容易一些。您只需传递对象列表,它就会自动为您计数。 Counter也有一些有用的方法,例如most_commo

  • 问题内容: 我必须使用python计算文本中的单词频率。我想到将单词保留在字典中,并对每个单词进行计数。 现在,如果我必须根据出现次数对单词进行排序。我可以使用相同的词典来代替使用具有键作为计数和单词数组作为值的新词典吗? 问题答案: 您可以使用相同的字典: 第二行显示: 如果只需要排序的单词列表,请执行以下操作: 该行打印:

  • 问题内容: 我正在编写一个非常基本的Java程序,该程序可以计算句子中每个单词的频率,到目前为止,我设法做到了这一点 我已经提取了每个字符串并将其存储在数组中,现在的问题实际上是如何计算每个“单词”重复出现的次数以及如何显示以使重复的单词不会多次显示,您能帮我这个忙吗?一个? 问题答案: 使用以单词为键的地图并将其计为值,像这样 如果不允许使用java.util,则可以使用一些排序算法对arr进行

  • 问题内容: 我有以下代码。我知道我可以使用函数过滤掉少于频率计数的搭配。但是,在决定设置过滤频率之前,我不知道如何获取文档中所有n- gram元组(在我的情况下为bi-gram)的频率。如您所见,我正在使用nltk搭配类。 问题答案: 该功能有效

  • 问题内容: 我试图加快我的项目以计算单词频率的速度。我有360多个文本文件,我需要获取单词的总数以及另一个单词列表中每个单词出现的次数。我知道如何使用单个文本文件执行此操作。 要获得“通货膨胀”,“工作”,“产出”个体的频率过于繁琐。我可以将这些单词放入列表中并同时查找列表中所有单词的出现频率吗?基本上,这与Python。 示例:代替此: 我想这样做(我知道这不是真实的代码,这是我在寻求帮助的内容