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

dri*_*her 30 python grammar nlp linguistics nltk

一些背景

我是佛罗里达新学院的文学专业学生,目前正致力于一个过于雄心勃勃的创意项目.该项目旨在实现诗歌的算法生成.它是用Python编写的.我的Python知识和自然语言处理知识只来自于通过互联网自学.我已经使用这些东西大约一年了,所以我并非无助,但在不同的方面,我在这个项目中遇到了麻烦.目前,我正在进入最后的发展阶段,并且遇到了一些障碍.

我需要实现某种形式的语法规范化,这样输出就不会像未绑定/变形的穴居人那样出现.大约一个月前SO上的一些友好人员给了我一些关于如何通过使用ngram语言建模器解决这个问题建议,基本上 - 但我正在寻找其他解决方案,因为看起来NLTK的NgramModeler不适合我的需要.(也提到了POS标签的可能性,但是我的文字可能太过零碎而且很奇怪,因为我的业余爱好者可以很容易地实现这一点.)

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

我认为需要一些像截止日期Queequeg之类的东西,但这些都不是完全正确的.Queequeg可能不太合适 - 它是2003年为Unix编写的,我无法让它在Windows上工作(我已经尝试了一切).但我喜欢它所检查的是正确的动词共轭和数字协议.

另一方面,AtD更严格,提供的功能超出了我的需求.但我似乎无法得到它的python绑定工作.(我从AtD服务器得到502错误,我肯定很容易修复,但我的应用程序将在线,我宁愿避免依赖另一台服务器.我负担不起运行AtD服务器我自己,因为我的应用程序需要我的网站主机的"服务"数量已经威胁到导致这个应用程序廉价托管的问题.)

我想避免的事情

自己构建Ngram语言模型似乎不适合这项任务.我的应用程序抛出了许多未知的词汇,扭曲了所有的结果.(除非我使用的语料库太大而且对我的应用程序运行速度太慢 - 应用程序需要非常活泼.)

严格检查语法既不适合完成任务.语法不需要是完美的,并且句子不必比使用ngrams生成的类似英语的乱码更合理.即使它是乱七八糟的,我只需要强制动词共轭,数字协议,并做一些事情,如删除额外的文章.

事实上,我甚至不需要任何修正建议.我认为我需要的只是为了计算一组可能句子中每个句子中出现的错误数量,所以我可以按照他们的分数进行排序并选择语法问题最少的句子.

简单的解决方案?通过检测明显的错误来评分流畅度

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

假设我们已经列出了一些文字:

existing_text = "The old river"

现在让我们说我的剧本需要弄清楚接下来可能会出现哪些动词"承受".我对这个例程的建议持开放态度.但我主要通过步骤#2获得帮助,通过计算语法错误来评定流畅度:

  1. 使用NodeBox语言学中的动词共轭方法来提出这个动词的所有结合; ['bear', 'bears', 'bearing', 'bore', 'borne'].
  2. 迭代可能性,(浅)检查由existing_text + " " + possibility("老河熊","老河熊"等)产生的字符串的语法.计算每个构造的错误计数.在这种情况下,似乎唯一提出错误的建筑是"老河熊".
  3. 包装应该很容易......在错误计数最低的可能性中,随机选择.

dri*_*her 11

链接语法检查语法

Link Grammar简介

由Davy Temperley,Daniel Sleator和John Lafferty开发的Link Grammar是一个英语的语法分析器:"给定一个句子,系统为其分配一个句法结构,它由一组连接词对的标记链接组成.解析器还产生句子的"组成"表示(显示名词短语,动词短语等)." 您可以在此处阅读有关Link Grammar的更多信息与在线解析器进行交互.

几年前AbiWord 接管了这个项目.他们解释说AbiWord使用Link Grammar来检查语法.我不知道AbiWord实际上如何执行语法检查的复杂性,但我读到了关于语法检查的Q&A中的基本方法(我现在丢失的链接).与我与之交互过的其他一些解析器不同,当一个句子语法不完善时,Link Grammar会产生非常不同的结果:它无法找到语法上不正确句子的完整链接.

您可以通过在线解析器自己查看:输入句子"这是我买的狗的人"产生1个连接,而"这是我买的狗的人"没有产生完整的联系.

这不会像我要求的那样"计算"错误的数量.然而,它确实满足了原始方法,以排除语法难以置信(即不正确共轭)的可能性.

Python绑定:它们存在!

Link Grammar是用C语言编写的.当我第一次研究时,这给我带来了一个问题,因为我只用了一年的Python编码,而且我很难自己创建绑定.我也担心我的进程/服务数量,所以我不想在我的Python进程之上运行Link Grammar程序.但是在1月13日发布这个问题后的一两天,我遇到了Jeff Elmore(enzondio)pylinkgrammar对PyPi的贡献 - 这只发生在前一天.

正如pylinkgrammar页面所解释的那样,您仍然需要首先构建和安装linkgrammar.有关如何使用它的说明在该页面上.但有关安装pylinkgrammar的一些警告:

  1. 我无法让pylinkgrammar在Windows 7上使用Python 2.7,我认为这是由于在Windows 7上使用CMake使用Python 2.7的问题.
  2. 因此,我将整个项目移动到Ubuntu(10.10),因为我需要这么糟糕.但是当我设置Ubuntu时,我尝试为Python 2.7安装所有内容(甚至删除了2.6).我仍然无法让pylinkgrammar使用Python 2.7.我认为这仍然是由于CMake和Python 2.7之间的问题.
  3. 我开始使用我的Ubuntu安装,因为事情变得混乱,而是用Python 2.6设置一切.我现在得到了pylinkgrammar使用Python 2.6.(但我必须打字from pylinkgrammar.linkgrammar import Parser,这与pypi页面的说明略有不同).

NodeBox语言学:我的解决方案的另一部分

在我的问题中,我说过需要生成给定句子的所有变形/变形,以便检查所有这些变化并消除语法难以置信的项目.(我在输出之前使用WordNet来更改某些用户输入,并且WordNet结果是未反射的;它们需要被变换以使输出(更多)可理解).

一个非常丰富的博客文章引导我进入NodeBox语言学库,这是一组工具,"你可以对英语内容进行语法变形语义操作 ".实际上,该库可用于在许多其他操作中结合动词,单数化和复数名词.这正是我所需要的.我的应用程序知道输入中的哪些单词换成了新的,未反映的语言; 这些部分是它使用NodeBox语言学中的方法生成变体的部分.

我将这些变化提供给pylinkgrammar和drop变体,但没有找到完整的链接.有时这根本不会产生任何结果,但通常会产生有用的结果.请注意,Link Grammar不会找到大多数不完整句子的完整链接.如果你想像我一样检查碎片句子中的变形,尝试在检查之前用填充物扩展碎片句子,然后在输出之前放下填充物.我通过从数据中取出最后一个单词,在布朗语料库中查找它,并从语料库中追加该句子的其余部分来获得这个"填充物".

我没有任何测试来报告这种方法在统计上是多么准确,但它在大多数情况下都适用于我的(特殊)目的.我仍然在充实这个实现并编写特殊情况和方法来清理输入数据.希望这些信息也可以帮助其他人!请不要犹豫,要求澄清.


Joh*_*own 2

首先,非常酷的项目。

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

我刚刚进入具有 CS 背景的 NLP,所以我不介意了解更多细节来帮助您集成您决定使用的任何内容。请随时询问更多详细信息。