我是佛罗里达新学院的文学系学生,目前正致力于一个雄心勃勃的创意项目。该项目面向诗歌的算法生成。它是用Python编写的。我的Python知识和自然语言处理知识只来自于通过互联网自学。这一年,我一直在为一个项目而努力,但我一直在努力。目前,我正在进入开发的最后阶段,遇到了一些障碍。在
我需要实现某种形式的语法规范化,这样输出的结果就不会像没有变化或变化的穴居人说话一样出来。大约一个月前,一些友好的人通过使用一个ngram语言建模器,基本上——但我正在寻找其他解决方案,看来NLTK的ngramodeler不适合我的需要。(也提到了词性标注的可能性,但鉴于我的业余爱好,我的文本可能过于零碎和陌生,不容易实现。)
我认为需要一些类似After the Deadline或Queequeg的东西,但这两个似乎都不完全正确。Queequeg可能不太适合——它是2003年为Unix编写的,我一辈子都无法让它在Windows上运行(已经尝试了所有的方法)。但我喜欢它检查的只是动词的正确变化和数字的一致性。在
另一方面,AtD更严格,提供的功能比我需要的更多。但我似乎不能让它工作。(我从AtD服务器上收到502个错误,我确信很容易修复,但我的应用程序将联机,我宁愿避免依赖其他服务器。我自己无法负担运行AtD服务器的费用,因为我的应用程序需要的web主机的“服务”数量已经威胁到以低廉的成本托管此应用程序的问题。)
我自己构建Ngram语言模型似乎不适合这项任务。我的应用程序抛出了大量未知词汇,扭曲了所有结果。(除非我使用的语料库太大,以至于对我的应用程序来说运行太慢了——否则应用程序需要非常快。)
严格检查语法对这项任务来说都不合适。语法不需要完美,句子也不必比使用ngrams生成的那种像jibberish这样的英语更敏感。即使这是无聊的,我只需要加强动词的变化,数字一致,并做一些事情,如删除额外的冠词。在
事实上,我甚至不需要任何建议来纠正。我想我所需要的就是把一组可能的句子中每个句子中似乎出现的错误进行统计,这样我就可以根据它们的分数进行排序,然后选出语法问题最少的一个。在
如果有一个脚本可以处理所有这些,我会非常高兴(我还没有找到一个)。当然,我可以为找不到的东西编写代码;我正在寻找如何优化我的方法的建议。在
假设我们已经安排了一小部分文本:
existing_text = "The old river"
现在让我们假设我的脚本需要弄清楚动词“to bear”的下一个词形变化。我愿意接受关于这项工作的建议。但我主要需要第二步的帮助,通过计算语法错误来评定流利程度:
['bear', 'bears', 'bearing', 'bore', 'borne']
。在existing_text + " " + possibility
(“old river”)产生的字符串的语法熊”,“旧河熊”等)。记录每种结构的错误计数。在这种情况下,唯一引起错误的建筑,似乎就是“老河熊”。在
使用Link Grammar进行语法检查
链接语法简介
链接语法由Davy Temperley、Daniel Sleator和John Lafferty开发,是一种英语句法分析工具:“给定一个句子,系统给它分配一个句法结构,它由一组连接成对单词的标记链接组成。解析器还生成一个句子的“成分”表示(显示名词短语、动词短语等)。“您可以read more about Link Grammar和interact with an online parser here。在
几年前。他们解释说AbiWord使用链接语法来检查语法。我不知道AbiWord实际上是如何进行语法检查的,但我在一个关于语法检查的问答中了解了基本方法(我现在已经失去了链接)。与我接触过的其他解析器不同,当一个句子的语法结构不好时,链接语法会产生截然不同的结果:它找不到语法错误句子的完整链接。在
你可以用online parser:输入句子“This is the man which dog I bulled”生成1个链接,而“This are the man which dog I bulled”则不产生完整的链接。在
我问的错不算这个。然而,它确实实现了原版for的一种排除语法上不合理(即不恰当的共轭)可能性的方法。
Python绑定:它们存在!在
链接语法是用C编写的。这在我第一次研究时给我带来了一个问题,因为我只学了一年Python编码,我很难自己创建绑定。我还担心我的进程/服务计数,所以我不想在Python进程之上运行链接语法程序。但是在1月13日发布这个问题的一两天后,我遇到了jeffelmore(enzondio)对PyPi的贡献——这是发生在前一天。在
正如pylinkgrammar页面所述,您仍然需要先构建并安装linkgrammar。关于如何使用它的说明就在该页面上。但是一些关于安装pylinkgrammar的警告:
from pylinkgrammar.linkgrammar import Parser
,这与pypi页面的说明略有不同)。在NodeBox Linguistics:我解决方案的另一部分
在我的问题中,我指出需要生成给定句子的所有屈折/变化,以便检查所有这些变化,并消除语法上不可信的项目。(我使用WordNet在输出之前更改用户输入的某些部分,而WordNet的结果是未反映的;它们需要进行变形以使输出(更)易懂)。在
一个非常丰富的blogpost让我找到了NodeBox Linguistics library,一套工具,用它“你可以对英语内容进行语法变化和语义操作”。实际上,这个库可以用来共轭动词、单数化和名词复数,。这正是我所需要的。我的应用程序知道输入中的哪些单词被换成了新的、未经修改的语言;这些片段就是它生成varia的部分使用NodeBox语言学中的方法。在
我将这些变体输入到pylinkgrammar中,并删除找不到完整链接的变体。有时这根本不会产生任何结果,但通常会产生有用的结果。请注意,对于大多数不完整的句子,链接语法找不到完整的链接。如果你想像我一样检查碎片句子中的变化,请在检查之前尝试用填充语扩展碎片句子,然后在输出前去掉填充词。我从数据中提取最后一个词,在棕色语料库中查找,然后将该句子的其余部分从语料库中追加,得到这个“填充词”。在
我没有任何测试来报告这种方法在统计学上的精确性,但它在大多数情况下对我(特殊的)目的有效。我仍然在充实这个实现的过程中,编写异常情况和清理输入数据的方法。希望这些信息也能帮助其他人!请不要犹豫要求澄清。在
另一种方法是使用所谓的过度生成和排名方法。第一步,让你的诗歌生成器生成多个候选代。然后使用类似亚马逊的Mechanical Turk这样的服务来收集人类对流利程度的判断。实际上,我建议收集来自相同种子条件的多个句子的同时判断。最后,从生成的句子中提取特征(可能使用某种形式的语法分析器)来训练模型来对问题质量进行评级或分类。你甚至可以加入上面列出的启发式方法。在
michaelheilman使用这种方法生成问题。欲了解更多详情,请阅读以下文章: Good Question! Statistical Ranking for Question Generation和 Rating Computer-Generated Questions with Mechanical Turk。在
首先,非常酷的项目。在
我找到了一个java grammar checker。我从未使用过它,但文档声称它可以作为服务器运行。java和监听端口应该在任何地方都得到支持。在
我刚进入NLP与一个CS背景,所以我不介意更详细地帮助你整合你决定使用的任何东西。请随意询问更多细节。在
相关问题 更多 >
编程相关推荐