如何计算语料库中看不见的二元组(用于良好图灵平滑)

数据挖掘 nlp
2022-03-05 04:09:23

考虑一个(有点荒谬的)句子 - “我看到看到看到看到”

观察到的二元组将是:“我看到了”

“见见”

“看到了”

和,

“一见”。

我的目标是通过使用 Good-Turing 平滑来平滑二元概率的概率质量。为此,我需要找到看不见的二元组的计数,即频率计数为 0 的二元组。

我该怎么做呢?

1)这是否是使用 2 个不连续单词形成的所有二元组的列表?例如,“我看到了”、“看到了”、“我看到了”等?

2) 相同单词的重复是否会包含在双元组中?例如。“我我”、“见见”等?

2个回答

我只记得我们创建了一个表格,其中包含所有可能的单词作为每一行和每一列的标题。结果,所有二元组的列表将是通过连接任何两个单词形成的所有可能的二元组。

Bi-grams 是词汇表中两个标记的所有可能的唯一排列,假设词汇表是语料库中所有标记的集合。

这是计算看不见的二元组计数的 Python 代码:

from itertools import permutations

corpus = "I see saw a see saw"
tokens = corpus.split()
vocab = set(tokens)
all_bigrams = set(permutations(vocab, r=2))
observed_bigrams = {(t_1, t_2) for t_1, t_2 in zip(tokens, tokens[1:])}
count_of_unobserved_bigrams = len(all_bigrams) - len(observed_bigrams)
print(f"The count of unobserved bigrams: {count_of_unobserved_bigrams}")