我目前正在努力实现自己的英语语言处理库。真正的挑战是阅读所有丰富的理论材料,并充分了解如何将其全部置于生产轨道上。
到目前为止,我已经取得了一些进展。我实现了句尾检测器和早期解析器。但事实是,除非我在终端词典中包含解析器无法识别的特定单词并构建图表。
为了更明确,请查看我的 CFGrammar 的以下示例:
Production[] ppTerminals = { new Production(new Word[] { new Terminal("Preposition"), new NonTerminal("NP") })};
AddProduction(ppTerminal, "PP"); // Add production
...
DictionaryBuilder(Prepositions.SingleWord, "Preposition"); //Where
Prepositions.SingleWord is a hard-coded list of possible prepositions.
结果,如果 Earley 解析器遇到,比如说,未知的两个单词 PP,例如“up to”,它将无法识别它并构建图表。
所以我认为在语法解析器之前我需要其他东西来处理我的句子,然后将相关数据转发给解析器。主要思想是在词性标注阶段动态建立字典,然后Earley解析器可以识别一个单词。
我实现了分词器和词法分析器。作为输出,我得到了 S-Expression 树,例如:
(sentence
(word BOND)
(word TRADING)
(word REVENUES)
(word AT)
(word GOLDMAN)
(word SACHS)
(word SLID)
(value 40%)
...
(word AND)
(word CURRENCIES)
(word WAS)
(currency $1.16BN)
...
)
但我熟悉隐马尔可夫模型和诸如用于查找最可能状态序列的 Viterbi 算法和用于参数估计的 Baum-Welch 算法之类的算法。
您能否给我一些建议,如何将 Earley 解析器和基于 HMM 的 POS 标记链接在一起。或者,很可能,我走错了方向,所以请指出我错在哪里。现在我有点困惑。谢谢!