创建包含列表中所有单词的bigram列表

2024-10-01 02:32:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在一个列表中的所有单词之间创建bigram。我可以用单词+顺流来创造双字组。但我不能把一个词和名单上的其他词结合起来

脚本:

countries = ['france', 'brazil', 'usa', 'uk', 'canada', 'mexico', 'angola']

countries_bigrams = zip(*[countries[i:] for i in range(2)])

print(list(countries_bigrams))

我的输出:

[('france', 'brazil'), ('brazil', 'usa'), ('usa', 'uk'), ('uk', 'canada'), ('canada', 'mexico'), ('mexico', 'angola')]

良好输出:

[('france', 'brazil'), ('france', 'usa'), ('france', 'uk'), ('france', 'canada'), ('france', 'mexico'), ('france', 'angola'), ('brazil', 'france'), ('brazil', 'usa'), ('brazil', 'uk'), ('brazil', 'canada'), ('brazil', 'mexico'), ('brazil', 'angola'), ...]


Tags: 列表单词countriesbrazilukbigram名单mexico
3条回答

可以使用^{}获取列表本身的Cartesian product,并使用列表理解删除重复值的元组:

from itertools import product

countries_bigrams = [(x, y) for x, y in product(countries, repeat=2) if x != y]

print(countries_bigrams)

输出:

[('france', 'brazil'), ('france', 'usa'), ('france', 'uk'), ('france', 'canada'), ('france', 'mexico'), ('france', 'angola'), ('brazil', 'france'), ('brazil', 'usa'), ('brazil', 'uk'), ('brazil', 'canada'), ('brazil', 'mexico'), ('brazil', 'angola'), ('usa', 'france'), ('usa', 'brazil'), ('usa', 'uk'), ('usa', 'canada'), ('usa', 'mexico'), ('usa', 'angola'), ('uk', 'france'), ('uk', 'brazil'), ('uk', 'usa'), ('uk', 'canada'), ('uk', 'mexico'), ('uk', 'angola'), ('canada', 'france'), ('canada', 'brazil'), ('canada', 'usa'), ('canada', 'uk'), ('canada', 'mexico'), ('canada', 'angola'), ('mexico', 'france'), ('mexico', 'brazil'), ('mexico', 'usa'), ('mexico', 'uk'), ('mexico', 'canada'), ('mexico', 'angola'), ('angola', 'france'), ('angola', 'brazil'), ('angola', 'usa'), ('angola', 'uk'), ('angola', 'canada'), ('angola', 'mexico')]

请注意,这并不是得到bigrams,您原来的方法已经得到了bigrams

您可以简单地使用列表理解:

[(c1, c2) for c1 in countries for c2 in countries if c1 != c2]

输出:

[('france', 'brazil'),
 ('france', 'usa'),
 ('france', 'uk'),
 ('france', 'canada'),
 ('france', 'mexico'),
 ('france', 'angola'),
 ('brazil', 'france'),
 ('brazil', 'usa'),
 ('brazil', 'uk'),
 ('brazil', 'canada'),
 ('brazil', 'mexico'),
 ('brazil', 'angola'),
 ('usa', 'france'),
 ('usa', 'brazil'),
 ('usa', 'uk'),
 ('usa', 'canada'),
 ('usa', 'mexico'),
 ('usa', 'angola'),
 ('uk', 'france'),
 ('uk', 'brazil'),
 ('uk', 'usa'),
 ('uk', 'canada'),
 ('uk', 'mexico'),
 ('uk', 'angola'),
 ('canada', 'france'),
 ('canada', 'brazil'),
 ('canada', 'usa'),
 ('canada', 'uk'),
 ('canada', 'mexico'),
 ('canada', 'angola'),
 ('mexico', 'france'),
 ('mexico', 'brazil'),
 ('mexico', 'usa'),
 ('mexico', 'uk'),
 ('mexico', 'canada'),
 ('mexico', 'angola'),
 ('angola', 'france'),
 ('angola', 'brazil'),
 ('angola', 'usa'),
 ('angola', 'uk'),
 ('angola', 'canada'),
 ('angola', 'mexico')]

您需要计算大小2的组合。一个好方法是使用itertools

import itertools
countries = ['france', 'brazil', 'usa', 'uk', 'canada', 'mexico', 'angola']
list(itertools.combinations(countries, 2))

作为输出:

[('france', 'brazil'),
 ('france', 'usa'),
 ('france', 'uk'),
 ('france', 'canada'),
 ('france', 'mexico'),
 ('france', 'angola'),
 ('brazil', 'usa'),
 ('brazil', 'uk'),
 ('brazil', 'canada'),
 ('brazil', 'mexico'),
 ('brazil', 'angola'),
 ('usa', 'uk'),
 ('usa', 'canada'),
 ('usa', 'mexico'),
 ('usa', 'angola'),
 ('uk', 'canada'),
 ('uk', 'mexico'),
 ('uk', 'angola'),
 ('canada', 'mexico'),
 ('canada', 'angola'),
 ('mexico', 'angola')]

我认为这是一个更快的方法,我比较了我的机器的性能:

%%timeit
list(itertools.combinations(countries, 2))

大约需要1.28µs码

%%timeit
[(c1, c2) for c1 in countries for c2 in countries if c1 != c2]

大约需要4.81µs码

%%timeit
countries_bigrams = [(x, y) for x, y in product(countries, repeat=2) if x != y]

大约5.81µs码

相关问题 更多 >