【问题标题】:How to train ngram model on my own corpus如何在我自己的语料库上训练 ngram 模型
【发布时间】:2018-11-28 13:51:54
【问题描述】:

我有一个字符串列表的语料库:

corpus = ["Hello I am Sam", "This is a white desk","I ate cereals", ...]

我想在这个语料库上建立一个语言模型(最好使用 nltk),来得到一个词在一个句子中的概率。 所以,我以后的用法就是get

P("山姆"| "我是")

在这个语料库中。 我找不到 - 最好的方法是什么?如何训练一个 ngram 模型,然后得到这样的概率?

谢谢!

【问题讨论】:

    标签: nlp nltk n-gram language-model trigram


    【解决方案1】:

    我会推荐使用马尔可夫链https://en.wikipedia.org/wiki/Markov_chain

    非常简单的例子供您参考。

    假设您要分析 1-gram。

    分析文本:

    monkey eats banana

    dog eats bone

    unigrams:monkeyeatsbananadogboneBEGINEND

    每个句子都以开头开头。

    可以进行两种转换:

    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% 需要生产

    注意bone 和banana 总是转换成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)
    ...
    

    【讨论】:

    • 为了我的需要,我需要使用 ngram - 问题是如何在收集频率后添加平滑?
    • 你可以使用拉普拉斯,这意味着这意味着每次出现 +1。答案已更新
    • 如何添加?只需为字典的每个条目添加 +1 即可?
    • 基本上是的 - 但您的参数不需要等于“1”。它可以是 0.21 或 3
    • 什么是最好的决定方式?
    猜你喜欢
    • 2019-09-19
    • 2018-08-04
    • 2020-08-08
    • 1970-01-01
    • 2011-03-10
    • 1970-01-01
    • 2021-04-26
    • 2017-07-31
    • 2021-03-25
    相关资源
    最近更新 更多