一些背景
我是佛罗里达州新学院的文学系学生,目前正在从事一个过于雄心勃勃的创意项目。 该项目面向诗歌的算法生成 .它是用 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 步的帮助 ,通过统计语法错误来评估流畅度:
['bear', 'bears', 'bearing', 'bore', 'borne'] . existing_text + " " + possibility 产生的字符串的语法(《老河熊》、《老河熊》等)。计算每个构造的错误计数。在这种情况下,唯一引发错误的结构似乎是“老河熊”。 最佳答案
语法检查 Link Grammar
链接语法介绍
由 Davy Temperley、Daniel Sleator 和 John Lafferty 开发的 Link Grammar 是一种英语句法解析器:“给定一个句子,系统为其分配一个句法结构,该结构由一组连接成对单词的标记链接组成。解析器还生成句子的“组成”表示(显示名词短语、动词短语等)。”您可以 read more about Link Grammar和 interact 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的一些注意事项:
from pylinkgrammar.linkgrammar import Parser ,这与 pypi 页面的说明略有不同)。 关于python - 通过语法检查(Python)从一组可能性中选择最流畅的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8842817/
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我脑子里浮现出一些关于一种新编程语言的想法,所以我想我会尝试实现它。一位friend建议我尝试使用Treetop(Rubygem)来创建一个解析器。Treetop的文档很少,我以前从未做过这种事情。我的解析器表现得好像有一个无限循环,但没有堆栈跟踪;事实证明很难追踪到。有人可以指出入门级解析/AST指南的方向吗?我真的需要一些列出规则、常见用法等的东西来使用像Treetop这样的工具。我的语法分析器在GitHub上,以防有人希望帮助我改进它。class{initialize=lambda(name){receiver.name=name}greet=lambda{IO.puts("He
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是
我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)