gpt4 book ai didi

python - 使用 Python 计算文件中的二元组(两个单词对)

转载 作者:IT老高 更新时间:2023-10-28 20:30:32 25 4
gpt4 key购买 nike

我想使用 python 计算文件中所有二元组(相邻单词对)的出现次数。在这里,我正在处理非常大的文件,因此我正在寻找一种有效的方法。我尝试在文件内容上使用带有正则表达式 "\w+\s\w+"的计数方法,但它并没有被证明是有效的。

例如假设我想计算文件 a.txt 中的二元组数,该文件具有以下内容:

"the quick person did not realize his speed and the quick person bumped "

对于上述文件,二元组及其计数将为:

(the,quick) = 2
(quick,person) = 2
(person,did) = 1
(did, not) = 1
(not, realize) = 1
(realize,his) = 1
(his,speed) = 1
(speed,and) = 1
(and,the) = 1
(person, bumped) = 1

我在 Python 中遇到了一个 Counter 对象的示例,它用于计算 unigrams(单个单词)。它还使用正则表达式方法。

示例如下:

>>> # Find the ten most common words in Hamlet
>>> import re
>>> from collections import Counter
>>> words = re.findall('\w+', open('a.txt').read())
>>> print Counter(words)

以上代码的输出是:

[('the', 2), ('quick', 2), ('person', 2), ('did', 1), ('not', 1),
('realize', 1), ('his', 1), ('speed', 1), ('bumped', 1)]

我想知道是否可以使用 Counter 对象来获取二元数。除了 Counter 对象或正则表达式之外的任何方法也将不胜感激。

最佳答案

一些 itertools 魔法:

>>> import re
>>> from itertools import islice, izip
>>> words = re.findall("\w+",
"the quick person did not realize his speed and the quick person bumped")
>>> print Counter(izip(words, islice(words, 1, None)))

输出:

Counter({('the', 'quick'): 2, ('quick', 'person'): 2, ('person', 'did'): 1, 
('did', 'not'): 1, ('not', 'realize'): 1, ('and', 'the'): 1,
('speed', 'and'): 1, ('person', 'bumped'): 1, ('his', 'speed'): 1,
('realize', 'his'): 1})

奖金

获取任意 n-gram 的频率:

from itertools import tee, islice

def ngrams(lst, n):
tlst = lst
while True:
a, b = tee(tlst)
l = tuple(islice(a, n))
if len(l) == n:
yield l
next(b)
tlst = b
else:
break

>>> Counter(ngrams(words, 3))

输出:

Counter({('the', 'quick', 'person'): 2, ('and', 'the', 'quick'): 1, 
('realize', 'his', 'speed'): 1, ('his', 'speed', 'and'): 1,
('person', 'did', 'not'): 1, ('quick', 'person', 'did'): 1,
('quick', 'person', 'bumped'): 1, ('did', 'not', 'realize'): 1,
('speed', 'and', 'the'): 1, ('not', 'realize', 'his'): 1})

这也适用于惰性迭代和生成器。因此,您可以编写一个生成器,它逐行读取文件,生成单词,然后将其传递给 ngarms 以懒惰地消耗,而无需读取内存中的整个文件。

关于python - 使用 Python 计算文件中的二元组(两个单词对),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12488722/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com