一些NLP与Python中的语法,标记,词干和词义消歧有关

dri*_*her 10 python tagging grammar nlp nltk

背景(TLDR;为完成而提供)

寻求针对奇怪要求的最佳解决方案的建议. 我是大学四年级的(文学)学生,只有我自己的编程指导.我对Python有足够的能力,我不会在实现我发现的解决方案(大部分时间)和开发它们时遇到麻烦,但是由于我的新意,我正在寻找有关解决这个特殊问题的最佳方法的建议.

已经使用NLTK,但与NLTK书中的示例不同.我已经在使用NLTK的很多东西了,特别是WordNet,所以这些材料对我来说并不陌生.我读过大部分的NLTK书.我更懂得如何处理,如果我试图分析现有的文本,或者目标文本是散文般的-但我的应用程序是专注于诗歌,特别是对即时构建诗意文本的基础上,不可预见的输入来自用户.

我正在使用零碎的原子语言.我的应用程序逐字移动:每轮,几个用户输入单词(每个用户一个单词).我的程序试图统一或组合这些输入词以产生单个输出词.我已经开发了字选择算法 - 它利用WordNet的各种功能来提出单字结果.结果是WordNet synset的形式 - 一个未反射的单词(剥离多个和紧张).结果被附加到"诗"的文本中(在一些空格之后).添加所产生的字会影响用户对什么词来扔进锅里下一个选择,那就是如何这个游戏/程序一起运动,在每次添加一个机器演变字的诗句.

问题:如何以语法合理的方式影响结果?没有任何语法处理,结果只是一个字典可搜索的单词列表,没有单词之间的协议.第一步是我的应用程序根据上下文来阻止/复数/共轭/变形根词.(我所说的"根词"是来自WordNet和/或其人类可读等同物的同义词.)想象一下,诗中已经有一些语法敏感的文本开始,我的应用程序需要反映一个新的结果 - 同意现有序列的词.如果它只是像一个3字的窗口或其他东西一样工作,这很好,但我正在寻找有关最佳操作顺序的建议.我希望有人可以给我一些指示(我希望它很难实现,但我想确保我从正确的想法开始).

示例场景(更少上下文更多问题)

让我们假设我们已经有了一首诗,用户正在向其中添加新的输入.新结果需要以语法合理的方式进行变换.

The river bears no empty bottles, sandwich papers,   
Silk handkerchiefs, cardboard boxes, cigarette ends  
Or other testimony of summer nights. The nymphs
Run Code Online (Sandbox Code Playgroud)

比方说,我的算法已经采取了一批从输入的用户,现在需要打印的4个可能接下来的话1 /同义集(非正式代表): ['departure', 'to have', 'blue', 'quick'].在我看来'blue'应该被抛弃; 'The nymphs blue'似乎语法奇怪/不太可能.从那里它可以使用这些动词中的任何一个.

如果它选择'to have'的结果可以被合理地活用为'had','have','having','will have','would have',等(但不包括'has').(由此产生的结果将是类似的'The nymphs have',明智的结果将为未来的结果提供更好的背景......)

'depature'在这种情况下,我希望成为一个有效的可能性; 虽然'The nymphs departure'没有意义(它不是"nymphs'"),'The nymphs departed'(或其他动词变形)会.

看似'The nymphs quick'没有意义,但是类似'The nymphs quickly [...]''The nymphs quicken'可能的东西,'quick'也是明智的变化的可能性.

打破任务

  1. 标记原始输入的词性,复数,时态等.注意到这一点可以帮助从几种可能性中进行选择(即,如果用户输入'having'而不是一些其他时态,则选择had/have/having之间的选择可能比随机选择更直接).我听说Stanford POS标签很好,它有一个NLTK的实现.我不知道如何在这里处理时态检测.
  2. 考虑上下文以排除语法上的特殊可能性.考虑最后几个单词和他们的词性标签(和时态?),以及句子边界(如果有的话),并从中删除那些没有意义的东西.在'The nymphs'我们不想要另一篇文章(或者我自己能说的确定者)之后,也不想要一个形容词,但是一个副词或动词可以起作用.当前的东西与标记语料库(和/或马尔可夫链?)中的序列的比较 - 或语法检查功能的咨询 - 可以为此提供解决方案.
  3. 从剩余的可能性中选择一个单词(那些可以合理地变形的单词).这不是我需要答案的东西 - 我有我的方法.让我们说它是随机选择的.
  4. 根据需要变换所选单词.如果可以折叠来自#1的信息(例如,可能将"pluralize"标志设置为True),请执行此操作.如果存在多种可能性(例如,拾取的单词是动词,但可能有几个时态),则随机选择.无论我是否需要在将其插入"诗"之前将其变形.

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

我尽量提供尽可能简洁的信息,同时提供足够的信息.请不要犹豫,请我澄清一下!我会感激我得到的任何信息,我会接受最清晰/最有启发性的答案:)谢谢!

cyb*_*org 5

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

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

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