一些背景
我是佛罗里达新学院的一名文学专业学生,目前正在从事一个雄心勃勃的创意项目。该项目面向诗歌的算法生成。它是用 Python 编写的。我的 Python 知识和自然语言处理知识仅来自通过互联网自学。我已经用这些东西工作了大约一年,所以我并不无助,但在不同的点上,我在这个项目中前进时遇到了麻烦。目前,我正在进入开发的最后阶段,并且遇到了一些障碍。
我需要实现某种形式的语法规范化,这样输出就不会像未共轭/变形的穴居人说话那样出现。大约一个月前,SO 上的一些友好人士给了我一些建议,告诉我如何通过使用ngram 语言建模器来解决这个问题,基本上——但我正在寻找其他解决方案,因为似乎 NLTK 的 NgramModeler 不适合我的需要。(还提到了 POS 标记的可能性,但考虑到我的业余爱好,我的文字可能过于零碎和奇怪,无法轻松实现。)
也许我需要像 AtD 这样的东西,但希望不那么复杂
我认为需要像After the Deadline或Queequeg这样的东西,但这些似乎都不完全正确。Queequeg 可能不太适合——它是在 2003 年为 Unix 编写的,我一生都无法让它在 Windows 上工作(已经尝试了一切)。但我喜欢它只检查正确的动词变位和数字一致性。
另一方面,AtD 更加严格,提供了比我需要的更多的功能。但我似乎无法让它工作的python 绑定。(我从 AtD 服务器收到 502 错误,我确信这很容易修复,但我的应用程序将在线,我宁愿避免依赖另一台服务器。我负担不起运行 AtD 服务器的费用我自己,因为我的应用程序将需要我的网络主机的“服务”数量已经威胁到在廉价地托管这个应用程序方面造成问题。)
我想避免的事情
自己构建 Ngram 语言模型似乎不适合这项任务。我的应用程序抛出了很多未知的词汇,扭曲了所有的结果。(除非我使用的语料库太大,以至于它对我的应用程序来说运行速度太慢——应用程序需要非常敏捷。)
严格检查语法既不适合这项任务。语法不需要完美,句子不需要比你可以使用 ngrams 生成的类似英语的胡言乱语更明智。即使它是胡言乱语,我只需要强制执行动词变位,数字一致,并做一些事情,比如删除多余的文章。
事实上,我什至不需要任何更正的建议。我认为我所需要的只是计算一组可能的句子中每个句子中似乎出现了多少错误,这样我就可以按他们的分数排序并选择语法问题最少的那个。
一个简单的解决方案?通过检测明显的错误来评分流畅度
如果存在处理所有这些的脚本,我会非常高兴(我还没有找到)。当然,我可以为我找不到的东西编写代码;我正在寻找有关如何优化我的方法的建议。
假设我们已经布置了一小部分文本:
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”等)产生的字符串的语法。计算每个构造的错误计数。在这种情况下,唯一出现错误的结构似乎是“老河熊”。 - 总结起来应该很容易......在错误计数最低的可能性中,随机选择。