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

2024-10-01 00:35:01 发布

您现在位置:Python中文网/ 问答频道 /正文

一些背景

我是佛罗里达新学院的文学系学生,目前正致力于一个雄心勃勃的创意项目。该项目面向诗歌的算法生成。它是用Python编写的。我的Python知识和自然语言处理知识只来自于通过互联网自学。这一年,我一直在为一个项目而努力,但我一直在努力。目前,我正在进入开发的最后阶段,遇到了一些障碍。在

我需要实现某种形式的语法规范化,这样输出的结果就不会像没有变化或变化的穴居人说话一样出来。大约一个月前,一些友好的人通过使用一个ngram语言建模器,基本上——但我正在寻找其他解决方案,看来NLTK的ngramodeler不适合我的需要。(也提到了词性标注的可能性,但鉴于我的业余爱好,我的文本可能过于零碎和陌生,不容易实现。)

也许我需要AtD之类的东西,但希望不那么复杂

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

另一方面,AtD更严格,提供的功能比我需要的更多。但我似乎不能让它工作。(我从AtD服务器上收到502个错误,我确信很容易修复,但我的应用程序将联机,我宁愿避免依赖其他服务器。我自己无法负担运行AtD服务器的费用,因为我的应用程序需要的web主机的“服务”数量已经威胁到以低廉的成本托管此应用程序的问题。)

我想避免的事情

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

严格检查语法对这项任务来说都不合适。语法不需要完美,句子也不必比使用ngrams生成的那种像jibberish这样的英语更敏感。即使这是无聊的,我只需要加强动词的变化,数字一致,并做一些事情,如删除额外的冠词。在

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

一个简单的解决方案?通过发现明显的错误来评分流畅性

如果有一个脚本可以处理所有这些,我会非常高兴(我还没有找到一个)。当然,我可以为找不到的东西编写代码;我正在寻找如何优化我的方法的建议。在

假设我们已经安排了一小部分文本:

existing_text = "The old river"

现在让我们假设我的脚本需要弄清楚动词“to bear”的下一个词形变化。我愿意接受关于这项工作的建议。但我主要需要第二步的帮助,通过计算语法错误来评定流利程度:

  1. 使用NodeBox Linguistics中的动词变化方法来获得这个动词的所有变化;['bear', 'bears', 'bearing', 'bore', 'borne']。在
  2. 迭代各种可能性,(浅显地)检查由existing_text + " " + possibility(“old river”)产生的字符串的语法熊”,“旧河熊”等)。记录每种结构的错误计数。在这种情况下,唯一引起错误的建筑,似乎就是“老河熊”。在
  3. 收工应该很容易。。。在错误数最少的可能性中,随机选择。在

Tags: 项目方法文本服务器语言应用程序错误atd
3条回答

使用Link Grammar进行语法检查

链接语法简介

链接语法由Davy Temperley、Daniel Sleator和John Lafferty开发,是一种英语句法分析工具:“给定一个句子,系统给它分配一个句法结构,它由一组连接成对单词的标记链接组成。解析器还生成一个句子的“成分”表示(显示名词短语、动词短语等)。“您可以read more about Link Grammarinteract 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的警告:

  1. 我无法让pylinkgrammar在Python2.7和Windows7上运行,我认为这是由于在Windows7上使用Python2.7时出现问题。在
  2. 因此,我把我的整个项目移到了Ubuntu(10.10)中,因为我非常需要它。但当我建立Ubuntu时,我尝试为python2.7安装所有东西(甚至删除了2.6)。我仍然无法让pylinkgrammar与python2.7一起工作。我认为这仍然是由于CMake和python2.7之间的问题造成的。在
  3. 我重新开始安装Ubuntu,因为事情变得一团糟,我用python2.6来设置一切。我现在已经让pylinkgrammar与python2.6一起工作了。(但是我必须输入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 GenerationRating Computer-Generated Questions with Mechanical Turk。在

首先,非常酷的项目。在

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

我刚进入NLP与一个CS背景,所以我不介意更详细地帮助你整合你决定使用的任何东西。请随意询问更多细节。在

相关问题 更多 >