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
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.