通过语法检查选择最流畅文本(Python)
一些背景
我是一名佛罗里达新学院的文学学生,目前正在进行一个过于雄心勃勃的创意项目。这个项目是关于算法生成诗歌的。它是用Python编写的。我对Python和自然语言处理的知识主要是通过自学网络上的资料获得的。我已经在这方面工作了一年,所以我并不是完全无助,但在这个项目的不同阶段,我确实遇到了一些困难。目前,我正在进入开发的最后阶段,遇到了一些小问题。
我需要实现某种语法规范化,以确保输出不会变成没有变化的原始人语言。大约一个月前,一些友好的网友在SO上给了我一些建议,告诉我可以通过使用ngram语言模型来解决这个问题,但我在寻找其他解决方案,因为NLTK的NgramModeler似乎不太适合我的需求。(也提到了词性标注的可能性,但由于我的文本可能过于零碎和奇怪,作为一个业余爱好者,这种实现对我来说可能不太容易。)
也许我需要类似AtD的东西,但希望更简单一些
我觉得我需要的东西像After the Deadline或Queequeg,但这两者似乎都不太合适。Queequeg可能不太适合——它是2003年为Unix编写的,我在Windows上根本无法运行(我尝试了所有方法)。但我喜欢它只检查动词的正确变化和数的一致性。
另一方面,AtD要严格得多,提供的功能超出了我的需求。但我似乎无法让它的Python绑定正常工作。(我从AtD服务器那里得到了502错误,我相信这些错误很容易修复,但我的应用程序将在线运行,我更希望避免依赖其他服务器。我无法自己运行AtD服务器,因为我的应用程序需要的“服务”数量已经让我的网络托管费用面临问题。)
我想避免的事情
自己构建Ngram语言模型似乎不适合这个任务。我的应用程序会抛出很多未知的词汇,导致所有结果都出现偏差。(除非我使用一个大得过分的语料库,这样会导致我的应用程序运行得太慢——应用程序需要快速响应。)
严格检查语法也不适合这个任务。语法不需要完美,句子也不必比用ngram生成的那种类似英语的胡言乱语更有意义。即使是胡言乱语,我只需要确保动词的变化、数的一致性,并做一些像去掉多余冠词这样的事情。
实际上,我甚至不需要任何类型的纠正建议。我认为我只需要一个东西来统计每个可能句子中出现的错误数量,这样我就可以按分数排序,选择错误最少的那个。
简单的解决方案?通过检测明显错误来评分流畅性
如果有一个脚本可以处理这一切,我会非常高兴(我还没有找到)。当然,我可以为找不到的东西编写代码;我在寻找如何优化我的方法的建议。
假设我们已经有一小段文本:
existing_text = "The old river"
现在假设我的脚本需要弄清楚动词“to bear”的哪个变化可以接下来使用。我对这个过程持开放态度。但我主要需要帮助的是第2步,通过统计语法错误来评分流畅性:
- 使用NodeBox Linguistics中的动词变化方法,列出这个动词的所有变化;
['bear', 'bears', 'bearing', 'bore', 'borne']
。 - 遍历所有可能性,(浅层)检查由
existing_text + " " + possibility
生成的字符串的语法(例如:“The old river bear”,“The old river bears”等)。统计每种构造的错误数量。在这种情况下,似乎唯一会引发错误的构造是“The old river bear”。 - 最后应该很简单……在错误数量最少的可能性中随机选择。
3 个回答
上面提到的pylinkgrammar链接有点过时了。它指向的是0.1.9版本,而这个版本的代码示例已经不再有效。如果你打算使用这个库,记得去找最新的版本,最新版本可以在这里找到:
另一种方法是使用一种叫做“过生成和排名”的方式。在第一步,你的诗歌生成器会生成多个候选作品。接下来,可以使用像亚马逊的Mechanical Turk这样的服务来收集人们对这些作品流畅性的评价。我建议同时收集多个句子的评价,这些句子是从相同的起始条件生成的。最后,你可以从生成的句子中提取一些特征(可能需要用到某种语法分析工具),然后训练一个模型来评估或分类问题的质量。你甚至可以加入上面提到的一些启发式方法。
Michael Heilman就是用这种方法来生成问题的。想了解更多细节,可以看看这些论文: 好问题!问题生成的统计排名和 用Mechanical Turk对计算机生成的问题进行评分。
首先,这个项目真不错。
我发现了一个Java语法检查工具。我自己没用过,但文档上说它可以作为服务器运行。Java和监听端口的功能基本上在任何地方都能支持。
我刚开始接触自然语言处理(NLP),有计算机科学的背景,所以如果你需要更详细的信息来帮助你整合你决定使用的工具,我很乐意提供帮助。随时可以问我更多细节。