我有一个字符串列表的语料库:
corpus = ["Hello I am Sam", "This is a white desk","I ate cereals", ...]
我想在这个语料库上建立一个语言模型(最好使用 nltk),以获得一个单词在一个句子中的概率。所以,我以后的用法是得到
P(“山姆”|“我是”)
在这个语料库中。我找不到 - 最好的方法是什么?如何训练一个 ngram 模型,然后得到这样的概率?
谢谢!
我有一个字符串列表的语料库:
corpus = ["Hello I am Sam", "This is a white desk","I ate cereals", ...]
我想在这个语料库上建立一个语言模型(最好使用 nltk),以获得一个单词在一个句子中的概率。所以,我以后的用法是得到
P(“山姆”|“我是”)
在这个语料库中。我找不到 - 最好的方法是什么?如何训练一个 ngram 模型,然后得到这样的概率?
谢谢!
我建议使用马尔可夫链https://en.wikipedia.org/wiki/Markov_chain
非常琐碎的例子供您参考。
假设您要分析 1-gram。
分析文本:
monkey eats banana
dog eats bone
一元组:monkey
, eats
, banana
, dog
, bone
, BEGIN
, END
.
每个句子都从开头开始。
可以进行两种转换:
BEGIN->monkey
BEGIN->dog
这意味着该句子有 50% 的机会以monkey
.
现在在monkey
有 100% 的转换机会之后(因为在分析的文本monkey->eats
中没有其他转换。monkey->*
现在之后eats
有 50% 的机会banana
和 50% 的机会bone
。
因此,通常使用此模型,我们可以生成以下句子:
monkey eats banana
monkey eats bone
dog eats bone
dog eats banana
每一个都有 25% 要生产
请注意,骨头和香蕉总是转换为END
使用 digrams,您只需将其拆分为monkey eats
->banana END
这只是简化的大图,希望对您有所帮助
编辑
至于评论中提到的平滑,请使用拉普拉斯。
假设您确实比我们实际看到的每个单词多一个。
因此,例如,现在我们将拥有:
eats bone (2)
eats banana (2)
eats chocolate (1)
eats dog (1)
当然,在这种情况下,我们的数据集非常小,但对于更大的数据集,您会得到如下信息:
eats bone (104)
eats banana (1031)
eats chocolate (1)
eats dog (3)
...