我目前正在努力实施自己的英语语言处理库。真正的挑战是要经历所有丰富的理论材料,并获得如何将其全部放在生产轨道上的重要性。
到目前为止,我已经取得了一些进展。我实现了句末句检测器和早期解析器。但事实是,除非我在终端字典中包含解析器无法识别它并构建图表的特定单词。
为了更明确,请查看我的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就像"直到"它将无法识别并构建图表。
所以我认为在语法分析器之前我需要其他东西来处理我的句子,然后将相关数据转发给解析器。主要思想是词典在POS标记阶段动态构建,然后Earley解析器可以识别单词。
我实现了tokenizer和词法分析器。作为输出,我有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算法用于参数估计。
请您给我一些建议如何将基于HMM的Earley解析器和POS标记链接在一起。或者,可能,我的方向是错误的,所以请指出我错误的地方。现在我有点困惑。谢谢!