本网站由以下捐款支持:OEIS基金会.

用户:Antti Karttune/awkarttu.buffaloes.py

来自OeisWiki
跳转到:航行,搜索

这是一个Python源代码,我在2008年2月写的,作为对赫尔辛基大学普通语言学系语言技术课程Clt233作业3的回答。另请参阅Wikipedia文章“水牛水牛和第页用户:Antti Karttunne/Etsivät Etsivät.

自然语言工具包可从以下网址下载网址:http://nltk.org/.

#!/usr/bin/python#-*-编码:utf8-*-#斯堪的纳维亚字母:“ä”和“ö”。#Antti Karttunen对作业3的回答当然是Clt233。#关于#用buffalo2grammar解析句子buffalo的替代词#确实遵循顺序A007477号[n-1]表示n>=3以后。导入nltk进口再进口导入系统定义parse_sentences(语法、单词、up_to_ntimes、详细):“”“用”“grammar”“分析从1到”“up_to_n_times”“单词的句子。”“”#解析器=nltk。RecursiveDescentParser(语法)#解析器=nltk。ChartParser(语法,nltk.parse.BU_STRATEGY)#,trace=2)解析器=nltk。ChartParser(语法,nltk.parse.TD_STRATEGY)#,trace=2)发送=“”序列=[]对于范围内的n(up_to_n次):如果(len(sent)>0):发送+=“”已发送+=字尝试:parse_list=parser.nbest_parse(sent.split())except ValueError:#语法没有涵盖某些输入单词?parse_list=[]n_alts=len(解析列表)顺序追加(n_alts)如果(0==n_alts):sys.stdout.write(“此语法无法识别:”+sent+“\n”)elif(详细):sys.stdout.write(“句子:”+sent+“WASSED IN”+str(n_alts)+“不同方式:\n”)对于parse_list中的p:打印psys.stdout.write(“\n”)sys.stdout.flush()sys.stdout.write(“序列增长为:”+str(seq)+“\n”)#函数的结束#########################################################################第1部分:“布法罗”一句#########################################################################buffalo1grammar=nltk.parse_cfg(“”)S->NP副总裁PN->“水牛”N->“水牛”V->“水牛”NP->PN N | NP RCRC->NP V副总裁->副总裁""")parse_sentences(buffalo1grammar,“水牛Buffalo水牛buff水牛bulfa水牛buffera水牛”,1,True)#########################################################################第2部分和第3部分:更多的水牛和越来越多的水牛#########################################################################水牛2grammar=nltk.parse_cfg(“”S->NP副总裁PN->“水牛”N->“水牛”V->“水牛”NP->N | PN N | NP RCRC->NP V副总裁->副总裁""")#parse_sentences(buffa2grammar,“buffa”,5,True)parse_sentences(buffa2grammar,“buffa”,12,False)#这提供了:# 0,0,1,2,3,6,11,22,44,90,187,392,832,1778,3831,8304,18104,39666,...##与OEIS序列比较A007477号带描述#“与自身卷积时左移2位。”:# 1, 1, 1, 2, 3, 6, 11, 22, 44, 90, 187, 392, 832, 1778, 3831, 8304, 18104,# 39666, 87296, 192896, 427778, 951808, 2124135, 4753476, 10664458, 23981698,# 54045448, 122041844, 276101386, 625725936, 1420386363# http://www.research.att.com/~njas/序列/A007477号#在组合结构百科全书中:# http://algo.inria.fr/bin/encyclopedia?搜索=ECSnb&argsearch=441#结构:#[S,{S=并集(Z,Prod(Z,并集(Z,Prod(S,S))))},未标记]#另见N.S.S.Gu、N.Y.Li和T.Mansour,#2-二叉树:双射和相关问题,#离散。数学。,308 (2008), 1209-1221.#纸张可从以下网址获得:# http://www.combinatorics.net.cn/research/Papers_GetFile.aspx?paperID=269#必须检查等效性!如果是真的,那么有#A007477号[24-1]=4753476种解析水牛句子的方法^24#使用buffa2语法。(我的笔记本电脑太慢了,无法准确计算!)#请注意,其他序列尚未出现在OEIS中。(我会添加它们#在适当的时候…)#########################################################################另外,允许单个“水牛”作为动词(祈使形式)#########################################################################buffa3grammar=nltk.parse_cfg(“”S->副总裁| NP副总裁PN->“水牛”N->“水牛”V->“水牛”NP->N | PN N | NP RCRC->NP VVP->V NP|V""")parse_sentences(buffa3grammar,“buffa”,12,False)#########################################################################Bonus,“etsivät”语法:#########################################################################etsivat1grammar_org=nltk.parse_cfg(“”S->NP V NP|NP V预备党->“etsivät”N->“etsivät”V->“etsivät”NP->N|前分词N|NP前分词NP""")etsivat1grammar_long=nltk.parse_cfg(“”S->NP V NP|NP V演示部分->“etsivät”N->“etsivät”V->“etsivät”分词短语->现在分词N | NP现在分词NPNP->N|分词短语""")etsivat1grammar=nltk.parse_cfg(“”S->NP V NP | NP VP->“etsivät”N->“etsivät”V->“etsivät”NP->N | P N | NP P NP""")#PP->P N | NP P NP#NP->N|PP#注意,在最后一种情况下:NP前分词NP#第一个NP总是行动的耐心,#第二个是代理人#(即“A:t etsivät B:t”表示“As seeking B”,或“B’s that seeking A’s”)#parse_sentences(etsivat1grammar,“etsivät”,7,True)parse_sentences(etsivat1grammar,“etsivät”,6,True)#parse_sentences(etsivat1grammar,“etsivät”,12,False)#注意,使用该语法:#句子:“etsivät etsivát etsvät et sivä的etsivöt etsi vätetsiv‑t etssivä#有17种不同的方法:#(S#(NP(N etsivät))#(V etsivät)#(NP(N etsivät))#这很有意义:#“寻找侦探的侦探们寻找寻找侦探们的侦探。”#(S#(NP#(NP#(NP(N etsivät))#(预备党etsivät)# #(NP(N etsivät))#(预备党etsivät)#(NP(N etsivät))#(V etsivät)#(NP(N etsivät))#“寻找侦探调查侦探的侦探寻找侦探”。#(S#(名词)#(NP(preParticiple etsivät)(N etsivát))#(预备党etsivät)#(NP(前分词etsivät)(N etsivät))# #(V etsivät)#(NP(N etsivät))#这也是有道理的:#“寻找调查侦探的调查侦探寻找侦探。”#或者“调查侦探寻求调查侦探寻找侦探”#binarytree1grammar=nltk.parse_cfg(“”B->Z | B BZ->“L”""")#parse_sentences(二进制树1语法,“L”,5,True)parse_sentences(二进制树1语法,“L”,10,False)#我们有加泰罗尼亚人(A000108号)我们应该这么做!#现在我们转换这个combstruct定义A007477号,#即ECS#441:#[S,{S=并集(Z,Prod(Z,并集(Z,Prod(S,S))))},未标记]#通过这个中间“扩展版本”#[S,{S=并集(Z,Prod(Z,S2)),S2=并集#到NLTK-grammar:ECS441语法=nltk.parse_cfg(“”S->Z|Z S2S2->Z | S SZ->“L”""")parse_sentences(ECS441语法,“L”,4,True)parse_sentences(ECS441语法,“L”,10,False)#事实上,我们得到了:#序列增长为:[1,1,1,2,3,6,11,22,44,90]#即初始条款http://www.research.att.com/~njas/序列/A007477号#或者实际上# http://algo.inria.fr/bin/encyclopedia?搜索=ECSnb&argsearch=441#从偏移量n=1开始。# [1, 1, 1, 2, 3, 6, 11, 22, 44, 90, 187, 392, 832, 1778, 3831, 8304, 18104, 39666, 87296, 192896]#因此,该语法基本上为我们提供了三种产品:###S S S系列#  |               / \              / \#Z Z S2 Z S2#                     |              / \#Z S S公司##与水牛2grammar的产量相比:#S->NP副总裁#PN->“水牛”#N->“水牛”#V->“水牛”#NP->N | PN N | NP RC#RC->NP V#副总裁->副总裁##(首先是NP):##NP NP#     |           / \              /  \#N PN N NP RC编号#                                     / \#NP五##所有树叶(N、PN和V)都是水牛。#两个第一产生式与两个第一生成式同构#ECS441语法,第三个语法也有一个叶子#以及类似结构的另外两个分支。#现在是buffa2grammar的顶级S生成,S->NP VP#展开为:###S公司#    / \#NP副总裁#     / \#V NP公司##同样具有一片叶子(V)和两个分支到NP。#(反映右侧子树,得到二叉树#与NP的最后产物同构,如上)。#所以,除了大小为1和2的结构外,buffa2grammar#应生成与ECS441语法相同的序列:# [0, 0, 1, 2, 3, 6, 11, 22, 44, 90, 187, 392]#它确实如此。#Q.E.D.公司。#(Antti Karttunen,波伏奥,2008年2月28日)。###因此,我们没有“水牛”和“水牛水牛”的替代品,#然后是值A007477号[2] ..A007477号[23]#给出下列句子的可选分句的值#水牛^3到水牛^24:##1个# 2#3个# 6#11个# 22#44个# 90# 187# 392# 832# 1778# 3831# 8304# 18104# 39666# 87296# 192896# 427778# 951808# 2124135# 4753476##从Maple过程定义转换而来:#A007477号:=proc(n)选项记忆;局部k;如果n<=1,则另加1(A007477号(k)*A007477号(n-k-2),k=0..n-2);fi;结束;#从数组导入*定义gen_n_items(n,item):对于xrange(n)中的i:产量(项)定义备忘录(有趣):最大内存大小=131#072未填充=0Lmemo=数组('L')定义包装器(n):memsiznow=长度(备忘录)if None==n:return(memo)#用于调试elif n>=memsiznow:新闻大小=最小值(最大内存大小,最大值(n+1,2*memsiznow))memo.extend(gen_n_items(newsize memsiznow,未填充))res=备忘录[n]如果(notfilled==res):res=乐趣(n)备忘录[n]=res返回(res)else:返回(res)返回包装器#通过备忘录,我们可以更快地获得结果:@已记录定义A007477号(n) :''计算A007477号(n) “”如果(n<2):返回(1)其他:s=0对于范围(n-1)中的k:s+=(A007477号(k)*A007477号(n-k-2)返回sys.stdout.write(“A007477号[0..31]如下:“+str([A007477号(n) 对于范围(31)])+“\n”)中的n