@@ -182,3 +182,27 @@ def extender(self, edge):
182
182
for (i , j , A , alpha , B1b ) in self .chart [j ]:
183
183
if B1b and B == B1b [0 ]:
184
184
self .add_edge ([i , k , A , alpha + [edge ], B1b [1 :]])
185
+
186
+
187
+ # ______________________________________________________________________________
188
+ # CYK Parsing
189
+
190
+ def CYK_parse (words , grammar ):
191
+ "[Figure 23.5]"
192
+ # We use 0-based indexing instead of the book's 1-based.
193
+ N = len (words )
194
+ P = defaultdict (float )
195
+ # Insert lexical rules for each word.
196
+ for (i , word ) in enumerate (words ):
197
+ for (X , p ) in grammar .categories [word ]: # XXX grammar.categories needs changing, above
198
+ P [X , i , 1 ] = p
199
+ # Combine first and second parts of right-hand sides of rules,
200
+ # from short to long.
201
+ for length in range (2 , N + 1 ):
202
+ for start in range (N - length + 1 ):
203
+ for len1 in range (1 , length ): # N.B. the book incorrectly has N instead of length
204
+ len2 = length - len1
205
+ for (X , Y , Z , p ) in grammar .cnf_rules (): # XXX grammar needs this method
206
+ P [X , start , length ] = max (P [X , start , length ],
207
+ P [Y , start , len1 ] * P [Z , start + len1 , len2 ] * p )
208
+ return P
0 commit comments