【发布时间】:2012-01-22 09:49:48
【问题描述】:
背景(TLDR;为完成而提供)
就奇怪需求的最佳解决方案寻求建议。 我是大学四年级的(文学)学生,只有我自己的编程指导。我对 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
现在假设,它需要打印 4 个可能的下一个单词/同义词中的 1 个:['departure', 'to have', 'blue', 'quick']。在我看来,'blue' 应该被丢弃; 'The sprites blue' 在语法上似乎很奇怪/不太可能。从那里它可以使用这些动词中的任何一个。
如果它选择'to have',则结果可能会明显地变形为'had'、'have'、'having'、'will have'、'would have' 等(但不是'has')。 (生成的行类似于'The sprites have' 并且经过合理调整的结果将为未来的结果提供更好的背景......)
我希望'depature' 在这种情况下是一个有效的可能性;虽然'The sprites departure' 没有意义(它不是"sprites'"),但'The sprites departed'(或其他动词变位)会。
看似'The sprites quick' 没有意义,但'The sprites quickly [...]' 或'The sprites quicken' 之类的东西可以,所以'quick' 也是合理变形的可能性。
分解任务
-
标记词性、复数、时态等——原始输入。注意这一点可能有助于从多种可能性中进行选择(即,如果用户输入了
'having'而不是其他时态,那么在 had/have/have 之间进行选择可能比随机更直接)。我听说斯坦福 POS 标记器很好,它在 NLTK 中有一个实现。我不确定如何在这里处理紧张检测。 -
考虑上下文以排除语法上特殊的可能性。考虑最后几个单词及其词性标签(和时态?),以及句子边界(如果有的话),然后从那里删除没有意义的事情。在
'The sprites'之后,我们不想要另一篇文章(或限定词,据我所知),也不需要形容词,但副词或动词可以工作。将当前内容与标记语料库(和/或马尔可夫链?)中的序列进行比较 - 或咨询语法检查功能 - 可以为此提供解决方案。 - 从剩余的可能性中选择一个词(那些可以明智地变化的词)。这不是我需要回答的问题——我有我的方法。假设它是随机选择的。
- 根据需要转换所选单词。如果来自 #1 的信息可以被折叠(例如,也许“pluralize”标志设置为 True),那么就这样做。如果有多种可能性(例如,选择的单词是动词,但可能有几种时态),则随机选择。无论如何,我都需要对这个词进行变形/变形。
我正在寻找有关此例程合理性的建议,以及有关添加步骤的建议。进一步分解这些步骤的方法也会有所帮助。最后,我正在寻找有关哪种工具可以最好地完成每项任务的建议。
【问题讨论】:
-
您是否考虑过使用 n-gram 语言模型而不是词性标注器?当您想以编程方式从一组选项中挑选流利的文本时,它们通常在 NLP 系统中用于机器翻译或语音到文本,给定一些以前的历史。
-
@rrenaud n-gram language 模型在 MT 中与 alignment 模型(最简单的是统计噪声通道模型)结合以选择词序时很有价值.在这种情况下,我怀疑来自 nltk 或斯坦福 POS 标记器的解析树会更有价值。 Michael,看看一些简单的单词对齐模型可能是值得的,当它们与一个体面的语言模型结合使用时,可以在相当大的比例(比如 80-90% 左右)正确处理时态/复数。
-
@eowl 我应该移动/复制问题吗?我不确定协议是什么...... NLP 堆栈站点是一个令人兴奋的想法 :)
标签: python nlp grammar tagging nltk