关于Python中的语法、标注、词干提取和词义消歧的NLP内容
背景(简要说明)
寻求对一个奇怪需求的最佳解决方案的建议。 我是一名大四的文学专业学生,编程方面主要靠自己摸索。我对Python有一定的了解,通常能顺利实现找到的解决方案,但由于我还是个新手,所以希望能得到一些关于如何处理这个特殊问题的建议。
已经在使用NLTK,但用法与NLTK书中的例子不同。 我已经在使用NLTK的很多功能,特别是WordNet,所以这些内容对我来说并不陌生。我也读过大部分的NLTK书。
我正在处理片段化的语言。 用户输入单词和句子片段,我使用WordNet来寻找输入之间的联系,并生成新的单词和句子/片段。我的问题是如何将WordNet中的一个未变形的单词(一个同义词集)转换成在上下文中有意义的内容。
问题:如何以语法上合理的方式进行变形? 如果没有任何语法处理,结果只是一个可以查字典的单词列表,单词之间没有一致性。我的应用程序的第一步是根据上下文对根词进行词干提取/复数化/动词变位/变形。(我说的“根词”是来自WordNet的同义词集和/或它们的可读人类等价物。)
示例场景
假设我们有一段诗,用户正在向其中添加新的输入。新的结果需要以语法上合理的方式进行变形。
The river bears no empty bottles, sandwich papers,
Silk handkerchiefs, cardboard boxes, cigarette ends
Or other testimony of summer nights. The sprites
假设现在需要从四个可能的下一个单词/同义词集中选择一个:['departure', 'to have', 'blue', 'quick']
。我觉得'blue'
应该被丢弃;'The sprites blue'
在语法上听起来很奇怪。从这里可以使用这两个动词中的任何一个。
如果选择'to have'
,结果可以合理地变形为'had'
、'have'
、'having'
、'will have'
、'would have'
等(但不是'has'
)。结果的句子可能是'The sprites have'
,而合理变形的结果将为未来的结果提供更好的上下文……
我希望'departure'
在这种情况下是一个有效的选择;虽然'The sprites departure'
没有意义(不是"sprites'"
),但'The sprites departed'
(或其他动词变位)是有意义的。
看起来'The sprites quick'
没有意义,但像'The sprites quickly [...]'
或'The sprites quicken'
可能是合理的,所以'quick'
也是一个可以合理变形的选项。
任务分解
- 标记词性、复数、时态等。 -- 对原始输入进行标记。注意这些信息可以帮助从多个可能性中进行选择(例如,如果用户输入了
'having'
而不是其他时态,选择had/have/having可能会更有针对性,而不是随机选择)。我听说斯坦福的词性标注器很好,它在NLTK中有实现。我不太确定如何处理时态检测。 - 考虑上下文以排除语法上奇怪的可能性。 考虑最后几个单词及其词性标记(和时态?),以及句子边界(如果有的话),从中排除那些没有意义的选项。在
'The sprites'
之后,我们不想再出现另一个冠词(或限定词,按我所知),也不想要形容词,但副词或动词可能合适。将当前内容与标记语料库中的序列(和/或马尔可夫链?)进行比较,或者咨询语法检查功能,可能会提供解决方案。 - 从剩余的可能性中选择一个单词(那些可以合理变形的)。这不是我需要答案的地方——我有自己的方法。假设是随机选择。
- 根据需要变换所选单词。如果可以结合第1步的信息(例如,可能“复数”标记被设置为True),就这样做。如果有多个可能性(例如,选中的单词是动词,但有几种时态可选),随机选择。无论如何,我都需要对单词进行变形/变化。
我希望能得到对这个流程的合理性建议,以及添加步骤的建议。进一步细分这些步骤的方法也会很有帮助。最后,我希望能得到关于每个任务最合适的工具的建议。
1 个回答
我觉得上面的评论关于n-gram语言模型更符合你的需求,而不是解析和标记。解析器和标记器(除非经过修改)在处理目标词时会缺乏正确的上下文(也就是说,在查询时你没有句子的其余部分)。另一方面,语言模型能有效地考虑过去的内容(左侧上下文),特别是对于最多5个单词的窗口。n-gram的一个问题是,它们无法处理长距离的依赖关系(超过n个单词)。
NLTK有一个语言模型:http://nltk.googlecode.com/svn/trunk/doc/api/nltk.model.ngram-pysrc.html。一个标签词典可能会帮助你让模型更平滑。
我认为的步骤是:1. 从用户那里获取一组单词。2. 创建一个包含所有可能变化形式的更大单词集合。3. 询问模型哪个变化形式的单词最有可能。