在python中计算bigram频率

时间:2017-10-06 18:28:20

标签: python

假设我有一个看起来像

的数据
['<s>', 'I' , '<s>', 'I', 'UNK', '</s>']

我想得到只发生一次的二元组号,所以

n1 == ('I', '<s>'), ('I', 'UNK'), ('UNK', '</s>')
len(n1) == 3 

和两次出现的二元组数

n2 == ('<s>', 'I')
len(n2) == 1

我正在考虑将第一个单词存储为sen [i],将下一个单词存储为sen [i + 1],但我不确定这是否是正确的方法。

2 个答案:

答案 0 :(得分:1)

考虑您的清单: -

lis = ['<s>', 'I' , '<s>', 'I', 'UNK', '</s>']

遍历列表以生成双字母组的元组并继续将它们的频率输入字典: -

bigram_freq = {}
length = len(lis)
for i in range(length-1):
    bigram = (lis[i], lis[i+1])
    if bigram not in bigram_freq:
        bigram_freq[bigram] = 0
    bigram_freq[bigram] += 1

现在,收集频率= 1和频率= 2的双字母,如下所示: -

bigrams_with_frequency_one = 0
bigrams_with_frequency_two = 0
for bigram in bigram_freq:
    if bigram_freq[bigram] == 1:
        bigrams_with_frequency_one += 1
    elif bigram_freq[bigram] == 2:
        bigrams_with_frequency_two += 1

你的结果是bigrams_with_frequency_one和bigrams_with_frequency_two。 我希望它有所帮助!

答案 1 :(得分:0)

你可以试试这个:

my_list = ['<s>', 'I' , '<s>', 'I', 'UNK', '</s>']

bigrams = [(l[i-1], l[i]) for i in range(1, len(my_list))]
print(bigrams)
# [('<s>', 'I'), ('I', '<s>'), ('<s>', 'I'), ('I', 'UNK'), ('UNK', '</s>')]

d = {}

for c in set(bigrams):
    count = bigrams.count(c)
    d.setdefault(count, []).append(c)

print(d)
# {1: [('I', '<s>'), ('UNK', '</s>'), ('I', 'UNK')], 2: [('<s>', 'I')]}