From a827e89107b2698848d7641d49c3f03b777e01d3 Mon Sep 17 00:00:00 2001 From: Mysaa Date: Tue, 28 Nov 2023 17:59:58 +0100 Subject: [PATCH] =?UTF-8?q?Merge=20de=20la=20branche=20s=C3=A9mantique=20d?= =?UTF-8?q?e=20JH?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CategoriesGramaticalesCombinatoire.ods | Bin 28323 -> 30539 bytes test.ipynb | 1578 +++++++----------------- 2 files changed, 429 insertions(+), 1149 deletions(-) diff --git a/CategoriesGramaticalesCombinatoire.ods b/CategoriesGramaticalesCombinatoire.ods index 1a1f10acd2fd6864df80ed64808c1d2abe21e7fe..ea20c178d7c2b887f92616781aef2a3bdb3ce746 100644 GIT binary patch delta 28780 zcmZ2{m+|yFMxFp~W)=|!1`Y-WbJmGGK}_bX6BCpsyEE~zLBuA%WmKB@PK3#vb#f)6 z(q#V}J}!g?kmTfoY#t<`i3v&*cL;%$+b~*#sJDz}AgYql0&KPc8wUpmgE{NwXeL`m zki;xz>H5jun zO~vOumHWA;`0GE{t7yBo&F#HFF9(-{_u{D9TMPAnZ%^!-w<>&T=B%)$05`t$3wk!q ztC{n!hUvIln|z6yacf)Hi(fop7Mf>RzoZFn-!h{)?C1>H`d{zvxF*<0iYXcWwtcfTRSioFt|lAyYTUcAa{m9^#H4&_ zi?3d#{a&A*9>0-(Z5`kIXo>j63Az8%9vH6L_R>#0{AtbJHw(+=aqN}Ua*L1&lA4s` zFFes`;)jlnHj8c2mmI0*msvXL(YaHfY!#KxxkR~`=$-g8rQ-0kkbt$HyZNtPIA0z* z|C>qe^b7ojpDKHQvhOTE6~Bo&TJ(>8%~kOqEK+-Jf4Tbm+l|A=cUI4Fwdqp+_AL7~ zyWOqB+vmtv2;EU=_s*|tD48MJ^?Xm`u8az|OUjRZj_%2DVD$g2md@!btXaSP;-8bz zpVr53EZxWcI!f})uGRgrEthz1{XDzCb;^a(*~hv{LeCazrCjDb6x#WITZjB#!>joL z-s~K~FFd<9GcqvbGczziQW7L~Yr+|j02c!TLvcxEPHM4UMQ+aB=+{NJcZmMGzx;v5 zWk2iSSySpo)VF16Up||+>-IY1xfYqr_m?FIEx9m(g`Gjy+W$&z-<}BmJQa_LBC7Fa z(Uy~ESg>2%-}#6kMDO06r!&jDCDpg=m~+%C)ccxq3tUg|Pa&`UpE zTJcn^2Ug*b~QZ*94ky5vVp_uahh>bI8) zS=!s%^NU>FbS&^}c$iLbOrgjF9`8h(8S~FDpPrrExa`s7J$fpsS5{6I-E1BGz}m2M z)05KYn}T{O9+)KTSmINE#PF8#txwxD*4W6q|P zBE_fAy-3?NU1YQM?iHV;�~LXSr2qvgCA`N&L1Rjx#dfGN#x%MTX37`@HnU>8^fx zCeP2QPp%yFoBYy~UrHxRP3HWs&klxHcQ7Oi-`82I9q6>0X${NO(9acYwW!a^`Ni`^1kAR?SZ*{j2OiwRA*8U{- zY2^_QOG|gt^3z*QCJJAQ$Kz=Eibiw^DGB%_ban4Se!_aq8MwFi^+*QS`I_KI48*h`?i5-D{!Vmv)*Y=-OSjTsN zb3(O0Yv{BO_x^p&zxVaFV?pdOcV}@PQC{P9yYpAO_6UchE>qvGExjO1_^a}qRO8ce zN^L=Hr+VX^HXip8$arGPxg$|D>X+d|CecmH+hc#%mrgNPoBaF#I~Udx1#jV1C+E~m zeBHVE|3_j2d^PgEZqj9{(#-&-=Y?iJy`lpT`j% z?hM|)=Vyp|CGsY3KR46mQtJn)uyAgz1_0#QO3*CPMI^mjvn58&tY}(XXRT5 z*lgPNrO6(NFXqXPG8@Xg3UjgpI&+RcenMyegEbNfBc&M@3PV#&10Y5tNi{oKVxy--0wck zJzY;F)odcKEM4W=zrlv-W=mdHvb5*wD76orPRZ$NAU9U2ea= zK5|OS+#5F^i*9C~adyH7Bj@jR-G^t(Kec@QRq*`I(C2Gb@0)#U?-8~1bH9qxn(lQM z?iD}3@OzTa`?#d~-Hfx=e0M+aae;`Dm(5|8k@cMXb-$QL$e)!)@ARh}b6=aAAUnA@a7j^~S60iz)!~U2cO%{x zs?ONF*LJeovM!&CFaG>7=-uad{+;~F(=NG-JidBO-uhEL=(}Y9qKl6g{^~P4HP4<~ z=fvJ$DzA(ep1pHf({9bh-^D8Yul=vq*ZzOh)oZe0*25G3uFiNnL%>jdBD2#Ij=Ai! z!WVxo-20lj#BM>pRowHZE6$yMe$6s${>!eK12umH{(kUzlly(%2HmW6cb3mtHr45{ z?DKuhn`hn2_26HxelB;}zP-k~PhRQ1RQ6%#dA6vJBjYFMXc{voq4`lZrNS$OW$@c>-qU;*-9g6i=1-TSsPjW zqCfasyD#DUc1ZGE?eb?v5>1M%T|1TY_-}DP`j%0AagW8-dhxvn4V0Ll{tTQI{fY00 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 z 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 delta 26509 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%0D61$A3QG^jP`m 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\",span,start)\n", - " \n", " bestedge = None\n", " nedg = 0\n", " # edges[s] is the best edge generating the category s\n", @@ -138,7 +136,7 @@ " edge = CCGEdge(\n", " span=(left.start(), right.end()),\n", " categ=res,\n", - " rule=BinaryCombinatorRule(rule),\n", + " rule=rule,\n", " )\n", " edge.weight = rweight(rule) * left.weight * right.weight\n", " edge.triple = (rule,left,right)\n", @@ -155,35 +153,34 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 48, "metadata": {}, "outputs": [], "source": [ - "def wpToTree(edge):\n", + "def wp_to_tree(edge, wChart):\n", " if isinstance(edge,CCGLeafEdge):\n", - " return Tree((edge.token(),\"Leaf\"),[Tree(edge.token(),[edge.leaf()])])\n", + " word = Tree(edge.token(), [wChart._tokens[edge.start()]])\n", + " leaf = Tree((edge.token(), \"Leaf\"), [word])\n", + " return leaf\n", " else:\n", - " return Tree(\n", - " (chart.Token(None,edge.categ()),edge.triple[0].__str__()),\n", - " [wpToTree(t) for t in (edge.triple[1:])])" + " children = [wp_to_tree(t, wChart) for t in (edge.triple[1:])]\n", + " lhs = Token(wChart._tokens[edge.start() : edge.end()],\n", + " edge.lhs(),\n", + " compute_semantics(children, edge))\n", + " return Tree((lhs,edge.triple[0].__str__()), children)" ] }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 49, "metadata": {}, "outputs": [], "source": [ "def bestTree(tokens, lex, rules):\n", - " # We build the weighgted parse tree using cky\n", - " wChart = weightedParse(tokens, lex, rules)\n", - " # We get the biggest edge\n", - " e = list(wChart.select(start=0,end=len(tokens)))[0]\n", - " print(\"Edge count:\",len(list(wChart.select(start=0,end=len(tokens)))))\n", - " # We get the tree that brought us to this edge\n", - " t = wChart._trees(e, True, dict(), Tree)[0]\n", - " # (wpToTree(e),e.weight)\n", - " return (t,e.weight)" + " wChart = weightedParse(tokens, lex, rules) # We build the weighgted parse tree using cky\n", + " edge = list(wChart.select(start=0,end=len(tokens)))[0] # We get the biggest edge\n", + " t = wp_to_tree(edge, wChart) # We get the tree that brought us to this edge\n", + " return (t,edge.weight)" ] }, { @@ -195,7 +192,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 50, "metadata": {}, "outputs": [], "source": [ @@ -203,7 +200,7 @@ "from nltk.sem.logic import Expression\n", "from nltk.ccg.api import PrimitiveCategory\n", "\n", - "def to_pseudo_entries(table, consider_semantics = True):\n", + "def to_pseudo_entries(table, consider_semantics = False):\n", " \"\"\"returns a list of lists in the format ['word', 'category', 'weight', None]\n", " if consider_semantics == false else ['word', 'category', weight, 'semantic']\n", " that is left to be converted into tokens by to_wlex_entries\"\"\"\n", @@ -247,7 +244,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 51, "metadata": {}, "outputs": [], "source": [ @@ -261,7 +258,7 @@ "#print(table.keys())\n", "\n", "# On le convertit en Lexique pondéré\n", - "pe = to_pseudo_entries(table, consider_semantics = False)\n", + "pe = to_pseudo_entries(table, consider_semantics = True)\n", "#print(pe)\n", "wEntries = to_wlex_entries(pseudo_entries= pe, primitives= primitives, families= families)\n", "#print([list(map(lambda x: f\"{k} : \"+ str(x) + str(x._semantics), L)) for k, L in wEntries.items()])\n", @@ -296,1150 +293,377 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 52, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", + "1 found derivation for sentence: le chat dort\n", + " le chat dort\n", + " (N/pN) {\\P.exists x.P(x)} pN {chat} (S\\N) {\\n.dormir(n)}\n", + "-------------------------------------->\n", + " N {exists x.chat(x)}\n", + "------------------------------------------------------------<\n", + " S {dormir(exists x.chat(x))}\n", + "Best derivation tree has weight 0.5599999999999999\n", + " le chat dort\n", + " (N/pN) {\\P.exists x.P(x)} pN {chat} (S\\N) {\\n.dormir(n)}\n", + "-------------------------------------->\n", + " N {exists x.chat(x)}\n", + "------------------------------------------------------------<\n", + " S {dormir(exists x.chat(x))}\n", + "##########################################\n", + "1 found derivation for sentence: il dort\n", + " il dort\n", + " N {il} (S\\N) {\\n.dormir(n)}\n", "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", + " S {dormir(il)}\n", + "Best derivation tree has weight 0.7\n", + " il dort\n", + " N {il} (S\\N) {\\n.dormir(n)}\n", "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", + " S {dormir(il)}\n", + "##########################################\n", + "1 found derivation for sentence: le chat dort paisiblement\n", + " le chat dort paisiblement\n", + " (N/pN) {\\P.exists x.P(x)} pN {chat} (S\\N) {\\n.dormir(n)} ((S\\N)\\(S\\N)) {\\V n.paisiblement(V(n))}\n", + "-------------------------------------->\n", + " N {exists x.chat(x)}\n", + " ---------------------------------------------------------------<\n", + " (S\\N) {\\n.paisiblement(dormir(n))}\n", + "-----------------------------------------------------------------------------------------------------<\n", + " S {paisiblement(dormir(exists x.chat(x)))}\n", + "Best derivation tree has weight 0.39199999999999996\n", + " le chat dort paisiblement\n", + " (N/pN) {\\P.exists x.P(x)} pN {chat} (S\\N) {\\n.dormir(n)} ((S\\N)\\(S\\N)) {\\V n.paisiblement(V(n))}\n", + "-------------------------------------->\n", + " N {exists x.chat(x)}\n", + " ---------------------------------------------------------------<\n", + " (S\\N) {\\n.paisiblement(dormir(n))}\n", + "-----------------------------------------------------------------------------------------------------<\n", + " S {paisiblement(dormir(exists x.chat(x)))}\n", + "##########################################\n", + "1 found derivation for sentence: le chat noir dort\n", + " le chat noir dort\n", + " (N/pN) {\\P.exists x.P(x)} pN {chat} (pN\\pN) {\\n.noir(n)} (S\\N) {\\n.dormir(n)}\n", + " ---------------------------------<\n", + " pN {noir(chat)}\n", + "------------------------------------------------------------>\n", + " N {exists x.noir(chat,x)}\n", + "----------------------------------------------------------------------------------<\n", + " S {dormir(exists x.noir(chat,x))}\n", + "Best derivation tree has weight 0.39199999999999996\n", + " le chat noir dort\n", + " (N/pN) {\\P.exists x.P(x)} pN {chat} (pN\\pN) {\\n.noir(n)} (S\\N) {\\n.dormir(n)}\n", + " ---------------------------------<\n", + " pN {noir(chat)}\n", + "------------------------------------------------------------>\n", + " N {exists x.noir(chat,x)}\n", + "----------------------------------------------------------------------------------<\n", + " S {dormir(exists x.noir(chat,x))}\n", "##########################################\n", "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", + " le méchant chat dort\n", + " (N/pN) {\\P.exists x.P(x)} (pN/pN) {\\n.méchant(n)} pN {chat} (S\\N) {\\n.dormir(n)}\n", + " ------------------------------------>\n", + " pN {méchant(chat)}\n", + "--------------------------------------------------------------->\n", + " N {exists x.méchant(chat,x)}\n", + "-------------------------------------------------------------------------------------<\n", + " S {dormir(exists x.méchant(chat,x))}\n", + " le méchant chat dort\n", + " (N/pN) {\\P.exists x.P(x)} (pN/pN) {\\n.méchant(n)} pN {chat} (S\\N) {\\n.dormir(n)}\n", + "---------------------------------------------------->B\n", + " (N/pN) {\\n.exists x.méchant(n,x)}\n", + "--------------------------------------------------------------->\n", + " N {exists x.méchant(chat,x)}\n", + "-------------------------------------------------------------------------------------<\n", + " S {dormir(exists x.méchant(chat,x))}\n", + "Unknown rule >B\n", + "Unknown rule >B\n", + "Best derivation tree has weight 0.44800000000000006\n", + " le méchant chat dort\n", + " (N/pN) {\\P.exists x.P(x)} (pN/pN) {\\n.méchant(n)} pN {chat} (S\\N) {\\n.dormir(n)}\n", + " ------------------------------------>\n", + " pN {méchant(chat)}\n", + "--------------------------------------------------------------->\n", + " N {exists x.méchant(chat,x)}\n", + "-------------------------------------------------------------------------------------<\n", + " S {dormir(exists x.méchant(chat,x))}\n", "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", + "4 found derivation for sentence: le très méchant chat dort\n", + " le très méchant chat dort\n", + " (N/pN) {\\P.exists x.P(x)} ((pN/pN)/(pN/pN)) {\\P n.très(P(n))} (pN/pN) {\\n.méchant(n)} pN {chat} (S\\N) {\\n.dormir(n)}\n", + " -------------------------------------------------------------->\n", + " (pN/pN) {\\n.très(méchant(n))}\n", + " ------------------------------------------------------------------------->\n", + " pN {très(méchant(chat))}\n", + "---------------------------------------------------------------------------------------------------->\n", + " N {exists x.très(méchant(chat),x)}\n", + "--------------------------------------------------------------------------------------------------------------------------<\n", + " S {dormir(exists x.très(méchant(chat),x))}\n", + " le très méchant chat dort\n", + " (N/pN) {\\P.exists x.P(x)} ((pN/pN)/(pN/pN)) {\\P n.très(P(n))} (pN\\pN) {\\n.méchant(n)} pN {chat} (S\\N) {\\n.dormir(n)}\n", + " -------------------------------------------------------------->\n", + " (pN/pN) {\\n.très(méchant(n))}\n", + " ------------------------------------------------------------------------->\n", + " pN {très(méchant(chat))}\n", + "---------------------------------------------------------------------------------------------------->\n", + " N {exists x.très(méchant(chat),x)}\n", + "--------------------------------------------------------------------------------------------------------------------------<\n", + " S {dormir(exists x.très(méchant(chat),x))}\n", + " le très méchant chat dort\n", + " (N/pN) {\\P.exists x.P(x)} ((pN/pN)/(pN/pN)) {\\P n.très(P(n))} (pN/pN) {\\n.méchant(n)} pN {chat} (S\\N) {\\n.dormir(n)}\n", + " -------------------------------------------------------------->\n", + " (pN/pN) {\\n.très(méchant(n))}\n", + "----------------------------------------------------------------------------------------->B\n", + " (N/pN) {\\n.exists x.très(méchant(n),x)}\n", + "---------------------------------------------------------------------------------------------------->\n", + " N {exists x.très(méchant(chat),x)}\n", + "--------------------------------------------------------------------------------------------------------------------------<\n", + " S {dormir(exists x.très(méchant(chat),x))}\n", + " le très méchant chat dort\n", + " (N/pN) {\\P.exists x.P(x)} ((pN/pN)/(pN/pN)) {\\P n.très(P(n))} (pN\\pN) {\\n.méchant(n)} pN {chat} (S\\N) {\\n.dormir(n)}\n", + " -------------------------------------------------------------->\n", + " (pN/pN) {\\n.très(méchant(n))}\n", + "----------------------------------------------------------------------------------------->B\n", + " (N/pN) {\\n.exists x.très(méchant(n),x)}\n", + "---------------------------------------------------------------------------------------------------->\n", + " N {exists x.très(méchant(chat),x)}\n", + "--------------------------------------------------------------------------------------------------------------------------<\n", + " S {dormir(exists x.très(méchant(chat),x))}\n", + "Unknown rule >B\n", + "Best derivation tree has weight 0.35840000000000005\n", + " le très méchant chat dort\n", + " (N/pN) {\\P.exists x.P(x)} ((pN/pN)/(pN/pN)) {\\P n.très(P(n))} (pN/pN) {\\n.méchant(n)} pN {chat} (S\\N) {\\n.dormir(n)}\n", + " -------------------------------------------------------------->\n", + " (pN/pN) {\\n.très(méchant(n))}\n", + " ------------------------------------------------------------------------->\n", + " pN {très(méchant(chat))}\n", + "---------------------------------------------------------------------------------------------------->\n", + " N {exists x.très(méchant(chat),x)}\n", + "--------------------------------------------------------------------------------------------------------------------------<\n", + " S {dormir(exists x.très(méchant(chat),x))}\n", "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "##########################################\n", - "2 found derivation for sentence: le méchant chat dort\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - "----------------->B\n", - " (N/pN)\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", - "==> 2 0\n", - "==> 2 1\n", - "==> 2 2\n", - "==> 3 0\n", - "==> 3 1\n", - "==> 4 0\n", - "Edge count: 1\n", - "Best derivation tree has weight 0.24957917865181148\n", - " le méchant chat dort\n", - " (N/pN) (pN/pN) pN (S\\N)\n", - " --------------->\n", - " pN\n", - "----------------------->\n", - " N\n", - "------------------------------<\n", - " S\n", + "9 found derivation for sentence: le chat de la sœur de mon voisin dort\n", + " le chat de la sœur de mon voisin dort\n", + " (N/pN) {\\P.exists x.P(x)} pN {chat} ((N/N)\\N) {\\n m.de(n,m)} (N/pN) {\\P.exists x.P(x)} pN {soeur} ((N/N)\\N) {\\n m.de(n,m)} (N/pN) {\\P.exists x.P(x)} pN {voisin} (S\\N) {\\n.dormir(n)}\n", + "-------------------------------------->\n", + " N {exists x.chat(x)}\n", + "----------------------------------------------------------------<\n", + " (N/N) {\\m.de(exists x.chat(x),m)}\n", + " --------------------------------------->\n", + " N {exists x.soeur(x)}\n", + " -----------------------------------------------------------------<\n", + " (N/N) {\\m.de(exists x.soeur(x),m)}\n", + " ---------------------------------------->\n", + " N {exists x.voisin(x)}\n", + " --------------------------------------------------------------------------------------------------------->\n", + " N {de(exists x.soeur(x),exists x.voisin(x))}\n", + "------------------------------------------------------------------------------------------------------------------------------------------------------------------------->\n", + " N {de(exists x.chat(x),de(exists x.soeur(x),exists x.voisin(x)))}\n", + "-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------<\n", + " S {dormir(de(exists x.chat(x),de(exists x.soeur(x),exists x.voisin(x))))}\n", + " le chat de la sœur de mon voisin dort\n", + " (N/pN) {\\P.exists x.P(x)} pN {chat} ((N/N)\\N) {\\n m.de(n,m)} (N/pN) {\\P.exists x.P(x)} pN {soeur} ((N/N)\\N) {\\n m.de(n,m)} (N/pN) {\\P.exists x.P(x)} pN {voisin} (S\\N) {\\n.dormir(n)}\n", + "-------------------------------------->\n", + " N {exists x.chat(x)}\n", + "----------------------------------------------------------------<\n", + " (N/N) {\\m.de(exists x.chat(x),m)}\n", + " --------------------------------------->\n", + " N {exists x.soeur(x)}\n", + " -----------------------------------------------------------------<\n", + " (N/N) {\\m.de(exists x.soeur(x),m)}\n", + " -------------------------------------------------------------------------------------------->B\n", + " (N/pN) {\\P.de(exists x.soeur(x),exists x.P(x))}\n", + " --------------------------------------------------------------------------------------------------------->\n", + " N {de(exists x.soeur(x),exists x.voisin(x))}\n", + "------------------------------------------------------------------------------------------------------------------------------------------------------------------------->\n", + " N {de(exists x.chat(x),de(exists x.soeur(x),exists x.voisin(x)))}\n", + "-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------<\n", + " S {dormir(de(exists x.chat(x),de(exists x.soeur(x),exists x.voisin(x))))}\n", + " le chat de la sœur de mon voisin dort\n", + " (N/pN) {\\P.exists x.P(x)} pN {chat} ((N/N)\\N) {\\n m.de(n,m)} (N/pN) {\\P.exists x.P(x)} pN {soeur} ((N/N)\\N) {\\n m.de(n,m)} (N/pN) {\\P.exists x.P(x)} pN {voisin} (S\\N) {\\n.dormir(n)}\n", + "-------------------------------------->\n", + " N {exists x.chat(x)}\n", + "----------------------------------------------------------------<\n", + " (N/N) {\\m.de(exists x.chat(x),m)}\n", + " --------------------------------------->\n", + " N {exists x.soeur(x)}\n", + " -----------------------------------------------------------------<\n", + " (N/N) {\\m.de(exists x.soeur(x),m)}\n", + "--------------------------------------------------------------------------------------------------------------------------------->B\n", + " (N/N) {\\m.de(exists x.chat(x),de(exists x.soeur(x),m))}\n", + " ---------------------------------------->\n", + " N {exists x.voisin(x)}\n", + "------------------------------------------------------------------------------------------------------------------------------------------------------------------------->\n", + " N {de(exists x.chat(x),de(exists x.soeur(x),exists x.voisin(x)))}\n", + "-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------<\n", + " S {dormir(de(exists x.chat(x),de(exists x.soeur(x),exists x.voisin(x))))}\n", + " le chat de la sœur de mon voisin dort\n", + " (N/pN) {\\P.exists x.P(x)} pN {chat} ((N/N)\\N) {\\n m.de(n,m)} (N/pN) {\\P.exists x.P(x)} pN {soeur} ((N/N)\\N) {\\n m.de(n,m)} (N/pN) {\\P.exists x.P(x)} pN {voisin} (S\\N) {\\n.dormir(n)}\n", + "-------------------------------------->\n", + " N {exists x.chat(x)}\n", + "----------------------------------------------------------------<\n", + " (N/N) {\\m.de(exists x.chat(x),m)}\n", + " --------------------------------------->\n", + " N {exists x.soeur(x)}\n", + "------------------------------------------------------------------------------------------------------->\n", + " N {de(exists x.chat(x),exists x.soeur(x))}\n", + "---------------------------------------------------------------------------------------------------------------------------------<\n", + " (N/N) {\\m.de(de(exists x.chat(x),exists x.soeur(x)),m)}\n", + " ---------------------------------------->\n", + " N {exists x.voisin(x)}\n", + "------------------------------------------------------------------------------------------------------------------------------------------------------------------------->\n", + " N {de(de(exists x.chat(x),exists x.soeur(x)),exists x.voisin(x))}\n", + "-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------<\n", + " S {dormir(de(de(exists x.chat(x),exists x.soeur(x)),exists x.voisin(x)))}\n", + " le chat de la sœur de mon voisin dort\n", + " (N/pN) {\\P.exists x.P(x)} pN {chat} ((N/N)\\N) {\\n m.de(n,m)} (N/pN) {\\P.exists x.P(x)} pN {soeur} ((N/N)\\N) {\\n m.de(n,m)} (N/pN) {\\P.exists x.P(x)} pN {voisin} (S\\N) {\\n.dormir(n)}\n", + "-------------------------------------->\n", + " N {exists x.chat(x)}\n", + "----------------------------------------------------------------<\n", + " (N/N) {\\m.de(exists x.chat(x),m)}\n", + "------------------------------------------------------------------------------------------->B\n", + " (N/pN) {\\P.de(exists x.chat(x),exists x.P(x))}\n", + "------------------------------------------------------------------------------------------------------->\n", + " N {de(exists x.chat(x),exists x.soeur(x))}\n", + "---------------------------------------------------------------------------------------------------------------------------------<\n", + " (N/N) {\\m.de(de(exists x.chat(x),exists x.soeur(x)),m)}\n", + " ---------------------------------------->\n", + " N {exists x.voisin(x)}\n", + "------------------------------------------------------------------------------------------------------------------------------------------------------------------------->\n", + " N {de(de(exists x.chat(x),exists x.soeur(x)),exists x.voisin(x))}\n", + "-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------<\n", + " S {dormir(de(de(exists x.chat(x),exists x.soeur(x)),exists x.voisin(x)))}\n", + " le chat de la sœur de mon voisin dort\n", + " (N/pN) {\\P.exists x.P(x)} pN {chat} ((N/N)\\N) {\\n m.de(n,m)} (N/pN) {\\P.exists x.P(x)} pN {soeur} ((N/N)\\N) {\\n m.de(n,m)} (N/pN) {\\P.exists x.P(x)} pN {voisin} (S\\N) {\\n.dormir(n)}\n", + "-------------------------------------->\n", + " N {exists x.chat(x)}\n", + "----------------------------------------------------------------<\n", + " (N/N) {\\m.de(exists x.chat(x),m)}\n", + " --------------------------------------->\n", + " N {exists x.soeur(x)}\n", + " -----------------------------------------------------------------<\n", + " (N/N) {\\m.de(exists x.soeur(x),m)}\n", + " -------------------------------------------------------------------------------------------->B\n", + " (N/pN) {\\P.de(exists x.soeur(x),exists x.P(x))}\n", + "------------------------------------------------------------------------------------------------------------------------------------------------------------>B\n", + " (N/pN) {\\P.de(exists x.chat(x),de(exists x.soeur(x),exists x.P(x)))}\n", + "------------------------------------------------------------------------------------------------------------------------------------------------------------------------->\n", + " N {de(exists x.chat(x),de(exists x.soeur(x),exists x.voisin(x)))}\n", + "-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------<\n", + " S {dormir(de(exists x.chat(x),de(exists x.soeur(x),exists x.voisin(x))))}\n", + " le chat de la sœur de mon voisin dort\n", + " (N/pN) {\\P.exists x.P(x)} pN {chat} ((N/N)\\N) {\\n m.de(n,m)} (N/pN) {\\P.exists x.P(x)} pN {soeur} ((N/N)\\N) {\\n m.de(n,m)} (N/pN) {\\P.exists x.P(x)} pN {voisin} (S\\N) {\\n.dormir(n)}\n", + "-------------------------------------->\n", + " N {exists x.chat(x)}\n", + "----------------------------------------------------------------<\n", + " (N/N) {\\m.de(exists x.chat(x),m)}\n", + " --------------------------------------->\n", + " N {exists x.soeur(x)}\n", + " -----------------------------------------------------------------<\n", + " (N/N) {\\m.de(exists x.soeur(x),m)}\n", + "--------------------------------------------------------------------------------------------------------------------------------->B\n", + " (N/N) {\\m.de(exists x.chat(x),de(exists x.soeur(x),m))}\n", + "------------------------------------------------------------------------------------------------------------------------------------------------------------>B\n", + " (N/pN) {\\P.de(exists x.chat(x),de(exists x.soeur(x),exists x.P(x)))}\n", + "------------------------------------------------------------------------------------------------------------------------------------------------------------------------->\n", + " N {de(exists x.chat(x),de(exists x.soeur(x),exists x.voisin(x)))}\n", + "-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------<\n", + " S {dormir(de(exists x.chat(x),de(exists x.soeur(x),exists x.voisin(x))))}\n", + " le chat de la sœur de mon voisin dort\n", + " (N/pN) {\\P.exists x.P(x)} pN {chat} ((N/N)\\N) {\\n m.de(n,m)} (N/pN) {\\P.exists x.P(x)} pN {soeur} ((N/N)\\N) {\\n m.de(n,m)} (N/pN) {\\P.exists x.P(x)} pN {voisin} (S\\N) {\\n.dormir(n)}\n", + "-------------------------------------->\n", + " N {exists x.chat(x)}\n", + "----------------------------------------------------------------<\n", + " (N/N) {\\m.de(exists x.chat(x),m)}\n", + " --------------------------------------->\n", + " N {exists x.soeur(x)}\n", + "------------------------------------------------------------------------------------------------------->\n", + " N {de(exists x.chat(x),exists x.soeur(x))}\n", + "---------------------------------------------------------------------------------------------------------------------------------<\n", + " (N/N) {\\m.de(de(exists x.chat(x),exists x.soeur(x)),m)}\n", + "------------------------------------------------------------------------------------------------------------------------------------------------------------>B\n", + " (N/pN) {\\P.de(de(exists x.chat(x),exists x.soeur(x)),exists x.P(x))}\n", + "------------------------------------------------------------------------------------------------------------------------------------------------------------------------->\n", + " N {de(de(exists x.chat(x),exists x.soeur(x)),exists x.voisin(x))}\n", + "-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------<\n", + " S {dormir(de(de(exists x.chat(x),exists x.soeur(x)),exists x.voisin(x)))}\n", + " le chat de la sœur de mon voisin dort\n", + " (N/pN) {\\P.exists x.P(x)} pN {chat} ((N/N)\\N) {\\n m.de(n,m)} (N/pN) {\\P.exists x.P(x)} pN {soeur} ((N/N)\\N) {\\n m.de(n,m)} (N/pN) {\\P.exists x.P(x)} pN {voisin} (S\\N) {\\n.dormir(n)}\n", + "-------------------------------------->\n", + " N {exists x.chat(x)}\n", + "----------------------------------------------------------------<\n", + " (N/N) {\\m.de(exists x.chat(x),m)}\n", + "------------------------------------------------------------------------------------------->B\n", + " (N/pN) {\\P.de(exists x.chat(x),exists x.P(x))}\n", + "------------------------------------------------------------------------------------------------------->\n", + " N {de(exists x.chat(x),exists x.soeur(x))}\n", + "---------------------------------------------------------------------------------------------------------------------------------<\n", + " (N/N) {\\m.de(de(exists x.chat(x),exists x.soeur(x)),m)}\n", + "------------------------------------------------------------------------------------------------------------------------------------------------------------>B\n", + " (N/pN) {\\P.de(de(exists x.chat(x),exists x.soeur(x)),exists x.P(x))}\n", + "------------------------------------------------------------------------------------------------------------------------------------------------------------------------->\n", + " N {de(de(exists x.chat(x),exists x.soeur(x)),exists x.voisin(x))}\n", + "-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------<\n", + " S {dormir(de(de(exists x.chat(x),exists x.soeur(x)),exists x.voisin(x)))}\n", + "Unknown rule >B\n", + "Unknown rule >B\n", + "Unknown rule >B\n", + "Unknown rule >B\n", + "Unknown rule >B\n", + "Best derivation tree has weight 0.11239423999999998\n", + " le chat de la sœur de mon voisin dort\n", + " (N/pN) {\\P.exists x.P(x)} pN {chat} ((N/N)\\N) {\\n m.de(n,m)} (N/pN) {\\P.exists x.P(x)} pN {soeur} ((N/N)\\N) {\\n m.de(n,m)} (N/pN) {\\P.exists x.P(x)} pN {voisin} (S\\N) {\\n.dormir(n)}\n", + "-------------------------------------->\n", + " N {exists x.chat(x)}\n", + "----------------------------------------------------------------<\n", + " (N/N) {\\m.de(exists x.chat(x),m)}\n", + " --------------------------------------->\n", + " N {exists x.soeur(x)}\n", + " -----------------------------------------------------------------<\n", + " (N/N) {\\m.de(exists x.soeur(x),m)}\n", + " ---------------------------------------->\n", + " N {exists x.voisin(x)}\n", + " --------------------------------------------------------------------------------------------------------->\n", + " N {de(exists x.soeur(x),exists x.voisin(x))}\n", + "------------------------------------------------------------------------------------------------------------------------------------------------------------------------->\n", + " N {de(exists x.chat(x),de(exists x.soeur(x),exists x.voisin(x)))}\n", + "-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------<\n", + " S {dormir(de(exists x.chat(x),de(exists x.soeur(x),exists x.voisin(x))))}\n", "##########################################\n" ] + }, + { + "ename": "AssertionError", + "evalue": "`{}(\\m.à(donne(exists x.voisin(x)),m))` must be a lambda expression", + "output_type": "error", + "traceback": [ + "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", + "\u001b[0;31mAssertionError\u001b[0m Traceback (most recent call last)", + "Cell \u001b[0;32mIn[52], line 10\u001b[0m\n\u001b[1;32m 7\u001b[0m phrase \u001b[38;5;241m=\u001b[39m phrase\u001b[38;5;241m.\u001b[39mlower()\u001b[38;5;241m.\u001b[39mstrip()\n\u001b[1;32m 9\u001b[0m \u001b[38;5;66;03m# On compte les arbres de dérivation trouvés\u001b[39;00m\n\u001b[0;32m---> 10\u001b[0m i \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mlen\u001b[39m(\u001b[38;5;28mlist\u001b[39m(parser\u001b[38;5;241m.\u001b[39mparse(phrase\u001b[38;5;241m.\u001b[39msplit())))\n\u001b[1;32m 11\u001b[0m \u001b[38;5;28mprint\u001b[39m(i, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfound derivation for sentence:\u001b[39m\u001b[38;5;124m\"\u001b[39m,phrase)\n\u001b[1;32m 12\u001b[0m g \u001b[38;5;241m=\u001b[39m parser\u001b[38;5;241m.\u001b[39mparse(phrase\u001b[38;5;241m.\u001b[39msplit())\n", + "File \u001b[0;32m~/Documents/Arbeiten/Linguistique/.env/lib/python3.11/site-packages/nltk/parse/chart.py:677\u001b[0m, in \u001b[0;36mChart.parses\u001b[0;34m(self, root, tree_class)\u001b[0m\n\u001b[1;32m 672\u001b[0m \u001b[38;5;250m\u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 673\u001b[0m \u001b[38;5;124;03mReturn an iterator of the complete tree structures that span\u001b[39;00m\n\u001b[1;32m 674\u001b[0m \u001b[38;5;124;03mthe entire chart, and whose root node is ``root``.\u001b[39;00m\n\u001b[1;32m 675\u001b[0m \u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 676\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m edge \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mselect(start\u001b[38;5;241m=\u001b[39m\u001b[38;5;241m0\u001b[39m, end\u001b[38;5;241m=\u001b[39m\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_num_leaves, lhs\u001b[38;5;241m=\u001b[39mroot):\n\u001b[0;32m--> 677\u001b[0m \u001b[38;5;28;01myield from\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mtrees\u001b[49m\u001b[43m(\u001b[49m\u001b[43medge\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtree_class\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtree_class\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcomplete\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\u001b[43m)\u001b[49m\n", + "File \u001b[0;32m~/Documents/Arbeiten/Linguistique/.env/lib/python3.11/site-packages/nltk/parse/chart.py:694\u001b[0m, in \u001b[0;36mChart.trees\u001b[0;34m(self, edge, tree_class, complete)\u001b[0m\n\u001b[1;32m 679\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mtrees\u001b[39m(\u001b[38;5;28mself\u001b[39m, edge, tree_class\u001b[38;5;241m=\u001b[39mTree, complete\u001b[38;5;241m=\u001b[39m\u001b[38;5;28;01mFalse\u001b[39;00m):\n\u001b[1;32m 680\u001b[0m \u001b[38;5;250m \u001b[39m\u001b[38;5;124;03m\"\"\"\u001b[39;00m\n\u001b[1;32m 681\u001b[0m \u001b[38;5;124;03m Return an iterator of the tree structures that are associated\u001b[39;00m\n\u001b[1;32m 682\u001b[0m \u001b[38;5;124;03m with ``edge``.\u001b[39;00m\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 692\u001b[0m \u001b[38;5;124;03m sharing, then create a deep copy of each tree.\u001b[39;00m\n\u001b[1;32m 693\u001b[0m \u001b[38;5;124;03m \"\"\"\u001b[39;00m\n\u001b[0;32m--> 694\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28miter\u001b[39m(\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_trees\u001b[49m\u001b[43m(\u001b[49m\u001b[43medge\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcomplete\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmemo\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43m{\u001b[49m\u001b[43m}\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtree_class\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mtree_class\u001b[49m\u001b[43m)\u001b[49m)\n", + "File \u001b[0;32m~/Documents/Arbeiten/Linguistique/.env/lib/python3.11/site-packages/nltk/ccg/chart.py:332\u001b[0m, in \u001b[0;36mCCGChart._trees\u001b[0;34m(self, edge, complete, memo, tree_class)\u001b[0m\n\u001b[1;32m 329\u001b[0m trees \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m 331\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m cpl \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mchild_pointer_lists(edge):\n\u001b[0;32m--> 332\u001b[0m child_choices \u001b[38;5;241m=\u001b[39m \u001b[43m[\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_trees\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcp\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcomplete\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmemo\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtree_class\u001b[49m\u001b[43m)\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mfor\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mcp\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;129;43;01min\u001b[39;49;00m\u001b[43m \u001b[49m\u001b[43mcpl\u001b[49m\u001b[43m]\u001b[49m\n\u001b[1;32m 333\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m children \u001b[38;5;129;01min\u001b[39;00m itertools\u001b[38;5;241m.\u001b[39mproduct(\u001b[38;5;241m*\u001b[39mchild_choices):\n\u001b[1;32m 334\u001b[0m lhs \u001b[38;5;241m=\u001b[39m (\n\u001b[1;32m 335\u001b[0m Token(\n\u001b[1;32m 336\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_tokens[edge\u001b[38;5;241m.\u001b[39mstart() : edge\u001b[38;5;241m.\u001b[39mend()],\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 340\u001b[0m \u001b[38;5;28mstr\u001b[39m(edge\u001b[38;5;241m.\u001b[39mrule()),\n\u001b[1;32m 341\u001b[0m )\n", + "File \u001b[0;32m~/Documents/Arbeiten/Linguistique/.env/lib/python3.11/site-packages/nltk/ccg/chart.py:332\u001b[0m, in \u001b[0;36m\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 329\u001b[0m trees \u001b[38;5;241m=\u001b[39m []\n\u001b[1;32m 331\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m cpl \u001b[38;5;129;01min\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mchild_pointer_lists(edge):\n\u001b[0;32m--> 332\u001b[0m child_choices \u001b[38;5;241m=\u001b[39m [\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_trees\u001b[49m\u001b[43m(\u001b[49m\u001b[43mcp\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mcomplete\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mmemo\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mtree_class\u001b[49m\u001b[43m)\u001b[49m \u001b[38;5;28;01mfor\u001b[39;00m cp \u001b[38;5;129;01min\u001b[39;00m cpl]\n\u001b[1;32m 333\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m children \u001b[38;5;129;01min\u001b[39;00m itertools\u001b[38;5;241m.\u001b[39mproduct(\u001b[38;5;241m*\u001b[39mchild_choices):\n\u001b[1;32m 334\u001b[0m lhs \u001b[38;5;241m=\u001b[39m (\n\u001b[1;32m 335\u001b[0m Token(\n\u001b[1;32m 336\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_tokens[edge\u001b[38;5;241m.\u001b[39mstart() : edge\u001b[38;5;241m.\u001b[39mend()],\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 340\u001b[0m \u001b[38;5;28mstr\u001b[39m(edge\u001b[38;5;241m.\u001b[39mrule()),\n\u001b[1;32m 341\u001b[0m )\n", + "File \u001b[0;32m~/Documents/Arbeiten/Linguistique/.env/lib/python3.11/site-packages/nltk/ccg/chart.py:338\u001b[0m, in \u001b[0;36mCCGChart._trees\u001b[0;34m(self, edge, complete, memo, tree_class)\u001b[0m\n\u001b[1;32m 332\u001b[0m child_choices \u001b[38;5;241m=\u001b[39m [\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_trees(cp, complete, memo, tree_class) \u001b[38;5;28;01mfor\u001b[39;00m cp \u001b[38;5;129;01min\u001b[39;00m cpl]\n\u001b[1;32m 333\u001b[0m \u001b[38;5;28;01mfor\u001b[39;00m children \u001b[38;5;129;01min\u001b[39;00m itertools\u001b[38;5;241m.\u001b[39mproduct(\u001b[38;5;241m*\u001b[39mchild_choices):\n\u001b[1;32m 334\u001b[0m lhs \u001b[38;5;241m=\u001b[39m (\n\u001b[1;32m 335\u001b[0m Token(\n\u001b[1;32m 336\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_tokens[edge\u001b[38;5;241m.\u001b[39mstart() : edge\u001b[38;5;241m.\u001b[39mend()],\n\u001b[1;32m 337\u001b[0m edge\u001b[38;5;241m.\u001b[39mlhs(),\n\u001b[0;32m--> 338\u001b[0m \u001b[43mcompute_semantics\u001b[49m\u001b[43m(\u001b[49m\u001b[43mchildren\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43medge\u001b[49m\u001b[43m)\u001b[49m,\n\u001b[1;32m 339\u001b[0m ),\n\u001b[1;32m 340\u001b[0m \u001b[38;5;28mstr\u001b[39m(edge\u001b[38;5;241m.\u001b[39mrule()),\n\u001b[1;32m 341\u001b[0m )\n\u001b[1;32m 342\u001b[0m trees\u001b[38;5;241m.\u001b[39mappend(tree_class(lhs, children))\n\u001b[1;32m 344\u001b[0m memo[edge] \u001b[38;5;241m=\u001b[39m trees\n", + "File \u001b[0;32m~/Documents/Arbeiten/Linguistique/.env/lib/python3.11/site-packages/nltk/ccg/chart.py:363\u001b[0m, in \u001b[0;36mcompute_semantics\u001b[0;34m(children, edge)\u001b[0m\n\u001b[1;32m 361\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m compute_function_semantics(function, argument)\n\u001b[1;32m 362\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(combinator, UndirectedComposition):\n\u001b[0;32m--> 363\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mcompute_composition_semantics\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfunction\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43margument\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 364\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(combinator, UndirectedSubstitution):\n\u001b[1;32m 365\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m compute_substitution_semantics(function, argument)\n", + "File \u001b[0;32m~/Documents/Arbeiten/Linguistique/.env/lib/python3.11/site-packages/nltk/ccg/logic.py:39\u001b[0m, in \u001b[0;36mcompute_composition_semantics\u001b[0;34m(function, argument)\u001b[0m\n\u001b[1;32m 38\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mcompute_composition_semantics\u001b[39m(function, argument):\n\u001b[0;32m---> 39\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(argument, LambdaExpression), (\n\u001b[1;32m 40\u001b[0m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m`\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;241m+\u001b[39m \u001b[38;5;28mstr\u001b[39m(argument) \u001b[38;5;241m+\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m` must be a lambda expression\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[1;32m 41\u001b[0m )\n\u001b[1;32m 42\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m LambdaExpression(\n\u001b[1;32m 43\u001b[0m argument\u001b[38;5;241m.\u001b[39mvariable, ApplicationExpression(function, argument\u001b[38;5;241m.\u001b[39mterm)\u001b[38;5;241m.\u001b[39msimplify()\n\u001b[1;32m 44\u001b[0m )\n", + "\u001b[0;31mAssertionError\u001b[0m: `{}(\\m.à(donne(exists x.voisin(x)),m))` must be a lambda expression" + ] } ], "source": [ "# On lit les phrases dans le fichier\n", "with open('phrases.txt') as f:\n", " lines = f.readlines()\n", - "\n", - " # On ajoute des phrases de test\n", - " lines.append(\"le chat et la souris dorment\")\n", " \n", " for phrase in lines:\n", " # On met tout en minuscule\n", " phrase = phrase.lower().strip()\n", - " phrase = \"le méchant chat dort\"\n", " \n", " # On compte les arbres de dérivation trouvés\n", " i = len(list(parser.parse(phrase.split())))\n", @@ -1459,12 +683,68 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 33, "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "? => (S\\S) {\\S.exists x.S(x)}\n", + "attrape => ((S\\N)/N) {\\n m.attrappe(m,n)}\n", + "avec => (((S\\N)\\(S\\N))/N) {\\n V m.V(avec(m,n))}\n", + "chat => pN {chat}\n", + "de => ((N/N)\\N) {\\n m.de(n,m)}\n", + "dents => pN {dents}\n", + "donne => (S\\N) {\\n.donne(n)} | ((S\\N)/N) {\\n m.donne(m,n)} | ((S\\N)\\N) {\\n m.donne(n,m)}\n", + "donner => N {donner} | (N/N) {\\n.donner(n)}\n", + "donné => Pp {\\n.donné(n)}\n", + "dorment => (S\\N) {\\n.dormir(n)}\n", + "dort => (S\\N) {\\n.dormir(n)}\n", + "elle => N {elle}\n", + "est => ((S\\N)/_var10) {\\P x.P(x)} | ((S\\N)/(N/N)) {{}} | ((S\\N)/(N\\N)) {{}}\n", + "et => (((S\\N)/(S\\N))\\(S\\N)) {\\P Q x.(P(x) & Q(x))} | ((N/N)\\N) {\\n m.et(n,m)} | ((S/S)\\S) {\\P Q.(P & Q)}\n", + "fromage => pN {fromage}\n", + "il => N {il}\n", + "la => ((S\\N)/((S\\N)/N)) {\\P n.exists m.P(n,m)} | (N/pN) {\\P.exists x.P(x)}\n", + "le => ((S\\N)/((S\\N)/N)) {\\P n.exists m.P(n,m)} | (N/pN) {\\P.exists x.P(x)}\n", + "lui => ((S\\N)/(S\\N)) {\\V n m.à(V(n),m)}\n", + "mange => (S\\N) {\\n.mange(n)} | ((S\\N)/N) {\\n m.mange(m,n)} | ((S\\N)\\N) {\\n m.mange(n,m)}\n", + "mangé => Pp {\\n.mangé(n)}\n", + "mangée => Pp {\\n.mangé(n)}\n", + "mon => (N/pN) {\\P.exists x.P(x)}\n", + "méchant => (pN/pN) {\\n.méchant(n)} | (pN\\pN) {\\n.méchant(n)}\n", + "noir => (pN\\pN) {\\n.noir(n)} | (pN/pN) {\\n.noir(n)}\n", + "paisiblement => ((S\\N)\\(S\\N)) {\\V n.paisiblement(V(n))}\n", + "par => (((S\\N)\\(S\\N))/N) {\\n V.V(n)}\n", + "pourchasse => ((S\\N)/N) {\\n m.pourchasse(m,n)}\n", + "que => ((N\\N)/S) {{}} | (N/S) {\\x.x}\n", + "quel => (((((S\\N)\\(S\\N))/N)\\(S/S))/N) {{}} | ((S/(S\\N))/N) {\\n V x.V(x,n)}\n", + "quelle => (((((S\\N)\\(S\\N))/N)\\(S/S))/N) {{}} | ((S/(S\\N))/N) {\\n V x.V(x,n)}\n", + "qui => ((N\\N)/(S\\N)) {\\V n.V(n)} | (S/(S\\N)) {\\V x.V(x)}\n", + "quoi => (((S/S)\\(((S\\N)\\(S\\N))/N))/N) {{}}\n", + "rat => pN {rat}\n", + "ses => (N/pN) {\\P.exists x.P(x)}\n", + "souhaite => ((S\\N)/N) {\\N m.souhaite(m,N(m))}\n", + "souris => pN {souris}\n", + "sœur => pN {soeur}\n", + "très => ((pN/pN)/(pN/pN)) {\\P n.très(P(n))}\n", + "un => (N/pN) {\\P.exists x.P(x)}\n", + "voisin => pN {voisin}\n", + "à => (((S\\N)\\(S\\N))/N) {\\n V m.V(à(m,n))}\n" + ] + } + ], "source": [ "print(lex)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": {