Hey all,
这是我目前的思路:
对输入的程序进行简单的词法分析
对上一步获得的每一个token进行统计,计算出给定某个token的条件下,这个程序属于某个语言的概率,即 P(lang | token)
P(lang | token) = P(token | lang) * P(lang) / P(token) n_token_on_lang(token, lang) n_lang_tokens(lang) n_token(token) = ------------------------------ * -------------------- / --------------- n_lang_tokens(lang) n_tokens() n_tokens() n_token_on_lang(token, lang) = ------------------------------ n_token(token)
获得了每一个token的概率后,计算他们的联合概率
P(lang | tok1, tok2, tok3...tokN) P(tok1, tok2, tok3...tokN | lang) * P(lang) = -------------------------------------------- P(tok1, tok2, tok3...tokN) (naively assume that tokens are independent from each other) P(tok1|lang) * P(tok2|lang) * P(tok3|lang) ... P(tokN|lang) * P(lang) = --------------------------------------------------------------------- P(tok1) * P(tok2) * P(tok3) ... P(tokN) P(tok|lang) P(lang|tok) ( ----------- = ----------- ) P(tok) P(lang) P(lang|tok1) * P(lang|tok2) * P(lang|tok3) ... P(lang|tokN) * P(lang) = --------------------------------------------------------------------- P(lang)^N
那么问题来了,通过我上面推导出来的公式计算发现,有些情况下联合概率算出来的结果是大于1的,不知道是我推导出错了,还是那个假设太naive的原因?不知道谁有相关经验,求助~~
目前简陋的实现在这里https://github.com/polyrabbit/polyglot


)