nltk 3.2__zip → 3.3__zip
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {nltk-3.2 → nltk-3.3}/INSTALL.txt +6 -6
- {nltk-3.2 → nltk-3.3}/LICENSE.txt +13 -13
- {nltk-3.2 → nltk-3.3}/MANIFEST.in +6 -6
- {nltk-3.2/nltk.egg-info → nltk-3.3}/PKG-INFO +13 -5
- nltk-3.2/README.txt → nltk-3.3/README.md +49 -48
- nltk-3.3/nltk/VERSION +1 -0
- {nltk-3.2 → nltk-3.3}/nltk/__init__.py +185 -185
- {nltk-3.2 → nltk-3.3}/nltk/app/__init__.py +52 -53
- {nltk-3.2 → nltk-3.3}/nltk/app/chartparser_app.py +2276 -2276
- {nltk-3.2 → nltk-3.3}/nltk/app/chunkparser_app.py +1262 -1264
- {nltk-3.2 → nltk-3.3}/nltk/app/collocations_app.py +347 -350
- {nltk-3.2 → nltk-3.3}/nltk/app/concordance_app.py +568 -570
- {nltk-3.2 → nltk-3.3}/nltk/app/nemo_app.py +156 -155
- {nltk-3.2 → nltk-3.3}/nltk/app/rdparser_app.py +892 -894
- {nltk-3.2 → nltk-3.3}/nltk/app/srparser_app.py +809 -809
- {nltk-3.2 → nltk-3.3}/nltk/app/wordfreq_app.py +32 -32
- {nltk-3.2 → nltk-3.3}/nltk/app/wordnet_app.py +968 -968
- {nltk-3.2 → nltk-3.3}/nltk/book.py +91 -90
- {nltk-3.2 → nltk-3.3}/nltk/ccg/__init__.py +22 -22
- {nltk-3.2 → nltk-3.3}/nltk/ccg/api.py +359 -335
- {nltk-3.2 → nltk-3.3}/nltk/ccg/chart.py +394 -361
- {nltk-3.2 → nltk-3.3}/nltk/ccg/combinator.py +343 -312
- {nltk-3.2 → nltk-3.3}/nltk/ccg/lexicon.py +328 -290
- nltk-3.3/nltk/ccg/logic.py +46 -0
- {nltk-3.2 → nltk-3.3}/nltk/chat/__init__.py +49 -49
- {nltk-3.2 → nltk-3.3}/nltk/chat/eliza.py +244 -244
- {nltk-3.2 → nltk-3.3}/nltk/chat/iesha.py +140 -140
- {nltk-3.2 → nltk-3.3}/nltk/chat/rude.py +92 -92
- {nltk-3.2 → nltk-3.3}/nltk/chat/suntsu.py +117 -117
- {nltk-3.2 → nltk-3.3}/nltk/chat/util.py +122 -120
- {nltk-3.2 → nltk-3.3}/nltk/chat/zen.py +282 -282
- {nltk-3.2 → nltk-3.3}/nltk/chunk/__init__.py +190 -190
- {nltk-3.2 → nltk-3.3}/nltk/chunk/api.py +51 -51
- {nltk-3.2 → nltk-3.3}/nltk/chunk/named_entity.py +331 -331
- {nltk-3.2 → nltk-3.3}/nltk/chunk/regexp.py +1390 -1384
- {nltk-3.2 → nltk-3.3}/nltk/chunk/util.py +600 -600
- {nltk-3.2 → nltk-3.3}/nltk/classify/__init__.py +98 -98
- {nltk-3.2 → nltk-3.3}/nltk/classify/api.py +193 -193
- {nltk-3.2 → nltk-3.3}/nltk/classify/decisiontree.py +295 -295
- {nltk-3.2 → nltk-3.3}/nltk/classify/maxent.py +1510 -1492
- {nltk-3.2 → nltk-3.3}/nltk/classify/megam.py +179 -178
- {nltk-3.2 → nltk-3.3}/nltk/classify/naivebayes.py +245 -242
- {nltk-3.2 → nltk-3.3}/nltk/classify/positivenaivebayes.py +170 -170
- {nltk-3.2 → nltk-3.3}/nltk/classify/rte_classify.py +160 -191
- {nltk-3.2 → nltk-3.3}/nltk/classify/scikitlearn.py +153 -151
- {nltk-3.2 → nltk-3.3}/nltk/classify/senna.py +183 -181
- {nltk-3.2 → nltk-3.3}/nltk/classify/svm.py +15 -15
- {nltk-3.2 → nltk-3.3}/nltk/classify/tadm.py +113 -112
- {nltk-3.2 → nltk-3.3}/nltk/classify/textcat.py +193 -193
- {nltk-3.2 → nltk-3.3}/nltk/classify/util.py +324 -312
- {nltk-3.2 → nltk-3.3}/nltk/classify/weka.py +346 -345
- {nltk-3.2 → nltk-3.3}/nltk/cluster/__init__.py +86 -86
- {nltk-3.2 → nltk-3.3}/nltk/cluster/api.py +74 -70
- {nltk-3.2 → nltk-3.3}/nltk/cluster/em.py +247 -247
- {nltk-3.2 → nltk-3.3}/nltk/cluster/gaac.py +168 -168
- {nltk-3.2 → nltk-3.3}/nltk/cluster/kmeans.py +221 -221
- {nltk-3.2 → nltk-3.3}/nltk/cluster/util.py +304 -289
- nltk-3.3/nltk/collections.py +640 -0
- {nltk-3.2 → nltk-3.3}/nltk/collocations.py +388 -388
- nltk-3.3/nltk/compat.py +365 -0
- {nltk-3.2 → nltk-3.3}/nltk/corpus/__init__.py +341 -320
- {nltk-3.2 → nltk-3.3}/nltk/corpus/europarl_raw.py +44 -44
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/__init__.py +147 -145
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/aligned.py +115 -114
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/api.py +448 -446
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/bnc.py +252 -252
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/bracket_parse.py +227 -227
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/categorized_sents.py +179 -178
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/chasen.py +140 -139
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/childes.py +522 -494
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/chunked.py +212 -212
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/cmudict.py +97 -95
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/comparative_sents.py +280 -278
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/conll.py +528 -521
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/crubadan.py +116 -116
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/dependency.py +101 -101
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/framenet.py +3059 -2093
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/ieer.py +112 -111
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/indian.py +85 -86
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/ipipan.py +332 -331
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/knbc.py +187 -187
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/lin.py +156 -156
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/mte.py +311 -310
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/nkjp.py +429 -428
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/nombank.py +421 -421
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/nps_chat.py +73 -73
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/opinion_lexicon.py +115 -115
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/panlex_lite.py +165 -165
- nltk-3.3/nltk/corpus/reader/pl196x.py +292 -0
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/plaintext.py +232 -233
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/ppattach.py +96 -95
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/propbank.py +479 -481
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/pros_cons.py +128 -126
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/reviews.py +330 -328
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/rte.py +144 -146
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/semcor.py +256 -256
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/senseval.py +203 -201
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/sentiwordnet.py +137 -137
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/sinica_treebank.py +75 -75
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/string_category.py +60 -59
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/switchboard.py +119 -119
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/tagged.py +295 -294
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/timit.py +452 -450
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/toolbox.py +68 -68
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/twitter.py +155 -157
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/udhr.py +80 -80
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/util.py +804 -800
- nltk-3.3/nltk/corpus/reader/verbnet.py +595 -0
- nltk-3.3/nltk/corpus/reader/wordlist.py +134 -0
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/wordnet.py +2108 -2036
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/xmldocs.py +392 -387
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/ycoe.py +243 -242
- {nltk-3.2 → nltk-3.3}/nltk/corpus/util.py +144 -127
- {nltk-3.2 → nltk-3.3}/nltk/data.py +1487 -1451
- {nltk-3.2 → nltk-3.3}/nltk/decorators.py +219 -215
- {nltk-3.2 → nltk-3.3}/nltk/downloader.py +2278 -2274
- {nltk-3.2 → nltk-3.3}/nltk/draw/__init__.py +27 -27
- {nltk-3.2 → nltk-3.3}/nltk/draw/cfg.py +774 -777
- {nltk-3.2 → nltk-3.3}/nltk/draw/dispersion.py +58 -58
- {nltk-3.2 → nltk-3.3}/nltk/draw/table.py +1098 -1098
- {nltk-3.2 → nltk-3.3}/nltk/draw/tree.py +963 -966
- {nltk-3.2 → nltk-3.3}/nltk/draw/util.py +2356 -2356
- {nltk-3.2 → nltk-3.3}/nltk/featstruct.py +2617 -2500
- {nltk-3.2 → nltk-3.3}/nltk/grammar.py +1559 -1516
- {nltk-3.2 → nltk-3.3}/nltk/help.py +56 -56
- {nltk-3.2 → nltk-3.3}/nltk/inference/__init__.py +20 -20
- {nltk-3.2 → nltk-3.3}/nltk/inference/api.py +597 -589
- {nltk-3.2 → nltk-3.3}/nltk/inference/discourse.py +612 -608
- {nltk-3.2 → nltk-3.3}/nltk/inference/mace.py +311 -311
- {nltk-3.2 → nltk-3.3}/nltk/inference/nonmonotonic.py +509 -509
- {nltk-3.2 → nltk-3.3}/nltk/inference/prover9.py +431 -431
- {nltk-3.2 → nltk-3.3}/nltk/inference/resolution.py +687 -687
- {nltk-3.2 → nltk-3.3}/nltk/inference/tableau.py +607 -607
- {nltk-3.2 → nltk-3.3}/nltk/internals.py +982 -982
- {nltk-3.2 → nltk-3.3}/nltk/jsontags.py +63 -63
- {nltk-3.2 → nltk-3.3}/nltk/lazyimport.py +142 -142
- {nltk-3.2 → nltk-3.3}/nltk/metrics/__init__.py +30 -29
- {nltk-3.2 → nltk-3.3}/nltk/metrics/agreement.py +421 -401
- nltk-3.3/nltk/metrics/aline.py +607 -0
- {nltk-3.2 → nltk-3.3}/nltk/metrics/association.py +414 -410
- {nltk-3.2 → nltk-3.3}/nltk/metrics/confusionmatrix.py +206 -206
- {nltk-3.2 → nltk-3.3}/nltk/metrics/distance.py +207 -202
- {nltk-3.2 → nltk-3.3}/nltk/metrics/paice.py +381 -381
- {nltk-3.2 → nltk-3.3}/nltk/metrics/scores.py +228 -228
- {nltk-3.2 → nltk-3.3}/nltk/metrics/segmentation.py +231 -232
- {nltk-3.2 → nltk-3.3}/nltk/metrics/spearman.py +69 -69
- {nltk-3.2 → nltk-3.3}/nltk/misc/__init__.py +11 -11
- {nltk-3.2 → nltk-3.3}/nltk/misc/babelfish.py +10 -10
- {nltk-3.2 → nltk-3.3}/nltk/misc/chomsky.py +135 -133
- {nltk-3.2 → nltk-3.3}/nltk/misc/minimalset.py +83 -83
- {nltk-3.2 → nltk-3.3}/nltk/misc/sort.py +157 -157
- {nltk-3.2 → nltk-3.3}/nltk/misc/wordfinder.py +129 -129
- {nltk-3.2 → nltk-3.3}/nltk/parse/__init__.py +81 -80
- {nltk-3.2 → nltk-3.3}/nltk/parse/api.py +66 -66
- {nltk-3.2 → nltk-3.3}/nltk/parse/bllip.py +282 -282
- {nltk-3.2 → nltk-3.3}/nltk/parse/chart.py +1682 -1681
- nltk-3.3/nltk/parse/corenlp.py +780 -0
- {nltk-3.2 → nltk-3.3}/nltk/parse/dependencygraph.py +760 -758
- {nltk-3.2 → nltk-3.3}/nltk/parse/earleychart.py +452 -451
- {nltk-3.2 → nltk-3.3}/nltk/parse/evaluate.py +129 -129
- {nltk-3.2 → nltk-3.3}/nltk/parse/featurechart.py +580 -578
- {nltk-3.2 → nltk-3.3}/nltk/parse/generate.py +87 -76
- {nltk-3.2 → nltk-3.3}/nltk/parse/malt.py +356 -356
- {nltk-3.2 → nltk-3.3}/nltk/parse/nonprojectivedependencyparser.py +783 -783
- {nltk-3.2 → nltk-3.3}/nltk/parse/pchart.py +522 -522
- {nltk-3.2 → nltk-3.3}/nltk/parse/projectivedependencyparser.py +579 -578
- {nltk-3.2 → nltk-3.3}/nltk/parse/recursivedescent.py +655 -656
- {nltk-3.2 → nltk-3.3}/nltk/parse/shiftreduce.py +458 -459
- {nltk-3.2 → nltk-3.3}/nltk/parse/stanford.py +431 -406
- {nltk-3.2 → nltk-3.3}/nltk/parse/transitionparser.py +774 -772
- {nltk-3.2 → nltk-3.3}/nltk/parse/util.py +231 -231
- {nltk-3.2 → nltk-3.3}/nltk/parse/viterbi.py +401 -401
- {nltk-3.2 → nltk-3.3}/nltk/probability.py +2410 -2355
- {nltk-3.2 → nltk-3.3}/nltk/sem/__init__.py +61 -61
- {nltk-3.2 → nltk-3.3}/nltk/sem/boxer.py +1261 -1261
- {nltk-3.2 → nltk-3.3}/nltk/sem/chat80.py +782 -782
- {nltk-3.2 → nltk-3.3}/nltk/sem/cooper_storage.py +118 -118
- {nltk-3.2 → nltk-3.3}/nltk/sem/drt.py +1258 -1257
- {nltk-3.2 → nltk-3.3}/nltk/sem/drt_glue_demo.py +485 -489
- {nltk-3.2 → nltk-3.3}/nltk/sem/evaluate.py +790 -784
- {nltk-3.2 → nltk-3.3}/nltk/sem/glue.py +696 -694
- {nltk-3.2 → nltk-3.3}/nltk/sem/hole.py +386 -384
- {nltk-3.2 → nltk-3.3}/nltk/sem/lfg.py +210 -208
- {nltk-3.2 → nltk-3.3}/nltk/sem/linearlogic.py +451 -449
- {nltk-3.2 → nltk-3.3}/nltk/sem/logic.py +1910 -1910
- {nltk-3.2 → nltk-3.3}/nltk/sem/relextract.py +476 -483
- {nltk-3.2 → nltk-3.3}/nltk/sem/skolemize.py +101 -101
- {nltk-3.2 → nltk-3.3}/nltk/sem/util.py +249 -249
- {nltk-3.2 → nltk-3.3}/nltk/sentiment/__init__.py +14 -14
- {nltk-3.2 → nltk-3.3}/nltk/sentiment/sentiment_analyzer.py +229 -229
- {nltk-3.2 → nltk-3.3}/nltk/sentiment/util.py +762 -752
- {nltk-3.2 → nltk-3.3}/nltk/sentiment/vader.py +443 -445
- {nltk-3.2 → nltk-3.3}/nltk/stem/__init__.py +31 -33
- {nltk-3.2 → nltk-3.3}/nltk/stem/api.py +28 -25
- nltk-3.3/nltk/stem/arlstem.py +369 -0
- {nltk-3.2 → nltk-3.3}/nltk/stem/isri.py +345 -345
- {nltk-3.2 → nltk-3.3}/nltk/stem/lancaster.py +337 -310
- nltk-3.3/nltk/stem/porter.py +710 -0
- {nltk-3.2 → nltk-3.3}/nltk/stem/regexp.py +61 -61
- {nltk-3.2 → nltk-3.3}/nltk/stem/rslp.py +142 -142
- {nltk-3.2 → nltk-3.3}/nltk/stem/snowball.py +4236 -3712
- {nltk-3.2 → nltk-3.3}/nltk/stem/util.py +22 -12
- {nltk-3.2 → nltk-3.3}/nltk/stem/wordnet.py +51 -51
- {nltk-3.2 → nltk-3.3}/nltk/tag/__init__.py +152 -127
- {nltk-3.2 → nltk-3.3}/nltk/tag/api.py +86 -81
- {nltk-3.2 → nltk-3.3}/nltk/tag/brill.py +424 -426
- {nltk-3.2 → nltk-3.3}/nltk/tag/brill_trainer.py +608 -608
- {nltk-3.2 → nltk-3.3}/nltk/tag/crf.py +204 -200
- {nltk-3.2 → nltk-3.3}/nltk/tag/hmm.py +1277 -1277
- {nltk-3.2 → nltk-3.3}/nltk/tag/hunpos.py +132 -132
- {nltk-3.2 → nltk-3.3}/nltk/tag/mapping.py +101 -101
- {nltk-3.2 → nltk-3.3}/nltk/tag/perceptron.py +329 -314
- {nltk-3.2 → nltk-3.3}/nltk/tag/senna.py +147 -145
- {nltk-3.2 → nltk-3.3}/nltk/tag/sequential.py +740 -736
- {nltk-3.2 → nltk-3.3}/nltk/tag/stanford.py +219 -196
- {nltk-3.2 → nltk-3.3}/nltk/tag/tnt.py +595 -604
- {nltk-3.2 → nltk-3.3}/nltk/tag/util.py +72 -72
- {nltk-3.2 → nltk-3.3}/nltk/tbl/__init__.py +28 -28
- {nltk-3.2 → nltk-3.3}/nltk/tbl/api.py +1 -1
- {nltk-3.2 → nltk-3.3}/nltk/tbl/demo.py +366 -366
- {nltk-3.2 → nltk-3.3}/nltk/tbl/erroranalysis.py +39 -39
- {nltk-3.2 → nltk-3.3}/nltk/tbl/feature.py +259 -261
- {nltk-3.2 → nltk-3.3}/nltk/tbl/rule.py +321 -321
- {nltk-3.2 → nltk-3.3}/nltk/tbl/template.py +303 -308
- {nltk-3.2 → nltk-3.3}/nltk/test/__init__.py +18 -18
- {nltk-3.2 → nltk-3.3}/nltk/test/all.py +24 -23
- {nltk-3.2 → nltk-3.3}/nltk/test/bleu.doctest +14 -14
- {nltk-3.2 → nltk-3.3}/nltk/test/bnc.doctest +60 -60
- {nltk-3.2 → nltk-3.3}/nltk/test/ccg.doctest +376 -395
- nltk-3.3/nltk/test/ccg_semantics.doctest +553 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/chat80.doctest +234 -234
- {nltk-3.2 → nltk-3.3}/nltk/test/childes.doctest +184 -184
- {nltk-3.2 → nltk-3.3}/nltk/test/childes_fixt.py +14 -13
- {nltk-3.2 → nltk-3.3}/nltk/test/chunk.doctest +373 -373
- {nltk-3.2 → nltk-3.3}/nltk/test/classify.doctest +185 -185
- {nltk-3.2 → nltk-3.3}/nltk/test/classify_fixt.py +11 -10
- nltk-3.3/nltk/test/collections.doctest +20 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/collocations.doctest +276 -276
- {nltk-3.2 → nltk-3.3}/nltk/test/compat.doctest +134 -138
- {nltk-3.2 → nltk-3.3}/nltk/test/compat_fixt.py +9 -8
- nltk-3.3/nltk/test/concordance.doctest +55 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/corpus.doctest +2200 -2212
- {nltk-3.2 → nltk-3.3}/nltk/test/corpus_fixt.py +3 -3
- {nltk-3.2 → nltk-3.3}/nltk/test/crubadan.doctest +65 -65
- {nltk-3.2 → nltk-3.3}/nltk/test/data.doctest +379 -379
- {nltk-3.2 → nltk-3.3}/nltk/test/dependency.doctest +241 -241
- {nltk-3.2 → nltk-3.3}/nltk/test/discourse.doctest +546 -546
- {nltk-3.2 → nltk-3.3}/nltk/test/discourse_fixt.py +14 -13
- {nltk-3.2 → nltk-3.3}/nltk/test/doctest_nose_plugin.py +159 -156
- {nltk-3.2 → nltk-3.3}/nltk/test/drt.doctest +517 -517
- {nltk-3.2 → nltk-3.3}/nltk/test/featgram.doctest +607 -607
- {nltk-3.2 → nltk-3.3}/nltk/test/featstruct.doctest +1229 -1230
- {nltk-3.2 → nltk-3.3}/nltk/test/framenet.doctest +288 -239
- {nltk-3.2 → nltk-3.3}/nltk/test/generate.doctest +67 -67
- {nltk-3.2 → nltk-3.3}/nltk/test/gensim.doctest +140 -141
- {nltk-3.2 → nltk-3.3}/nltk/test/gensim_fixt.py +10 -9
- {nltk-3.2 → nltk-3.3}/nltk/test/gluesemantics.doctest +384 -386
- {nltk-3.2 → nltk-3.3}/nltk/test/gluesemantics_malt.doctest +68 -68
- {nltk-3.2 → nltk-3.3}/nltk/test/gluesemantics_malt_fixt.py +12 -11
- {nltk-3.2 → nltk-3.3}/nltk/test/grammar.doctest +48 -48
- {nltk-3.2 → nltk-3.3}/nltk/test/grammartestsuites.doctest +109 -109
- {nltk-3.2 → nltk-3.3}/nltk/test/index.doctest +100 -100
- {nltk-3.2 → nltk-3.3}/nltk/test/inference.doctest +534 -534
- {nltk-3.2 → nltk-3.3}/nltk/test/inference_fixt.py +12 -11
- {nltk-3.2 → nltk-3.3}/nltk/test/internals.doctest +140 -140
- {nltk-3.2 → nltk-3.3}/nltk/test/japanese.doctest +48 -48
- {nltk-3.2 → nltk-3.3}/nltk/test/logic.doctest +1098 -1098
- {nltk-3.2 → nltk-3.3}/nltk/test/metrics.doctest +270 -270
- {nltk-3.2 → nltk-3.3}/nltk/test/misc.doctest +118 -118
- {nltk-3.2 → nltk-3.3}/nltk/test/nonmonotonic.doctest +286 -286
- {nltk-3.2 → nltk-3.3}/nltk/test/nonmonotonic_fixt.py +12 -11
- {nltk-3.2 → nltk-3.3}/nltk/test/paice.doctest +35 -35
- {nltk-3.2 → nltk-3.3}/nltk/test/parse.doctest +884 -884
- {nltk-3.2 → nltk-3.3}/nltk/test/portuguese_en.doctest +565 -565
- {nltk-3.2 → nltk-3.3}/nltk/test/portuguese_en_fixt.py +16 -16
- {nltk-3.2 → nltk-3.3}/nltk/test/probability.doctest +304 -304
- {nltk-3.2 → nltk-3.3}/nltk/test/probability_fixt.py +13 -12
- {nltk-3.2 → nltk-3.3}/nltk/test/propbank.doctest +176 -176
- {nltk-3.2 → nltk-3.3}/nltk/test/relextract.doctest +263 -263
- {nltk-3.2 → nltk-3.3}/nltk/test/resolution.doctest +221 -221
- {nltk-3.2 → nltk-3.3}/nltk/test/runtests.py +86 -64
- {nltk-3.2 → nltk-3.3}/nltk/test/segmentation_fixt.py +10 -10
- {nltk-3.2 → nltk-3.3}/nltk/test/semantics.doctest +665 -665
- {nltk-3.2 → nltk-3.3}/nltk/test/semantics_fixt.py +7 -7
- {nltk-3.2 → nltk-3.3}/nltk/test/sentiment.doctest +233 -233
- {nltk-3.2 → nltk-3.3}/nltk/test/sentiwordnet.doctest +41 -41
- {nltk-3.2 → nltk-3.3}/nltk/test/simple.doctest +85 -85
- {nltk-3.2 → nltk-3.3}/nltk/test/stem.doctest +78 -78
- {nltk-3.2 → nltk-3.3}/nltk/test/tag.doctest +33 -33
- {nltk-3.2 → nltk-3.3}/nltk/test/tokenize.doctest +273 -166
- {nltk-3.2 → nltk-3.3}/nltk/test/toolbox.doctest +307 -307
- {nltk-3.2 → nltk-3.3}/nltk/test/translate.doctest +242 -242
- {nltk-3.2 → nltk-3.3}/nltk/test/translate_fixt.py +3 -3
- {nltk-3.2 → nltk-3.3}/nltk/test/tree.doctest +1101 -1101
- {nltk-3.2 → nltk-3.3}/nltk/test/treeprettyprinter.doctest +127 -127
- {nltk-3.2 → nltk-3.3}/nltk/test/treetransforms.doctest +156 -156
- nltk-3.3/nltk/test/unit/test_2x_compat.py +63 -0
- nltk-3.3/nltk/test/unit/test_aline.py +52 -0
- nltk-3.3/nltk/test/unit/test_chunk.py +56 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_classify.py +55 -53
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_collocations.py +88 -79
- nltk-3.3/nltk/test/unit/test_concordance.py +98 -0
- nltk-3.3/nltk/test/unit/test_corenlp.py +1000 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_corpora.py +200 -183
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_corpus_views.py +45 -45
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_hmm.py +88 -88
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_json2csv_corpus.py +188 -187
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_naivebayes.py +26 -26
- nltk-3.3/nltk/test/unit/test_rte_classify.py +86 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_seekable_unicode_stream_reader.py +124 -124
- nltk-3.3/nltk/test/unit/test_senna.py +74 -0
- nltk-3.3/nltk/test/unit/test_stem.py +121 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_tag.py +20 -20
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_tgrep.py +628 -626
- nltk-3.3/nltk/test/unit/test_tokenize.py +168 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_twitter_auth.py +185 -185
- nltk-3.3/nltk/test/unit/test_wordnet.py +134 -0
- nltk-3.3/nltk/test/unit/translate/test_bleu.py +244 -0
- nltk-3.3/nltk/test/unit/translate/test_gdfa.py +57 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm1.py +75 -75
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm2.py +87 -87
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm3.py +105 -105
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm4.py +126 -126
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm5.py +166 -166
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm_model.py +270 -270
- nltk-3.3/nltk/test/unit/translate/test_nist.py +37 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_stack_decoder.py +300 -300
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/utils.py +41 -41
- {nltk-3.2 → nltk-3.3}/nltk/test/util.doctest +48 -48
- {nltk-3.2 → nltk-3.3}/nltk/test/wordnet.doctest +595 -581
- {nltk-3.2 → nltk-3.3}/nltk/test/wordnet_fixt.py +7 -6
- {nltk-3.2 → nltk-3.3}/nltk/test/wordnet_lch.doctest +53 -53
- {nltk-3.2 → nltk-3.3}/nltk/test/wsd.doctest +68 -68
- {nltk-3.2 → nltk-3.3}/nltk/text.py +663 -610
- {nltk-3.2 → nltk-3.3}/nltk/tgrep.py +938 -937
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/__init__.py +130 -107
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/api.py +77 -78
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/casual.py +343 -342
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/mwe.py +120 -120
- nltk-3.3/nltk/tokenize/nist.py +173 -0
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/punkt.py +1620 -1601
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/regexp.py +208 -202
- nltk-3.3/nltk/tokenize/repp.py +151 -0
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/sexpr.py +140 -142
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/simple.py +138 -136
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/stanford.py +117 -113
- nltk-3.3/nltk/tokenize/stanford_segmenter.py +246 -0
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/texttiling.py +458 -460
- nltk-3.3/nltk/tokenize/toktok.py +155 -0
- nltk-3.3/nltk/tokenize/treebank.py +363 -0
- nltk-3.3/nltk/tokenize/util.py +261 -0
- {nltk-3.2 → nltk-3.3}/nltk/toolbox.py +499 -497
- {nltk-3.2 → nltk-3.3}/nltk/translate/__init__.py +24 -24
- {nltk-3.2 → nltk-3.3}/nltk/translate/api.py +331 -321
- {nltk-3.2 → nltk-3.3}/nltk/translate/bleu_score.py +615 -556
- nltk-3.3/nltk/translate/chrf_score.py +137 -0
- {nltk-3.2 → nltk-3.3}/nltk/translate/gale_church.py +248 -235
- {nltk-3.2 → nltk-3.3}/nltk/translate/gdfa.py +135 -131
- nltk-3.3/nltk/translate/gleu_score.py +193 -0
- {nltk-3.2 → nltk-3.3}/nltk/translate/ibm1.py +250 -241
- {nltk-3.2 → nltk-3.3}/nltk/translate/ibm2.py +308 -308
- {nltk-3.2 → nltk-3.3}/nltk/translate/ibm3.py +337 -337
- {nltk-3.2 → nltk-3.3}/nltk/translate/ibm4.py +467 -467
- {nltk-3.2 → nltk-3.3}/nltk/translate/ibm5.py +639 -639
- {nltk-3.2 → nltk-3.3}/nltk/translate/ibm_model.py +536 -533
- {nltk-3.2 → nltk-3.3}/nltk/translate/metrics.py +40 -40
- nltk-3.3/nltk/translate/nist_score.py +178 -0
- {nltk-3.2 → nltk-3.3}/nltk/translate/phrase_based.py +175 -175
- {nltk-3.2 → nltk-3.3}/nltk/translate/ribes_score.py +325 -325
- {nltk-3.2 → nltk-3.3}/nltk/translate/stack_decoder.py +499 -495
- {nltk-3.2 → nltk-3.3}/nltk/tree.py +1605 -1603
- {nltk-3.2 → nltk-3.3}/nltk/treeprettyprinter.py +564 -564
- {nltk-3.2 → nltk-3.3}/nltk/treetransforms.py +309 -309
- {nltk-3.2 → nltk-3.3}/nltk/twitter/__init__.py +28 -28
- {nltk-3.2 → nltk-3.3}/nltk/twitter/api.py +141 -136
- {nltk-3.2 → nltk-3.3}/nltk/twitter/common.py +264 -258
- {nltk-3.2 → nltk-3.3}/nltk/twitter/twitter_demo.py +288 -288
- {nltk-3.2 → nltk-3.3}/nltk/twitter/twitterclient.py +530 -530
- {nltk-3.2 → nltk-3.3}/nltk/twitter/util.py +147 -146
- nltk-3.3/nltk/util.py +751 -0
- {nltk-3.2 → nltk-3.3}/nltk/wsd.py +53 -53
- {nltk-3.2 → nltk-3.3/nltk.egg-info}/PKG-INFO +13 -5
- {nltk-3.2 → nltk-3.3}/nltk.egg-info/SOURCES.txt +26 -3
- nltk-3.3/nltk.egg-info/requires.txt +31 -0
- {nltk-3.2 → nltk-3.3}/setup.cfg +0 -1
- {nltk-3.2 → nltk-3.3}/setup.py +102 -75
- nltk-3.2/nltk/VERSION +0 -1
- nltk-3.2/nltk/compat.py +0 -680
- nltk-3.2/nltk/corpus/reader/pl196x.py +0 -278
- nltk-3.2/nltk/corpus/reader/verbnet.py +0 -408
- nltk-3.2/nltk/corpus/reader/wordlist.py +0 -37
- nltk-3.2/nltk/sentiment/vader_lexicon.txt +0 -7517
- nltk-3.2/nltk/six.py +0 -868
- nltk-3.2/nltk/stem/porter.py +0 -692
- nltk-3.2/nltk/test/unit/test_2x_compat.py +0 -26
- nltk-3.2/nltk/test/unit/test_stem.py +0 -36
- nltk-3.2/nltk/test/unit/test_tokenize.py +0 -23
- nltk-3.2/nltk/test/unit/translate/test_bleu.py +0 -84
- nltk-3.2/nltk/tokenize/treebank.py +0 -124
- nltk-3.2/nltk/tokenize/util.py +0 -90
- nltk-3.2/nltk/util.py +0 -1364
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/__init__.py +0 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/__init__.py +0 -0
- {nltk-3.2 → nltk-3.3}/nltk.egg-info/dependency_links.txt +0 -0
- {nltk-3.2 → nltk-3.3}/nltk.egg-info/not-zip-safe +0 -0
- {nltk-3.2 → nltk-3.3}/nltk.egg-info/top_level.txt +0 -0
|
@@ -1,451 +1,452 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
# Natural Language Toolkit: An Incremental Earley Chart Parser
|
|
3
|
-
#
|
|
4
|
-
# Copyright (C) 2001-
|
|
5
|
-
# Author: Peter Ljunglöf <peter.ljunglof@heatherleaf.se>
|
|
6
|
-
# Rob Speer <rspeer@mit.edu>
|
|
7
|
-
# Edward Loper <edloper@gmail.com>
|
|
8
|
-
# Steven Bird <stevenbird1@gmail.com>
|
|
9
|
-
# Jean Mark Gawron <gawron@mail.sdsu.edu>
|
|
10
|
-
# URL: <http://nltk.org/>
|
|
11
|
-
# For license information, see LICENSE.TXT
|
|
12
|
-
|
|
13
|
-
"""
|
|
14
|
-
Data classes and parser implementations for *incremental* chart
|
|
15
|
-
parsers, which use dynamic programming to efficiently parse a text.
|
|
16
|
-
A "chart parser" derives parse trees for a text by iteratively adding
|
|
17
|
-
\"edges\" to a \"chart\". Each "edge" represents a hypothesis about the tree
|
|
18
|
-
structure for a subsequence of the text. The "chart" is a
|
|
19
|
-
\"blackboard\" for composing and combining these hypotheses.
|
|
20
|
-
|
|
21
|
-
A parser is "incremental", if it guarantees that for all i, j where i < j,
|
|
22
|
-
all edges ending at i are built before any edges ending at j.
|
|
23
|
-
This is appealing for, say, speech recognizer hypothesis filtering.
|
|
24
|
-
|
|
25
|
-
The main parser class is ``EarleyChartParser``, which is a top-down
|
|
26
|
-
algorithm, originally formulated by Jay Earley (1970).
|
|
27
|
-
"""
|
|
28
|
-
from __future__ import print_function, division
|
|
29
|
-
|
|
30
|
-
from
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
#
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
restr_keys =
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
restr_keys =
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
#
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
#
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
#
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
|
256
|
-
|
|
|
257
|
-
|
|
|
258
|
-
|
|
|
259
|
-
|
|
|
260
|
-
|
|
|
261
|
-
|
|
|
262
|
-
|
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
:
|
|
273
|
-
:
|
|
274
|
-
:
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
:
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
self.
|
|
287
|
-
self.
|
|
288
|
-
self.
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
self.
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
grammar
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
print(
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
print(
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
print()
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Natural Language Toolkit: An Incremental Earley Chart Parser
|
|
3
|
+
#
|
|
4
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
5
|
+
# Author: Peter Ljunglöf <peter.ljunglof@heatherleaf.se>
|
|
6
|
+
# Rob Speer <rspeer@mit.edu>
|
|
7
|
+
# Edward Loper <edloper@gmail.com>
|
|
8
|
+
# Steven Bird <stevenbird1@gmail.com>
|
|
9
|
+
# Jean Mark Gawron <gawron@mail.sdsu.edu>
|
|
10
|
+
# URL: <http://nltk.org/>
|
|
11
|
+
# For license information, see LICENSE.TXT
|
|
12
|
+
|
|
13
|
+
"""
|
|
14
|
+
Data classes and parser implementations for *incremental* chart
|
|
15
|
+
parsers, which use dynamic programming to efficiently parse a text.
|
|
16
|
+
A "chart parser" derives parse trees for a text by iteratively adding
|
|
17
|
+
\"edges\" to a \"chart\". Each "edge" represents a hypothesis about the tree
|
|
18
|
+
structure for a subsequence of the text. The "chart" is a
|
|
19
|
+
\"blackboard\" for composing and combining these hypotheses.
|
|
20
|
+
|
|
21
|
+
A parser is "incremental", if it guarantees that for all i, j where i < j,
|
|
22
|
+
all edges ending at i are built before any edges ending at j.
|
|
23
|
+
This is appealing for, say, speech recognizer hypothesis filtering.
|
|
24
|
+
|
|
25
|
+
The main parser class is ``EarleyChartParser``, which is a top-down
|
|
26
|
+
algorithm, originally formulated by Jay Earley (1970).
|
|
27
|
+
"""
|
|
28
|
+
from __future__ import print_function, division
|
|
29
|
+
|
|
30
|
+
from six.moves import range
|
|
31
|
+
|
|
32
|
+
from nltk.parse.chart import (Chart, ChartParser, EdgeI, LeafEdge, LeafInitRule,
|
|
33
|
+
BottomUpPredictRule, BottomUpPredictCombineRule,
|
|
34
|
+
TopDownInitRule, SingleEdgeFundamentalRule,
|
|
35
|
+
EmptyPredictRule,
|
|
36
|
+
CachedTopDownPredictRule,
|
|
37
|
+
FilteredSingleEdgeFundamentalRule,
|
|
38
|
+
FilteredBottomUpPredictCombineRule)
|
|
39
|
+
from nltk.parse.featurechart import (FeatureChart, FeatureChartParser,
|
|
40
|
+
FeatureTopDownInitRule,
|
|
41
|
+
FeatureTopDownPredictRule,
|
|
42
|
+
FeatureEmptyPredictRule,
|
|
43
|
+
FeatureBottomUpPredictRule,
|
|
44
|
+
FeatureBottomUpPredictCombineRule,
|
|
45
|
+
FeatureSingleEdgeFundamentalRule)
|
|
46
|
+
|
|
47
|
+
#////////////////////////////////////////////////////////////
|
|
48
|
+
# Incremental Chart
|
|
49
|
+
#////////////////////////////////////////////////////////////
|
|
50
|
+
|
|
51
|
+
class IncrementalChart(Chart):
|
|
52
|
+
def initialize(self):
|
|
53
|
+
# A sequence of edge lists contained in this chart.
|
|
54
|
+
self._edgelists = tuple([] for x in self._positions())
|
|
55
|
+
|
|
56
|
+
# The set of child pointer lists associated with each edge.
|
|
57
|
+
self._edge_to_cpls = {}
|
|
58
|
+
|
|
59
|
+
# Indexes mapping attribute values to lists of edges
|
|
60
|
+
# (used by select()).
|
|
61
|
+
self._indexes = {}
|
|
62
|
+
|
|
63
|
+
def edges(self):
|
|
64
|
+
return list(self.iteredges())
|
|
65
|
+
|
|
66
|
+
def iteredges(self):
|
|
67
|
+
return (edge for edgelist in self._edgelists for edge in edgelist)
|
|
68
|
+
|
|
69
|
+
def select(self, end, **restrictions):
|
|
70
|
+
edgelist = self._edgelists[end]
|
|
71
|
+
|
|
72
|
+
# If there are no restrictions, then return all edges.
|
|
73
|
+
if restrictions=={}: return iter(edgelist)
|
|
74
|
+
|
|
75
|
+
# Find the index corresponding to the given restrictions.
|
|
76
|
+
restr_keys = sorted(restrictions.keys())
|
|
77
|
+
restr_keys = tuple(restr_keys)
|
|
78
|
+
|
|
79
|
+
# If it doesn't exist, then create it.
|
|
80
|
+
if restr_keys not in self._indexes:
|
|
81
|
+
self._add_index(restr_keys)
|
|
82
|
+
|
|
83
|
+
vals = tuple(restrictions[key] for key in restr_keys)
|
|
84
|
+
return iter(self._indexes[restr_keys][end].get(vals, []))
|
|
85
|
+
|
|
86
|
+
def _add_index(self, restr_keys):
|
|
87
|
+
# Make sure it's a valid index.
|
|
88
|
+
for key in restr_keys:
|
|
89
|
+
if not hasattr(EdgeI, key):
|
|
90
|
+
raise ValueError('Bad restriction: %s' % key)
|
|
91
|
+
|
|
92
|
+
# Create the index.
|
|
93
|
+
index = self._indexes[restr_keys] = tuple({} for x in self._positions())
|
|
94
|
+
|
|
95
|
+
# Add all existing edges to the index.
|
|
96
|
+
for end, edgelist in enumerate(self._edgelists):
|
|
97
|
+
this_index = index[end]
|
|
98
|
+
for edge in edgelist:
|
|
99
|
+
vals = tuple(getattr(edge, key)() for key in restr_keys)
|
|
100
|
+
this_index.setdefault(vals, []).append(edge)
|
|
101
|
+
|
|
102
|
+
def _register_with_indexes(self, edge):
|
|
103
|
+
end = edge.end()
|
|
104
|
+
for (restr_keys, index) in self._indexes.items():
|
|
105
|
+
vals = tuple(getattr(edge, key)() for key in restr_keys)
|
|
106
|
+
index[end].setdefault(vals, []).append(edge)
|
|
107
|
+
|
|
108
|
+
def _append_edge(self, edge):
|
|
109
|
+
self._edgelists[edge.end()].append(edge)
|
|
110
|
+
|
|
111
|
+
def _positions(self):
|
|
112
|
+
return range(self.num_leaves() + 1)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
class FeatureIncrementalChart(IncrementalChart, FeatureChart):
|
|
116
|
+
def select(self, end, **restrictions):
|
|
117
|
+
edgelist = self._edgelists[end]
|
|
118
|
+
|
|
119
|
+
# If there are no restrictions, then return all edges.
|
|
120
|
+
if restrictions=={}: return iter(edgelist)
|
|
121
|
+
|
|
122
|
+
# Find the index corresponding to the given restrictions.
|
|
123
|
+
restr_keys = sorted(restrictions.keys())
|
|
124
|
+
restr_keys = tuple(restr_keys)
|
|
125
|
+
|
|
126
|
+
# If it doesn't exist, then create it.
|
|
127
|
+
if restr_keys not in self._indexes:
|
|
128
|
+
self._add_index(restr_keys)
|
|
129
|
+
|
|
130
|
+
vals = tuple(self._get_type_if_possible(restrictions[key])
|
|
131
|
+
for key in restr_keys)
|
|
132
|
+
return iter(self._indexes[restr_keys][end].get(vals, []))
|
|
133
|
+
|
|
134
|
+
def _add_index(self, restr_keys):
|
|
135
|
+
# Make sure it's a valid index.
|
|
136
|
+
for key in restr_keys:
|
|
137
|
+
if not hasattr(EdgeI, key):
|
|
138
|
+
raise ValueError('Bad restriction: %s' % key)
|
|
139
|
+
|
|
140
|
+
# Create the index.
|
|
141
|
+
index = self._indexes[restr_keys] = tuple({} for x in self._positions())
|
|
142
|
+
|
|
143
|
+
# Add all existing edges to the index.
|
|
144
|
+
for end, edgelist in enumerate(self._edgelists):
|
|
145
|
+
this_index = index[end]
|
|
146
|
+
for edge in edgelist:
|
|
147
|
+
vals = tuple(self._get_type_if_possible(getattr(edge, key)())
|
|
148
|
+
for key in restr_keys)
|
|
149
|
+
this_index.setdefault(vals, []).append(edge)
|
|
150
|
+
|
|
151
|
+
def _register_with_indexes(self, edge):
|
|
152
|
+
end = edge.end()
|
|
153
|
+
for (restr_keys, index) in self._indexes.items():
|
|
154
|
+
vals = tuple(self._get_type_if_possible(getattr(edge, key)())
|
|
155
|
+
for key in restr_keys)
|
|
156
|
+
index[end].setdefault(vals, []).append(edge)
|
|
157
|
+
|
|
158
|
+
#////////////////////////////////////////////////////////////
|
|
159
|
+
# Incremental CFG Rules
|
|
160
|
+
#////////////////////////////////////////////////////////////
|
|
161
|
+
|
|
162
|
+
class CompleteFundamentalRule(SingleEdgeFundamentalRule):
|
|
163
|
+
def _apply_incomplete(self, chart, grammar, left_edge):
|
|
164
|
+
end = left_edge.end()
|
|
165
|
+
# When the chart is incremental, we only have to look for
|
|
166
|
+
# empty complete edges here.
|
|
167
|
+
for right_edge in chart.select(start=end, end=end,
|
|
168
|
+
is_complete=True,
|
|
169
|
+
lhs=left_edge.nextsym()):
|
|
170
|
+
new_edge = left_edge.move_dot_forward(right_edge.end())
|
|
171
|
+
if chart.insert_with_backpointer(new_edge, left_edge, right_edge):
|
|
172
|
+
yield new_edge
|
|
173
|
+
|
|
174
|
+
class CompleterRule(CompleteFundamentalRule):
|
|
175
|
+
_fundamental_rule = CompleteFundamentalRule()
|
|
176
|
+
def apply(self, chart, grammar, edge):
|
|
177
|
+
if not isinstance(edge, LeafEdge):
|
|
178
|
+
for new_edge in self._fundamental_rule.apply(chart, grammar, edge):
|
|
179
|
+
yield new_edge
|
|
180
|
+
|
|
181
|
+
class ScannerRule(CompleteFundamentalRule):
|
|
182
|
+
_fundamental_rule = CompleteFundamentalRule()
|
|
183
|
+
def apply(self, chart, grammar, edge):
|
|
184
|
+
if isinstance(edge, LeafEdge):
|
|
185
|
+
for new_edge in self._fundamental_rule.apply(chart, grammar, edge):
|
|
186
|
+
yield new_edge
|
|
187
|
+
|
|
188
|
+
class PredictorRule(CachedTopDownPredictRule):
|
|
189
|
+
pass
|
|
190
|
+
|
|
191
|
+
class FilteredCompleteFundamentalRule(FilteredSingleEdgeFundamentalRule):
|
|
192
|
+
def apply(self, chart, grammar, edge):
|
|
193
|
+
# Since the Filtered rule only works for grammars without empty productions,
|
|
194
|
+
# we only have to bother with complete edges here.
|
|
195
|
+
if edge.is_complete():
|
|
196
|
+
for new_edge in self._apply_complete(chart, grammar, edge):
|
|
197
|
+
yield new_edge
|
|
198
|
+
|
|
199
|
+
#////////////////////////////////////////////////////////////
|
|
200
|
+
# Incremental FCFG Rules
|
|
201
|
+
#////////////////////////////////////////////////////////////
|
|
202
|
+
|
|
203
|
+
class FeatureCompleteFundamentalRule(FeatureSingleEdgeFundamentalRule):
|
|
204
|
+
def _apply_incomplete(self, chart, grammar, left_edge):
|
|
205
|
+
fr = self._fundamental_rule
|
|
206
|
+
end = left_edge.end()
|
|
207
|
+
# When the chart is incremental, we only have to look for
|
|
208
|
+
# empty complete edges here.
|
|
209
|
+
for right_edge in chart.select(start=end, end=end,
|
|
210
|
+
is_complete=True,
|
|
211
|
+
lhs=left_edge.nextsym()):
|
|
212
|
+
for new_edge in fr.apply(chart, grammar, left_edge, right_edge):
|
|
213
|
+
yield new_edge
|
|
214
|
+
|
|
215
|
+
class FeatureCompleterRule(CompleterRule):
|
|
216
|
+
_fundamental_rule = FeatureCompleteFundamentalRule()
|
|
217
|
+
|
|
218
|
+
class FeatureScannerRule(ScannerRule):
|
|
219
|
+
_fundamental_rule = FeatureCompleteFundamentalRule()
|
|
220
|
+
|
|
221
|
+
class FeaturePredictorRule(FeatureTopDownPredictRule):
|
|
222
|
+
pass
|
|
223
|
+
|
|
224
|
+
#////////////////////////////////////////////////////////////
|
|
225
|
+
# Incremental CFG Chart Parsers
|
|
226
|
+
#////////////////////////////////////////////////////////////
|
|
227
|
+
|
|
228
|
+
EARLEY_STRATEGY = [LeafInitRule(),
|
|
229
|
+
TopDownInitRule(),
|
|
230
|
+
CompleterRule(),
|
|
231
|
+
ScannerRule(),
|
|
232
|
+
PredictorRule()]
|
|
233
|
+
TD_INCREMENTAL_STRATEGY = [LeafInitRule(),
|
|
234
|
+
TopDownInitRule(),
|
|
235
|
+
CachedTopDownPredictRule(),
|
|
236
|
+
CompleteFundamentalRule()]
|
|
237
|
+
BU_INCREMENTAL_STRATEGY = [LeafInitRule(),
|
|
238
|
+
EmptyPredictRule(),
|
|
239
|
+
BottomUpPredictRule(),
|
|
240
|
+
CompleteFundamentalRule()]
|
|
241
|
+
BU_LC_INCREMENTAL_STRATEGY = [LeafInitRule(),
|
|
242
|
+
EmptyPredictRule(),
|
|
243
|
+
BottomUpPredictCombineRule(),
|
|
244
|
+
CompleteFundamentalRule()]
|
|
245
|
+
|
|
246
|
+
LC_INCREMENTAL_STRATEGY = [LeafInitRule(),
|
|
247
|
+
FilteredBottomUpPredictCombineRule(),
|
|
248
|
+
FilteredCompleteFundamentalRule()]
|
|
249
|
+
|
|
250
|
+
class IncrementalChartParser(ChartParser):
|
|
251
|
+
"""
|
|
252
|
+
An *incremental* chart parser implementing Jay Earley's
|
|
253
|
+
parsing algorithm:
|
|
254
|
+
|
|
255
|
+
| For each index end in [0, 1, ..., N]:
|
|
256
|
+
| For each edge such that edge.end = end:
|
|
257
|
+
| If edge is incomplete and edge.next is not a part of speech:
|
|
258
|
+
| Apply PredictorRule to edge
|
|
259
|
+
| If edge is incomplete and edge.next is a part of speech:
|
|
260
|
+
| Apply ScannerRule to edge
|
|
261
|
+
| If edge is complete:
|
|
262
|
+
| Apply CompleterRule to edge
|
|
263
|
+
| Return any complete parses in the chart
|
|
264
|
+
"""
|
|
265
|
+
def __init__(self, grammar, strategy=BU_LC_INCREMENTAL_STRATEGY,
|
|
266
|
+
trace=0, trace_chart_width=50,
|
|
267
|
+
chart_class=IncrementalChart):
|
|
268
|
+
"""
|
|
269
|
+
Create a new Earley chart parser, that uses ``grammar`` to
|
|
270
|
+
parse texts.
|
|
271
|
+
|
|
272
|
+
:type grammar: CFG
|
|
273
|
+
:param grammar: The grammar used to parse texts.
|
|
274
|
+
:type trace: int
|
|
275
|
+
:param trace: The level of tracing that should be used when
|
|
276
|
+
parsing a text. ``0`` will generate no tracing output;
|
|
277
|
+
and higher numbers will produce more verbose tracing
|
|
278
|
+
output.
|
|
279
|
+
:type trace_chart_width: int
|
|
280
|
+
:param trace_chart_width: The default total width reserved for
|
|
281
|
+
the chart in trace output. The remainder of each line will
|
|
282
|
+
be used to display edges.
|
|
283
|
+
:param chart_class: The class that should be used to create
|
|
284
|
+
the charts used by this parser.
|
|
285
|
+
"""
|
|
286
|
+
self._grammar = grammar
|
|
287
|
+
self._trace = trace
|
|
288
|
+
self._trace_chart_width = trace_chart_width
|
|
289
|
+
self._chart_class = chart_class
|
|
290
|
+
|
|
291
|
+
self._axioms = []
|
|
292
|
+
self._inference_rules = []
|
|
293
|
+
for rule in strategy:
|
|
294
|
+
if rule.NUM_EDGES == 0:
|
|
295
|
+
self._axioms.append(rule)
|
|
296
|
+
elif rule.NUM_EDGES == 1:
|
|
297
|
+
self._inference_rules.append(rule)
|
|
298
|
+
else:
|
|
299
|
+
raise ValueError("Incremental inference rules must have "
|
|
300
|
+
"NUM_EDGES == 0 or 1")
|
|
301
|
+
|
|
302
|
+
def chart_parse(self, tokens, trace=None):
|
|
303
|
+
if trace is None: trace = self._trace
|
|
304
|
+
trace_new_edges = self._trace_new_edges
|
|
305
|
+
|
|
306
|
+
tokens = list(tokens)
|
|
307
|
+
self._grammar.check_coverage(tokens)
|
|
308
|
+
chart = self._chart_class(tokens)
|
|
309
|
+
grammar = self._grammar
|
|
310
|
+
|
|
311
|
+
# Width, for printing trace edges.
|
|
312
|
+
trace_edge_width = self._trace_chart_width // (chart.num_leaves() + 1)
|
|
313
|
+
if trace: print(chart.pretty_format_leaves(trace_edge_width))
|
|
314
|
+
|
|
315
|
+
for axiom in self._axioms:
|
|
316
|
+
new_edges = list(axiom.apply(chart, grammar))
|
|
317
|
+
trace_new_edges(chart, axiom, new_edges, trace, trace_edge_width)
|
|
318
|
+
|
|
319
|
+
inference_rules = self._inference_rules
|
|
320
|
+
for end in range(chart.num_leaves()+1):
|
|
321
|
+
if trace > 1: print("\n* Processing queue:", end, "\n")
|
|
322
|
+
agenda = list(chart.select(end=end))
|
|
323
|
+
while agenda:
|
|
324
|
+
edge = agenda.pop()
|
|
325
|
+
for rule in inference_rules:
|
|
326
|
+
new_edges = list(rule.apply(chart, grammar, edge))
|
|
327
|
+
trace_new_edges(chart, rule, new_edges, trace, trace_edge_width)
|
|
328
|
+
for new_edge in new_edges:
|
|
329
|
+
if new_edge.end()==end:
|
|
330
|
+
agenda.append(new_edge)
|
|
331
|
+
|
|
332
|
+
return chart
|
|
333
|
+
|
|
334
|
+
class EarleyChartParser(IncrementalChartParser):
|
|
335
|
+
def __init__(self, grammar, **parser_args):
|
|
336
|
+
IncrementalChartParser.__init__(self, grammar, EARLEY_STRATEGY, **parser_args)
|
|
337
|
+
pass
|
|
338
|
+
|
|
339
|
+
class IncrementalTopDownChartParser(IncrementalChartParser):
|
|
340
|
+
def __init__(self, grammar, **parser_args):
|
|
341
|
+
IncrementalChartParser.__init__(self, grammar, TD_INCREMENTAL_STRATEGY, **parser_args)
|
|
342
|
+
|
|
343
|
+
class IncrementalBottomUpChartParser(IncrementalChartParser):
|
|
344
|
+
def __init__(self, grammar, **parser_args):
|
|
345
|
+
IncrementalChartParser.__init__(self, grammar, BU_INCREMENTAL_STRATEGY, **parser_args)
|
|
346
|
+
|
|
347
|
+
class IncrementalBottomUpLeftCornerChartParser(IncrementalChartParser):
|
|
348
|
+
def __init__(self, grammar, **parser_args):
|
|
349
|
+
IncrementalChartParser.__init__(self, grammar, BU_LC_INCREMENTAL_STRATEGY, **parser_args)
|
|
350
|
+
|
|
351
|
+
class IncrementalLeftCornerChartParser(IncrementalChartParser):
|
|
352
|
+
def __init__(self, grammar, **parser_args):
|
|
353
|
+
if not grammar.is_nonempty():
|
|
354
|
+
raise ValueError("IncrementalLeftCornerParser only works for grammars "
|
|
355
|
+
"without empty productions.")
|
|
356
|
+
IncrementalChartParser.__init__(self, grammar, LC_INCREMENTAL_STRATEGY, **parser_args)
|
|
357
|
+
|
|
358
|
+
#////////////////////////////////////////////////////////////
|
|
359
|
+
# Incremental FCFG Chart Parsers
|
|
360
|
+
#////////////////////////////////////////////////////////////
|
|
361
|
+
|
|
362
|
+
EARLEY_FEATURE_STRATEGY = [LeafInitRule(),
|
|
363
|
+
FeatureTopDownInitRule(),
|
|
364
|
+
FeatureCompleterRule(),
|
|
365
|
+
FeatureScannerRule(),
|
|
366
|
+
FeaturePredictorRule()]
|
|
367
|
+
TD_INCREMENTAL_FEATURE_STRATEGY = [LeafInitRule(),
|
|
368
|
+
FeatureTopDownInitRule(),
|
|
369
|
+
FeatureTopDownPredictRule(),
|
|
370
|
+
FeatureCompleteFundamentalRule()]
|
|
371
|
+
BU_INCREMENTAL_FEATURE_STRATEGY = [LeafInitRule(),
|
|
372
|
+
FeatureEmptyPredictRule(),
|
|
373
|
+
FeatureBottomUpPredictRule(),
|
|
374
|
+
FeatureCompleteFundamentalRule()]
|
|
375
|
+
BU_LC_INCREMENTAL_FEATURE_STRATEGY = [LeafInitRule(),
|
|
376
|
+
FeatureEmptyPredictRule(),
|
|
377
|
+
FeatureBottomUpPredictCombineRule(),
|
|
378
|
+
FeatureCompleteFundamentalRule()]
|
|
379
|
+
|
|
380
|
+
class FeatureIncrementalChartParser(IncrementalChartParser, FeatureChartParser):
|
|
381
|
+
def __init__(self, grammar,
|
|
382
|
+
strategy=BU_LC_INCREMENTAL_FEATURE_STRATEGY,
|
|
383
|
+
trace_chart_width=20,
|
|
384
|
+
chart_class=FeatureIncrementalChart,
|
|
385
|
+
**parser_args):
|
|
386
|
+
IncrementalChartParser.__init__(self, grammar,
|
|
387
|
+
strategy=strategy,
|
|
388
|
+
trace_chart_width=trace_chart_width,
|
|
389
|
+
chart_class=chart_class,
|
|
390
|
+
**parser_args)
|
|
391
|
+
|
|
392
|
+
class FeatureEarleyChartParser(FeatureIncrementalChartParser):
|
|
393
|
+
def __init__(self, grammar, **parser_args):
|
|
394
|
+
FeatureIncrementalChartParser.__init__(self, grammar, EARLEY_FEATURE_STRATEGY, **parser_args)
|
|
395
|
+
|
|
396
|
+
class FeatureIncrementalTopDownChartParser(FeatureIncrementalChartParser):
|
|
397
|
+
def __init__(self, grammar, **parser_args):
|
|
398
|
+
FeatureIncrementalChartParser.__init__(self, grammar, TD_INCREMENTAL_FEATURE_STRATEGY, **parser_args)
|
|
399
|
+
|
|
400
|
+
class FeatureIncrementalBottomUpChartParser(FeatureIncrementalChartParser):
|
|
401
|
+
def __init__(self, grammar, **parser_args):
|
|
402
|
+
FeatureIncrementalChartParser.__init__(self, grammar, BU_INCREMENTAL_FEATURE_STRATEGY, **parser_args)
|
|
403
|
+
|
|
404
|
+
class FeatureIncrementalBottomUpLeftCornerChartParser(FeatureIncrementalChartParser):
|
|
405
|
+
def __init__(self, grammar, **parser_args):
|
|
406
|
+
FeatureIncrementalChartParser.__init__(self, grammar, BU_LC_INCREMENTAL_FEATURE_STRATEGY, **parser_args)
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
#////////////////////////////////////////////////////////////
|
|
410
|
+
# Demonstration
|
|
411
|
+
#////////////////////////////////////////////////////////////
|
|
412
|
+
|
|
413
|
+
def demo(print_times=True, print_grammar=False,
|
|
414
|
+
print_trees=True, trace=2,
|
|
415
|
+
sent='I saw John with a dog with my cookie', numparses=5):
|
|
416
|
+
"""
|
|
417
|
+
A demonstration of the Earley parsers.
|
|
418
|
+
"""
|
|
419
|
+
import sys, time
|
|
420
|
+
from nltk.parse.chart import demo_grammar
|
|
421
|
+
|
|
422
|
+
# The grammar for ChartParser and SteppingChartParser:
|
|
423
|
+
grammar = demo_grammar()
|
|
424
|
+
if print_grammar:
|
|
425
|
+
print("* Grammar")
|
|
426
|
+
print(grammar)
|
|
427
|
+
|
|
428
|
+
# Tokenize the sample sentence.
|
|
429
|
+
print("* Sentence:")
|
|
430
|
+
print(sent)
|
|
431
|
+
tokens = sent.split()
|
|
432
|
+
print(tokens)
|
|
433
|
+
print()
|
|
434
|
+
|
|
435
|
+
# Do the parsing.
|
|
436
|
+
earley = EarleyChartParser(grammar, trace=trace)
|
|
437
|
+
t = time.clock()
|
|
438
|
+
chart = earley.chart_parse(tokens)
|
|
439
|
+
parses = list(chart.parses(grammar.start()))
|
|
440
|
+
t = time.clock()-t
|
|
441
|
+
|
|
442
|
+
# Print results.
|
|
443
|
+
if numparses:
|
|
444
|
+
assert len(parses)==numparses, 'Not all parses found'
|
|
445
|
+
if print_trees:
|
|
446
|
+
for tree in parses: print(tree)
|
|
447
|
+
else:
|
|
448
|
+
print("Nr trees:", len(parses))
|
|
449
|
+
if print_times:
|
|
450
|
+
print("Time:", t)
|
|
451
|
+
|
|
452
|
+
if __name__ == '__main__': demo()
|