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,190 +1,190 @@
|
|
|
1
|
-
# Natural Language Toolkit: Chunkers
|
|
2
|
-
#
|
|
3
|
-
# Copyright (C) 2001-
|
|
4
|
-
# Author: Steven Bird <stevenbird1@gmail.com>
|
|
5
|
-
# Edward Loper <edloper@gmail.com>
|
|
6
|
-
# URL: <http://nltk.org/>
|
|
7
|
-
# For license information, see LICENSE.TXT
|
|
8
|
-
#
|
|
9
|
-
|
|
10
|
-
"""
|
|
11
|
-
Classes and interfaces for identifying non-overlapping linguistic
|
|
12
|
-
groups (such as base noun phrases) in unrestricted text. This task is
|
|
13
|
-
called "chunk parsing" or "chunking", and the identified groups are
|
|
14
|
-
called "chunks". The chunked text is represented using a shallow
|
|
15
|
-
tree called a "chunk structure." A chunk structure is a tree
|
|
16
|
-
containing tokens and chunks, where each chunk is a subtree containing
|
|
17
|
-
only tokens. For example, the chunk structure for base noun phrase
|
|
18
|
-
chunks in the sentence "I saw the big dog on the hill" is::
|
|
19
|
-
|
|
20
|
-
(SENTENCE:
|
|
21
|
-
(NP: <I>)
|
|
22
|
-
<saw>
|
|
23
|
-
(NP: <the> <big> <dog>)
|
|
24
|
-
<on>
|
|
25
|
-
(NP: <the> <hill>))
|
|
26
|
-
|
|
27
|
-
To convert a chunk structure back to a list of tokens, simply use the
|
|
28
|
-
chunk structure's ``leaves()`` method.
|
|
29
|
-
|
|
30
|
-
This module defines ``ChunkParserI``, a standard interface for
|
|
31
|
-
chunking texts; and ``RegexpChunkParser``, a regular-expression based
|
|
32
|
-
implementation of that interface. It also defines ``ChunkScore``, a
|
|
33
|
-
utility class for scoring chunk parsers.
|
|
34
|
-
|
|
35
|
-
RegexpChunkParser
|
|
36
|
-
=================
|
|
37
|
-
|
|
38
|
-
``RegexpChunkParser`` is an implementation of the chunk parser interface
|
|
39
|
-
that uses regular-expressions over tags to chunk a text. Its
|
|
40
|
-
``parse()`` method first constructs a ``ChunkString``, which encodes a
|
|
41
|
-
particular chunking of the input text. Initially, nothing is
|
|
42
|
-
chunked. ``parse.RegexpChunkParser`` then applies a sequence of
|
|
43
|
-
``RegexpChunkRule`` rules to the ``ChunkString``, each of which modifies
|
|
44
|
-
the chunking that it encodes. Finally, the ``ChunkString`` is
|
|
45
|
-
transformed back into a chunk structure, which is returned.
|
|
46
|
-
|
|
47
|
-
``RegexpChunkParser`` can only be used to chunk a single kind of phrase.
|
|
48
|
-
For example, you can use an ``RegexpChunkParser`` to chunk the noun
|
|
49
|
-
phrases in a text, or the verb phrases in a text; but you can not
|
|
50
|
-
use it to simultaneously chunk both noun phrases and verb phrases in
|
|
51
|
-
the same text. (This is a limitation of ``RegexpChunkParser``, not of
|
|
52
|
-
chunk parsers in general.)
|
|
53
|
-
|
|
54
|
-
RegexpChunkRules
|
|
55
|
-
----------------
|
|
56
|
-
|
|
57
|
-
A ``RegexpChunkRule`` is a transformational rule that updates the
|
|
58
|
-
chunking of a text by modifying its ``ChunkString``. Each
|
|
59
|
-
``RegexpChunkRule`` defines the ``apply()`` method, which modifies
|
|
60
|
-
the chunking encoded by a ``ChunkString``. The
|
|
61
|
-
``RegexpChunkRule`` class itself can be used to implement any
|
|
62
|
-
transformational rule based on regular expressions. There are
|
|
63
|
-
also a number of subclasses, which can be used to implement
|
|
64
|
-
simpler types of rules:
|
|
65
|
-
|
|
66
|
-
- ``ChunkRule`` chunks anything that matches a given regular
|
|
67
|
-
expression.
|
|
68
|
-
- ``ChinkRule`` chinks anything that matches a given regular
|
|
69
|
-
expression.
|
|
70
|
-
- ``UnChunkRule`` will un-chunk any chunk that matches a given
|
|
71
|
-
regular expression.
|
|
72
|
-
- ``MergeRule`` can be used to merge two contiguous chunks.
|
|
73
|
-
- ``SplitRule`` can be used to split a single chunk into two
|
|
74
|
-
smaller chunks.
|
|
75
|
-
- ``ExpandLeftRule`` will expand a chunk to incorporate new
|
|
76
|
-
unchunked material on the left.
|
|
77
|
-
- ``ExpandRightRule`` will expand a chunk to incorporate new
|
|
78
|
-
unchunked material on the right.
|
|
79
|
-
|
|
80
|
-
Tag Patterns
|
|
81
|
-
~~~~~~~~~~~~
|
|
82
|
-
|
|
83
|
-
A ``RegexpChunkRule`` uses a modified version of regular
|
|
84
|
-
expression patterns, called "tag patterns". Tag patterns are
|
|
85
|
-
used to match sequences of tags. Examples of tag patterns are::
|
|
86
|
-
|
|
87
|
-
r'(<DT>|<JJ>|<NN>)+'
|
|
88
|
-
r'<NN>+'
|
|
89
|
-
r'<NN.*>'
|
|
90
|
-
|
|
91
|
-
The differences between regular expression patterns and tag
|
|
92
|
-
patterns are:
|
|
93
|
-
|
|
94
|
-
- In tag patterns, ``'<'`` and ``'>'`` act as parentheses; so
|
|
95
|
-
``'<NN>+'`` matches one or more repetitions of ``'<NN>'``, not
|
|
96
|
-
``'<NN'`` followed by one or more repetitions of ``'>'``.
|
|
97
|
-
- Whitespace in tag patterns is ignored. So
|
|
98
|
-
``'<DT> | <NN>'`` is equivalant to ``'<DT>|<NN>'``
|
|
99
|
-
- In tag patterns, ``'.'`` is equivalant to ``'[^{}<>]'``; so
|
|
100
|
-
``'<NN.*>'`` matches any single tag starting with ``'NN'``.
|
|
101
|
-
|
|
102
|
-
The function ``tag_pattern2re_pattern`` can be used to transform
|
|
103
|
-
a tag pattern to an equivalent regular expression pattern.
|
|
104
|
-
|
|
105
|
-
Efficiency
|
|
106
|
-
----------
|
|
107
|
-
|
|
108
|
-
Preliminary tests indicate that ``RegexpChunkParser`` can chunk at a
|
|
109
|
-
rate of about 300 tokens/second, with a moderately complex rule set.
|
|
110
|
-
|
|
111
|
-
There may be problems if ``RegexpChunkParser`` is used with more than
|
|
112
|
-
5,000 tokens at a time. In particular, evaluation of some regular
|
|
113
|
-
expressions may cause the Python regular expression engine to
|
|
114
|
-
exceed its maximum recursion depth. We have attempted to minimize
|
|
115
|
-
these problems, but it is impossible to avoid them completely. We
|
|
116
|
-
therefore recommend that you apply the chunk parser to a single
|
|
117
|
-
sentence at a time.
|
|
118
|
-
|
|
119
|
-
Emacs Tip
|
|
120
|
-
---------
|
|
121
|
-
|
|
122
|
-
If you evaluate the following elisp expression in emacs, it will
|
|
123
|
-
colorize a ``ChunkString`` when you use an interactive python shell
|
|
124
|
-
with emacs or xemacs ("C-c !")::
|
|
125
|
-
|
|
126
|
-
(let ()
|
|
127
|
-
(defconst comint-mode-font-lock-keywords
|
|
128
|
-
'(("<[^>]+>" 0 'font-lock-reference-face)
|
|
129
|
-
("[{}]" 0 'font-lock-function-name-face)))
|
|
130
|
-
(add-hook 'comint-mode-hook (lambda () (turn-on-font-lock))))
|
|
131
|
-
|
|
132
|
-
You can evaluate this code by copying it to a temporary buffer,
|
|
133
|
-
placing the cursor after the last close parenthesis, and typing
|
|
134
|
-
"``C-x C-e``". You should evaluate it before running the interactive
|
|
135
|
-
session. The change will last until you close emacs.
|
|
136
|
-
|
|
137
|
-
Unresolved Issues
|
|
138
|
-
-----------------
|
|
139
|
-
|
|
140
|
-
If we use the ``re`` module for regular expressions, Python's
|
|
141
|
-
regular expression engine generates "maximum recursion depth
|
|
142
|
-
exceeded" errors when processing very large texts, even for
|
|
143
|
-
regular expressions that should not require any recursion. We
|
|
144
|
-
therefore use the ``pre`` module instead. But note that ``pre``
|
|
145
|
-
does not include Unicode support, so this module will not work
|
|
146
|
-
with unicode strings. Note also that ``pre`` regular expressions
|
|
147
|
-
are not quite as advanced as ``re`` ones (e.g., no leftward
|
|
148
|
-
zero-length assertions).
|
|
149
|
-
|
|
150
|
-
:type CHUNK_TAG_PATTERN: regexp
|
|
151
|
-
:var CHUNK_TAG_PATTERN: A regular expression to test whether a tag
|
|
152
|
-
pattern is valid.
|
|
153
|
-
"""
|
|
154
|
-
|
|
155
|
-
from nltk.data import load
|
|
156
|
-
|
|
157
|
-
from nltk.chunk.api import ChunkParserI
|
|
158
|
-
from nltk.chunk.util import (ChunkScore, accuracy, tagstr2tree, conllstr2tree,
|
|
159
|
-
conlltags2tree, tree2conlltags, tree2conllstr, tree2conlltags,
|
|
160
|
-
ieerstr2tree)
|
|
161
|
-
from nltk.chunk.regexp import RegexpChunkParser, RegexpParser
|
|
162
|
-
|
|
163
|
-
# Standard treebank POS tagger
|
|
164
|
-
_BINARY_NE_CHUNKER = 'chunkers/maxent_ne_chunker/english_ace_binary.pickle'
|
|
165
|
-
_MULTICLASS_NE_CHUNKER = 'chunkers/maxent_ne_chunker/english_ace_multiclass.pickle'
|
|
166
|
-
|
|
167
|
-
def ne_chunk(tagged_tokens, binary=False):
|
|
168
|
-
"""
|
|
169
|
-
Use NLTK's currently recommended named entity chunker to
|
|
170
|
-
chunk the given list of tagged tokens.
|
|
171
|
-
"""
|
|
172
|
-
if binary:
|
|
173
|
-
chunker_pickle = _BINARY_NE_CHUNKER
|
|
174
|
-
else:
|
|
175
|
-
chunker_pickle = _MULTICLASS_NE_CHUNKER
|
|
176
|
-
chunker = load(chunker_pickle)
|
|
177
|
-
return chunker.parse(tagged_tokens)
|
|
178
|
-
|
|
179
|
-
def ne_chunk_sents(tagged_sentences, binary=False):
|
|
180
|
-
"""
|
|
181
|
-
Use NLTK's currently recommended named entity chunker to chunk the
|
|
182
|
-
given list of tagged sentences, each consisting of a list of tagged tokens.
|
|
183
|
-
"""
|
|
184
|
-
if binary:
|
|
185
|
-
chunker_pickle = _BINARY_NE_CHUNKER
|
|
186
|
-
else:
|
|
187
|
-
chunker_pickle = _MULTICLASS_NE_CHUNKER
|
|
188
|
-
chunker = load(chunker_pickle)
|
|
189
|
-
return chunker.parse_sents(tagged_sentences)
|
|
190
|
-
|
|
1
|
+
# Natural Language Toolkit: Chunkers
|
|
2
|
+
#
|
|
3
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
4
|
+
# Author: Steven Bird <stevenbird1@gmail.com>
|
|
5
|
+
# Edward Loper <edloper@gmail.com>
|
|
6
|
+
# URL: <http://nltk.org/>
|
|
7
|
+
# For license information, see LICENSE.TXT
|
|
8
|
+
#
|
|
9
|
+
|
|
10
|
+
"""
|
|
11
|
+
Classes and interfaces for identifying non-overlapping linguistic
|
|
12
|
+
groups (such as base noun phrases) in unrestricted text. This task is
|
|
13
|
+
called "chunk parsing" or "chunking", and the identified groups are
|
|
14
|
+
called "chunks". The chunked text is represented using a shallow
|
|
15
|
+
tree called a "chunk structure." A chunk structure is a tree
|
|
16
|
+
containing tokens and chunks, where each chunk is a subtree containing
|
|
17
|
+
only tokens. For example, the chunk structure for base noun phrase
|
|
18
|
+
chunks in the sentence "I saw the big dog on the hill" is::
|
|
19
|
+
|
|
20
|
+
(SENTENCE:
|
|
21
|
+
(NP: <I>)
|
|
22
|
+
<saw>
|
|
23
|
+
(NP: <the> <big> <dog>)
|
|
24
|
+
<on>
|
|
25
|
+
(NP: <the> <hill>))
|
|
26
|
+
|
|
27
|
+
To convert a chunk structure back to a list of tokens, simply use the
|
|
28
|
+
chunk structure's ``leaves()`` method.
|
|
29
|
+
|
|
30
|
+
This module defines ``ChunkParserI``, a standard interface for
|
|
31
|
+
chunking texts; and ``RegexpChunkParser``, a regular-expression based
|
|
32
|
+
implementation of that interface. It also defines ``ChunkScore``, a
|
|
33
|
+
utility class for scoring chunk parsers.
|
|
34
|
+
|
|
35
|
+
RegexpChunkParser
|
|
36
|
+
=================
|
|
37
|
+
|
|
38
|
+
``RegexpChunkParser`` is an implementation of the chunk parser interface
|
|
39
|
+
that uses regular-expressions over tags to chunk a text. Its
|
|
40
|
+
``parse()`` method first constructs a ``ChunkString``, which encodes a
|
|
41
|
+
particular chunking of the input text. Initially, nothing is
|
|
42
|
+
chunked. ``parse.RegexpChunkParser`` then applies a sequence of
|
|
43
|
+
``RegexpChunkRule`` rules to the ``ChunkString``, each of which modifies
|
|
44
|
+
the chunking that it encodes. Finally, the ``ChunkString`` is
|
|
45
|
+
transformed back into a chunk structure, which is returned.
|
|
46
|
+
|
|
47
|
+
``RegexpChunkParser`` can only be used to chunk a single kind of phrase.
|
|
48
|
+
For example, you can use an ``RegexpChunkParser`` to chunk the noun
|
|
49
|
+
phrases in a text, or the verb phrases in a text; but you can not
|
|
50
|
+
use it to simultaneously chunk both noun phrases and verb phrases in
|
|
51
|
+
the same text. (This is a limitation of ``RegexpChunkParser``, not of
|
|
52
|
+
chunk parsers in general.)
|
|
53
|
+
|
|
54
|
+
RegexpChunkRules
|
|
55
|
+
----------------
|
|
56
|
+
|
|
57
|
+
A ``RegexpChunkRule`` is a transformational rule that updates the
|
|
58
|
+
chunking of a text by modifying its ``ChunkString``. Each
|
|
59
|
+
``RegexpChunkRule`` defines the ``apply()`` method, which modifies
|
|
60
|
+
the chunking encoded by a ``ChunkString``. The
|
|
61
|
+
``RegexpChunkRule`` class itself can be used to implement any
|
|
62
|
+
transformational rule based on regular expressions. There are
|
|
63
|
+
also a number of subclasses, which can be used to implement
|
|
64
|
+
simpler types of rules:
|
|
65
|
+
|
|
66
|
+
- ``ChunkRule`` chunks anything that matches a given regular
|
|
67
|
+
expression.
|
|
68
|
+
- ``ChinkRule`` chinks anything that matches a given regular
|
|
69
|
+
expression.
|
|
70
|
+
- ``UnChunkRule`` will un-chunk any chunk that matches a given
|
|
71
|
+
regular expression.
|
|
72
|
+
- ``MergeRule`` can be used to merge two contiguous chunks.
|
|
73
|
+
- ``SplitRule`` can be used to split a single chunk into two
|
|
74
|
+
smaller chunks.
|
|
75
|
+
- ``ExpandLeftRule`` will expand a chunk to incorporate new
|
|
76
|
+
unchunked material on the left.
|
|
77
|
+
- ``ExpandRightRule`` will expand a chunk to incorporate new
|
|
78
|
+
unchunked material on the right.
|
|
79
|
+
|
|
80
|
+
Tag Patterns
|
|
81
|
+
~~~~~~~~~~~~
|
|
82
|
+
|
|
83
|
+
A ``RegexpChunkRule`` uses a modified version of regular
|
|
84
|
+
expression patterns, called "tag patterns". Tag patterns are
|
|
85
|
+
used to match sequences of tags. Examples of tag patterns are::
|
|
86
|
+
|
|
87
|
+
r'(<DT>|<JJ>|<NN>)+'
|
|
88
|
+
r'<NN>+'
|
|
89
|
+
r'<NN.*>'
|
|
90
|
+
|
|
91
|
+
The differences between regular expression patterns and tag
|
|
92
|
+
patterns are:
|
|
93
|
+
|
|
94
|
+
- In tag patterns, ``'<'`` and ``'>'`` act as parentheses; so
|
|
95
|
+
``'<NN>+'`` matches one or more repetitions of ``'<NN>'``, not
|
|
96
|
+
``'<NN'`` followed by one or more repetitions of ``'>'``.
|
|
97
|
+
- Whitespace in tag patterns is ignored. So
|
|
98
|
+
``'<DT> | <NN>'`` is equivalant to ``'<DT>|<NN>'``
|
|
99
|
+
- In tag patterns, ``'.'`` is equivalant to ``'[^{}<>]'``; so
|
|
100
|
+
``'<NN.*>'`` matches any single tag starting with ``'NN'``.
|
|
101
|
+
|
|
102
|
+
The function ``tag_pattern2re_pattern`` can be used to transform
|
|
103
|
+
a tag pattern to an equivalent regular expression pattern.
|
|
104
|
+
|
|
105
|
+
Efficiency
|
|
106
|
+
----------
|
|
107
|
+
|
|
108
|
+
Preliminary tests indicate that ``RegexpChunkParser`` can chunk at a
|
|
109
|
+
rate of about 300 tokens/second, with a moderately complex rule set.
|
|
110
|
+
|
|
111
|
+
There may be problems if ``RegexpChunkParser`` is used with more than
|
|
112
|
+
5,000 tokens at a time. In particular, evaluation of some regular
|
|
113
|
+
expressions may cause the Python regular expression engine to
|
|
114
|
+
exceed its maximum recursion depth. We have attempted to minimize
|
|
115
|
+
these problems, but it is impossible to avoid them completely. We
|
|
116
|
+
therefore recommend that you apply the chunk parser to a single
|
|
117
|
+
sentence at a time.
|
|
118
|
+
|
|
119
|
+
Emacs Tip
|
|
120
|
+
---------
|
|
121
|
+
|
|
122
|
+
If you evaluate the following elisp expression in emacs, it will
|
|
123
|
+
colorize a ``ChunkString`` when you use an interactive python shell
|
|
124
|
+
with emacs or xemacs ("C-c !")::
|
|
125
|
+
|
|
126
|
+
(let ()
|
|
127
|
+
(defconst comint-mode-font-lock-keywords
|
|
128
|
+
'(("<[^>]+>" 0 'font-lock-reference-face)
|
|
129
|
+
("[{}]" 0 'font-lock-function-name-face)))
|
|
130
|
+
(add-hook 'comint-mode-hook (lambda () (turn-on-font-lock))))
|
|
131
|
+
|
|
132
|
+
You can evaluate this code by copying it to a temporary buffer,
|
|
133
|
+
placing the cursor after the last close parenthesis, and typing
|
|
134
|
+
"``C-x C-e``". You should evaluate it before running the interactive
|
|
135
|
+
session. The change will last until you close emacs.
|
|
136
|
+
|
|
137
|
+
Unresolved Issues
|
|
138
|
+
-----------------
|
|
139
|
+
|
|
140
|
+
If we use the ``re`` module for regular expressions, Python's
|
|
141
|
+
regular expression engine generates "maximum recursion depth
|
|
142
|
+
exceeded" errors when processing very large texts, even for
|
|
143
|
+
regular expressions that should not require any recursion. We
|
|
144
|
+
therefore use the ``pre`` module instead. But note that ``pre``
|
|
145
|
+
does not include Unicode support, so this module will not work
|
|
146
|
+
with unicode strings. Note also that ``pre`` regular expressions
|
|
147
|
+
are not quite as advanced as ``re`` ones (e.g., no leftward
|
|
148
|
+
zero-length assertions).
|
|
149
|
+
|
|
150
|
+
:type CHUNK_TAG_PATTERN: regexp
|
|
151
|
+
:var CHUNK_TAG_PATTERN: A regular expression to test whether a tag
|
|
152
|
+
pattern is valid.
|
|
153
|
+
"""
|
|
154
|
+
|
|
155
|
+
from nltk.data import load
|
|
156
|
+
|
|
157
|
+
from nltk.chunk.api import ChunkParserI
|
|
158
|
+
from nltk.chunk.util import (ChunkScore, accuracy, tagstr2tree, conllstr2tree,
|
|
159
|
+
conlltags2tree, tree2conlltags, tree2conllstr, tree2conlltags,
|
|
160
|
+
ieerstr2tree)
|
|
161
|
+
from nltk.chunk.regexp import RegexpChunkParser, RegexpParser
|
|
162
|
+
|
|
163
|
+
# Standard treebank POS tagger
|
|
164
|
+
_BINARY_NE_CHUNKER = 'chunkers/maxent_ne_chunker/english_ace_binary.pickle'
|
|
165
|
+
_MULTICLASS_NE_CHUNKER = 'chunkers/maxent_ne_chunker/english_ace_multiclass.pickle'
|
|
166
|
+
|
|
167
|
+
def ne_chunk(tagged_tokens, binary=False):
|
|
168
|
+
"""
|
|
169
|
+
Use NLTK's currently recommended named entity chunker to
|
|
170
|
+
chunk the given list of tagged tokens.
|
|
171
|
+
"""
|
|
172
|
+
if binary:
|
|
173
|
+
chunker_pickle = _BINARY_NE_CHUNKER
|
|
174
|
+
else:
|
|
175
|
+
chunker_pickle = _MULTICLASS_NE_CHUNKER
|
|
176
|
+
chunker = load(chunker_pickle)
|
|
177
|
+
return chunker.parse(tagged_tokens)
|
|
178
|
+
|
|
179
|
+
def ne_chunk_sents(tagged_sentences, binary=False):
|
|
180
|
+
"""
|
|
181
|
+
Use NLTK's currently recommended named entity chunker to chunk the
|
|
182
|
+
given list of tagged sentences, each consisting of a list of tagged tokens.
|
|
183
|
+
"""
|
|
184
|
+
if binary:
|
|
185
|
+
chunker_pickle = _BINARY_NE_CHUNKER
|
|
186
|
+
else:
|
|
187
|
+
chunker_pickle = _MULTICLASS_NE_CHUNKER
|
|
188
|
+
chunker = load(chunker_pickle)
|
|
189
|
+
return chunker.parse_sents(tagged_sentences)
|
|
190
|
+
|
|
@@ -1,51 +1,51 @@
|
|
|
1
|
-
# Natural Language Toolkit: Chunk parsing API
|
|
2
|
-
#
|
|
3
|
-
# Copyright (C) 2001-
|
|
4
|
-
# Author: Edward Loper <edloper@gmail.com>
|
|
5
|
-
# Steven Bird <stevenbird1@gmail.com> (minor additions)
|
|
6
|
-
# URL: <http://nltk.org/>
|
|
7
|
-
# For license information, see LICENSE.TXT
|
|
8
|
-
|
|
9
|
-
##//////////////////////////////////////////////////////
|
|
10
|
-
## Chunk Parser Interface
|
|
11
|
-
##//////////////////////////////////////////////////////
|
|
12
|
-
|
|
13
|
-
from nltk.parse import ParserI
|
|
14
|
-
|
|
15
|
-
from nltk.chunk.util import ChunkScore
|
|
16
|
-
|
|
17
|
-
class ChunkParserI(ParserI):
|
|
18
|
-
"""
|
|
19
|
-
A processing interface for identifying non-overlapping groups in
|
|
20
|
-
unrestricted text. Typically, chunk parsers are used to find base
|
|
21
|
-
syntactic constituents, such as base noun phrases. Unlike
|
|
22
|
-
``ParserI``, ``ChunkParserI`` guarantees that the ``parse()`` method
|
|
23
|
-
will always generate a parse.
|
|
24
|
-
"""
|
|
25
|
-
def parse(self, tokens):
|
|
26
|
-
"""
|
|
27
|
-
Return the best chunk structure for the given tokens
|
|
28
|
-
and return a tree.
|
|
29
|
-
|
|
30
|
-
:param tokens: The list of (word, tag) tokens to be chunked.
|
|
31
|
-
:type tokens: list(tuple)
|
|
32
|
-
:rtype: Tree
|
|
33
|
-
"""
|
|
34
|
-
raise NotImplementedError()
|
|
35
|
-
|
|
36
|
-
def evaluate(self, gold):
|
|
37
|
-
"""
|
|
38
|
-
Score the accuracy of the chunker against the gold standard.
|
|
39
|
-
Remove the chunking the gold standard text, rechunk it using
|
|
40
|
-
the chunker, and return a ``ChunkScore`` object
|
|
41
|
-
reflecting the performance of this chunk peraser.
|
|
42
|
-
|
|
43
|
-
:type gold: list(Tree)
|
|
44
|
-
:param gold: The list of chunked sentences to score the chunker on.
|
|
45
|
-
:rtype: ChunkScore
|
|
46
|
-
"""
|
|
47
|
-
chunkscore = ChunkScore()
|
|
48
|
-
for correct in gold:
|
|
49
|
-
chunkscore.score(correct, self.parse(correct.leaves()))
|
|
50
|
-
return chunkscore
|
|
51
|
-
|
|
1
|
+
# Natural Language Toolkit: Chunk parsing API
|
|
2
|
+
#
|
|
3
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
4
|
+
# Author: Edward Loper <edloper@gmail.com>
|
|
5
|
+
# Steven Bird <stevenbird1@gmail.com> (minor additions)
|
|
6
|
+
# URL: <http://nltk.org/>
|
|
7
|
+
# For license information, see LICENSE.TXT
|
|
8
|
+
|
|
9
|
+
##//////////////////////////////////////////////////////
|
|
10
|
+
## Chunk Parser Interface
|
|
11
|
+
##//////////////////////////////////////////////////////
|
|
12
|
+
|
|
13
|
+
from nltk.parse import ParserI
|
|
14
|
+
|
|
15
|
+
from nltk.chunk.util import ChunkScore
|
|
16
|
+
|
|
17
|
+
class ChunkParserI(ParserI):
|
|
18
|
+
"""
|
|
19
|
+
A processing interface for identifying non-overlapping groups in
|
|
20
|
+
unrestricted text. Typically, chunk parsers are used to find base
|
|
21
|
+
syntactic constituents, such as base noun phrases. Unlike
|
|
22
|
+
``ParserI``, ``ChunkParserI`` guarantees that the ``parse()`` method
|
|
23
|
+
will always generate a parse.
|
|
24
|
+
"""
|
|
25
|
+
def parse(self, tokens):
|
|
26
|
+
"""
|
|
27
|
+
Return the best chunk structure for the given tokens
|
|
28
|
+
and return a tree.
|
|
29
|
+
|
|
30
|
+
:param tokens: The list of (word, tag) tokens to be chunked.
|
|
31
|
+
:type tokens: list(tuple)
|
|
32
|
+
:rtype: Tree
|
|
33
|
+
"""
|
|
34
|
+
raise NotImplementedError()
|
|
35
|
+
|
|
36
|
+
def evaluate(self, gold):
|
|
37
|
+
"""
|
|
38
|
+
Score the accuracy of the chunker against the gold standard.
|
|
39
|
+
Remove the chunking the gold standard text, rechunk it using
|
|
40
|
+
the chunker, and return a ``ChunkScore`` object
|
|
41
|
+
reflecting the performance of this chunk peraser.
|
|
42
|
+
|
|
43
|
+
:type gold: list(Tree)
|
|
44
|
+
:param gold: The list of chunked sentences to score the chunker on.
|
|
45
|
+
:rtype: ChunkScore
|
|
46
|
+
"""
|
|
47
|
+
chunkscore = ChunkScore()
|
|
48
|
+
for correct in gold:
|
|
49
|
+
chunkscore.score(correct, self.parse(correct.leaves()))
|
|
50
|
+
return chunkscore
|
|
51
|
+
|