通过语法检查(Python)从一组可能性中选择最流畅的文本



一些背景

我是佛罗里达新学院的一名文学系学生,目前正在从事一个过于雄心勃勃的创意项目该项目致力于诗歌的算法生成。它是用Python编写的。我的Python知识和自然语言处理知识只能通过互联网自学。我已经从事这项工作大约一年了,所以我并不无助,但在这个项目的各个阶段,我都遇到了困难。目前,我正进入开发的最后阶段,遇到了一个小障碍。

我需要实现某种形式的语法规范化,这样输出就不会变成非共轭/屈折的穴居人语大约一个月前,SO上一些友好的人给了我一些建议,告诉我如何使用ngram语言建模器来解决这个问题,但我正在寻找其他解决方案,因为NLTK的NgramModeler似乎不适合我的需求。(也提到了POS标记的可能性,但考虑到我的业余爱好,我的文本可能过于零碎和奇怪,无法轻松实现。)

也许我需要像AtD一样的东西,但希望不那么复杂

我认为需要像After the Deadline或Queequeg这样的东西,但这两个似乎都不完全正确。Queequeg可能不太适合——它是2003年为Unix编写的,我一辈子都无法让它在Windows上运行(我已经尝试了一切)。但我喜欢它所检查的只是正确的动词变位和数字一致性。

另一方面,AtD要严格得多,提供了比我需要的更多的功能。但我似乎无法让python绑定正常工作。(我从AtD服务器上收到502个错误,我相信这些错误很容易修复,但我的应用程序将联机,我宁愿避免依赖另一台服务器。我自己负担不起运行AtD服务器的费用,因为我的应用软件将需要我的网络主机提供的"服务"数量已经威胁到在廉价托管该应用程序时会出现问题。)

我想避免的事情

自己构建Ngram语言模型似乎不适合这项任务我的应用程序抛出了大量未知词汇,扭曲了所有结果。(除非我使用的语料库太大,以至于对我的应用程序来说运行速度太慢——否则应用程序需要非常快。)

严格检查语法既不适合这项任务语法不需要完美,句子也不需要比使用ngrams生成的jibberish这样的英语更合理。即使是jibberish,我也只需要强制执行动词变位、数字一致性,并做一些事情,比如删除多余的冠词。

事实上,我甚至不需要任何建议来进行更正。我想我所需要的只是统计一组可能的句子中每个句子似乎出现了多少错误,这样我就可以根据它们的分数进行排序,并选出语法问题最少的一个。

一个简单的解决方案?通过检测明显错误为流利度打分

如果有一个剧本能处理这一切,我会欣喜若狂(我还没有找到)。当然,我可以为找不到的东西编写代码;我正在寻求如何优化我的方法的建议。

假设我们已经列出了一小部分文本:

existing_text = "The old river"

现在,假设我的脚本需要弄清楚动词"to bear"的下一个词形变化。我愿意接受有关这一惯例的建议但我主要需要第2步的帮助,通过统计语法错误来评定流利程度:

  1. 使用NodeBox语言学中的动词共轭方法,得出该动词的所有共轭;CCD_ 2
  2. 反复检查各种可能性,(浅显地)检查existing_text + " " + possibility("the old river bear"、"the old river bears"等)产生的字符串的语法。统计每个构造的错误计数。在这种情况下,唯一引起错误的建筑似乎是"老河熊"
  3. 包装应该很容易。。。在错误计数最低的可能性中,随机选择

首先是一个非常酷的项目。

我找到了一个java语法检查器。我从未使用过它,但文档声称它可以作为服务器运行。java和监听端口基本上都应该在任何地方得到支持。

我只是以CS背景进入NLP,所以我不介意更详细地帮助您集成您决定使用的任何东西。请随时询问更多细节。

另一种方法是使用所谓的过度生成和排序方法。在第一步中,你让你的诗歌生成器生成多个候选世代。然后使用类似亚马逊的Mechanical Turk这样的服务来收集人类对流利程度的判断。实际上,我建议收集由相同种子条件生成的多个句子的同时判断。最后,从生成的句子中提取特征(可能使用某种形式的句法分析器),以训练模型对问题质量进行评级或分类。你甚至可以加入上面列出的启发式方法。

Michael Heilman使用这种方法生成问题。有关更多详细信息,请阅读以下文件:好问题!问题生成的统计排名和使用Mechanical Turk对计算机生成的问题进行评分。

上面提供的pylinkgrammar链接有点过时。它指向0.1.9版本,该版本的代码示例不再工作。如果你走这条路,一定要使用最新版本,可以在找到

https://pypi.python.org/pypi/pylinkgrammar

最新更新