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

标签 python nlp grammar nltk linguistics

一些背景

我是佛罗里达州新学院的文学系学生,目前正在从事一个过于雄心勃勃的创意项目。 该项目面向诗歌的算法生成 .它是用 Python 编写的。我的 Python 知识和自然语言处理知识仅来自通过互联网自学。我已经使用这些东西大约一年了,所以我并不无助,但在不同的时候我在这个项目中前进时遇到了麻烦。目前,我正在进入开发的最后阶段,并遇到了一些障碍。

我需要实现某种形式的语法规范化,以便输出不会以未共轭/屈折的穴居人话的形式出现。 大约一个月前,SO gave me some advice on how I might solve this issue 上的一些友好人士通过使用 ngram 语言建模器 ,基本上 - 但我正在寻找其他解决方案,因为似乎 NLTK 的 NgramModeler 不适合我的需求。 (也提到了 POS 标记的可能性,但考虑到我的业余爱好,我的文字可能过于零碎和奇怪,以至于难以轻松实现。)

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

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

另一方面,AtD 更严格,提供的功能比我需要的要多。但我似乎无法得到 python bindings因为它工作。 (我从 AtD 服务器收到 502 错误,我确定这很容易修复,但我的应用程序将在线,我宁愿避免依赖另一台服务器。我负担不起运行 AtD 服务器的费用我自己,因为我的应用程序将需要我的网络主机的“服务”数量已经威胁到在廉价托管这个应用程序时造成问题。)

我想避免的事情

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

严格检查语法既不适合这项任务。 语法不需要完美,句子也不必比使用 ngram 生成的类似英语的胡言乱语更合理。即使是胡言乱语,我也只需要强制执行动词变位、数字一致性,并做一些诸如删除多余文章之类的事情。

事实上,我什至不需要任何修正建议。我想我所需要的只是计算一组可能句子中每个句子中似乎出现了多少错误,这样我就可以根据他们的分数进行排序,然后选择语法问题最少的那个。

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

如果存在处理所有这些的脚本,我会欣喜若狂(我还没有找到)。当然,我可以为我找不到的东西编写代码;我正在寻找有关如何优化我的方法的建议。

假设我们已经布置了一小部分文本:
existing_text = "The old river"
现在让我们假设我的脚本需要弄清楚接下来会出现动词“tobear”的哪个屈折。我愿意接受有关此例程的建议。 但我主要需要第 2 步的帮助 ,通过统计语法错误来评估流畅度:

  • 使用 NodeBox Linguistics 中的动词共轭方法想出这个动词的所有变形; ['bear', 'bears', 'bearing', 'bore', 'borne'] .
  • 迭代可能性,(浅层地)检查由 existing_text + " " + possibility 产生的字符串的语法(《老河熊》、《老河熊》等)。计算每个构造的错误计数。在这种情况下,唯一引发错误的结构似乎是“老河熊”。
  • 总结起来应该很容易...在错误计数最低的可能性中,随机选择。
  • 最佳答案

    语法检查 Link Grammar

    链接语法介绍

    由 Davy Temperley、Daniel Sleator 和 John Lafferty 开发的 Link Grammar 是一种英语句法解析器:“给定一个句子,系统为其分配一个句法结构,该结构由一组连接成对单词的标记链接组成。解析器还生成句子的“组成”表示(显示名词短语、动词短语等)。”您可以 read more about Link Grammarinteract with an online parser here .

    几年前 AbiWord took the project over .他们解释说 AbiWord 使用 Link Grammar 来检查语法。 我不知道 AbiWord 实际上如何执行语法检查的复杂性,但我在关于语法检查的问答中读到了基本方法(我现在丢失了该链接)。与我接触过的其他一些解析器不同,当句子的语法格式不正确时,Link Grammar 会产生非常不同的结果:找不到语法错误句子的完整链接 .

    您可以 亲自查看 online parser :输入句子“这是我买的狗的那个人”会产生 1 个联系,而“这是我买的狗的人”不会产生完整的联系。

    这并不像我要求的那样“计算”错误的数量。但是它确实满足了 的原始要求一种排除语法上不合理(即结合不当)可能性的方法。

    Python 绑定(bind):它们存在!

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

    pylinkgrammar 页面说明,你还是要首先构建并安装linkgrammar。 有关如何使用它的说明在该页面上。但是安装pylinkgrammar的一些注意事项:

  • 我无法让 pylinkgrammar 在带有 Windows 7 的 Python 2.7 上工作,我认为这是由于在 Windows 7 上让 CMake 与 Python 2.7 一起工作的问题。
  • 因此,我将我的整个项目移到了 Ubuntu (10.10) 中,因为我非常需要它。但是当我设置 Ubuntu 时,我尝试为 Python 2.7 安装所有东西(甚至删除了 2.6)。 我仍然无法使用 Python 2.7 使用 pylinkgrammar。 我认为这仍然是由于 CMake 和 Python 2.7 之间的问题。
  • 我重新开始安装 Ubuntu,因为事情变得很困惑,而是使用 Python 2.6 设置所有内容。 我现在已经使用 Python 2.6 使用 pylinkgrammar。 (但我必须输入 from pylinkgrammar.linkgrammar import Parser ,这与 pypi 页面的说明略有不同)。

  • NodeBox Linguistics:我的解决方案的另一部分

    在我的问题中,我表示需要 生成给定句子的所有变形/共轭,为了检查所有这些变化并消除语法上不合理的项目。 (我正在使用 WordNet 在输出之前更改某些用户输入,并且 WordNet 结果未变形;它们需要变形以使输出(更)可理解)。

    信息量很大 blogpost带我到 NodeBox Linguistics library , 一组工具,“您可以使用这些工具对英语内容进行 语法屈折 语义操作 ”。确实可以使用该库共轭动词,名词的单数和复数,在许多其他操作中。这正是我所需要的。我的应用程序知道它已将输入中的哪些词替换为新的、非屈折变化的语言;这些部分是它使用 NodeBox 语言学中的方法为其生成变体的部分。

    我将这些变体输入 pylinkgrammar 并删除找不到完整链接的变体。 有时这根本不会产生任何结果,但通常情况下,它会产生有用的结果。请注意 Link Grammar 不会为大多数不完整的句子找到完整的链接。 如果你想像我一样检查碎片化句子中的变形,试试 在检查之前用填充物扩展碎片化的句子,然后在输出之前去掉填充物。 我通过从数据中取出最后一个单词,在 Brown 语料库中查找,并从语料库中附加该句子的其余部分来获得这个“填充”。

    我没有任何测试来报告这种方法在统计上有多准确,但它对我的(特殊)目的有效 大多数的时间。我仍在充实这个实现并编写特殊情况和方法来清理输入数据。希望这些信息也能帮助其他人!请不要犹豫,要求澄清。

    关于python - 通过语法检查(Python)从一组可能性中选择最流畅的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8842817/

    相关文章:

    parsing - 如何最好地解析 PEG 语法中的逗号分隔列表

    python - 使用 Watson SDK API 的主题建模示例

    c# - 如何在我的 C# 应用程序中使用 USE SharpNlp

    python - 用于 Python 的轻量级 NLP 框架

    antlr - 这个语法有什么问题?

    java - Antlr:对尚未解析的数据的引用

    python - 在二叉树中找到最接近给定目标的数字

    python - 检查多个文件是否存在的最快方法

    python - 如何让 pyyaml.safe_load() 处理 python/unicode 标签?

    python 计算商业周数