【问题标题】:Some NLP stuff to do with grammar, tagging, stemming, and word sense disambiguation in Python一些与 Python 中的语法、标记、词干和词义消歧有关的 NLP 内容
【发布时间】: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' 也是合理变形的可能性。

分解任务

  1. 标记词性、复数、时态等——原始输入。注意这一点可能有助于从多种可能性中进行选择(即,如果用户输入了'having' 而不是其他时态,那么在 had/have/have 之间进行选择可能比随机更直接)。我听说斯坦福 POS 标记器很好,它在 NLTK 中有一个实现。我不确定如何在这里处理紧张检测。
  2. 考虑上下文以排除语法上特殊的可能性。考虑最后几个单词及其词性标签(和时态?),以及句子边界(如果有的话),然后从那里删除没有意义的事情。在'The sprites' 之后,我们不想要另一篇文章(或限定词,据我所知),也不需要形容词,但副词或动词可以工作。将当前内容与标记语料库(和/或马尔可夫链?)中的序列进行比较 - 或咨询语法检查功能 - 可以为此提供解决方案。
  3. 从剩余的可能性中选择一个词(那些可以明智地变化的词)。这不是我需要回答的问题——我有我的方法。假设它是随机选择的。
  4. 根据需要转换所选单词。如果来自 #1 的信息可以被折叠(例如,也许“pluralize”标志设置为 True),那么就这样做。如果有多种可能性(例如,选择的单词是动词,但可能有几种时态),则随机选择。无论如何,我都需要对这个词进行变形/变形。

我正在寻找有关此例程合理性的建议,以及有关添加步骤的建议。进一步分解这些步骤的方法也会有所帮助。最后,我正在寻找有关哪种工具可以最好地完成每项任务的建议。

【问题讨论】:

  • 您是否考虑过使用 n-gram 语言模型而不是词性标注器?当您想以编程方式从一组选项中挑选流利的文本时,它们通常在 NLP 系统中用于机器翻译或语音到文本,给定一些以前的历史。
  • @rrenaud n-gram language 模型在 MT 中与 alignment 模型(最简单的是统计噪声通道模型)结合以选择词序时很有价值.在这种情况下,我怀疑来自 nltk 或斯坦福 POS 标记器的解析树会更有价值。 Michael,看看一些简单的单词对齐模型可能是值得的,当它们与一个体面的语言模型结合使用时,可以在相当大的比例(比如 80-90% 左右)正确处理时态/复数。
  • @eowl 我应该移动/复制问题吗?我不确定协议是什么...... NLP 堆栈站点是一个令人兴奋的想法 :)

标签: python nlp grammar tagging nltk


【解决方案1】:

我认为上面关于 n-gram 语言模型的评论比解析和标记更符合您的要求。解析器和标注器(除非经过修改)将受到目标词缺乏正确上下文的影响(即,您在查询时没有可用的其余句子)。另一方面,语言模型有效地考虑过去(左上下文),特别是对于最多 5 个单词的窗口。 n-gram 的问题在于它们不能模拟长距离依赖(超过 n 个单词)。

NLTK 有一个语言模型:http://nltk.googlecode.com/svn/trunk/doc/api/nltk.model.ngram-pysrc.html。标签词典可以帮助您更加平滑模型。

我看到的步骤: 1. 从用户那里获取一组词。 2. 创建一个更大的一组所有可能的词变化。 3. 询问模型哪个变形词最有可能。

【讨论】:

  • 好的,我怀疑 n-gram 最适合像这样的小窗口预测,但希望得到确认。听起来不错。现在,我知道平滑将有助于零频率词。但我可能会有很多零频词。一个可能的解决方案:为我的正常单词语料库制作一个替代语料库,其中所有单词都被替换为标签(如 POS),当我遇到零频率单词时,退避到基于 'POS 的 n-gram 模型语料库?因此,如果确切的顺序未知,也许可以选择一个可能的语法结构。有什么想法吗?
  • 如何知道生词的词性?词形特征可能会有所帮助(*ly 是副词,*ies 可能是动词),但我还不会太担心。先建立一个原型,以后再担心潜在的问题。
  • 那里有非常好的英语词典。你认为哪些词会丢失?专有名词?古英语?
  • 好吧,我想我可以从著名诗歌的文本中制作自己的 n-gram 语料库(我打算在古腾堡计划的“诗歌”部分中获取前几百个文件),而不是而不是散文语料库。我认为用户可能会输入创建在语料库中找不到的序列的单词。我的语料库不知道的词可能还被 POS 标注器知道,因此如有必要,它们可以被简化为 POS 状态。无论如何,我将首先构建一个忽略这些情况的原型,好点!
猜你喜欢
  • 2011-04-11
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 2014-08-11
  • 2015-04-20
  • 2011-06-04
  • 1970-01-01
  • 2015-02-09
相关资源
最近更新 更多