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,312 +1,324 @@
|
|
|
1
|
-
# Natural Language Toolkit: Classifier Utility Functions
|
|
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
|
-
Utility functions and classes for classifiers.
|
|
11
|
-
"""
|
|
12
|
-
from __future__ import print_function, division
|
|
13
|
-
|
|
14
|
-
import math
|
|
15
|
-
|
|
16
|
-
#from nltk.util import Deprecated
|
|
17
|
-
import nltk.classify.util # for accuracy & log_likelihood
|
|
18
|
-
from nltk.util import LazyMap
|
|
19
|
-
|
|
20
|
-
######################################################################
|
|
21
|
-
#{ Helper Functions
|
|
22
|
-
######################################################################
|
|
23
|
-
|
|
24
|
-
# alternative name possibility: 'map_featurefunc()'?
|
|
25
|
-
# alternative name possibility: 'detect_features()'?
|
|
26
|
-
# alternative name possibility: 'map_featuredetect()'?
|
|
27
|
-
# or.. just have users use LazyMap directly?
|
|
28
|
-
def apply_features(feature_func, toks, labeled=None):
|
|
29
|
-
"""
|
|
30
|
-
Use the ``LazyMap`` class to construct a lazy list-like
|
|
31
|
-
object that is analogous to ``map(feature_func, toks)``. In
|
|
32
|
-
particular, if ``labeled=False``, then the returned list-like
|
|
33
|
-
object's values are equal to::
|
|
34
|
-
|
|
35
|
-
[feature_func(tok) for tok in toks]
|
|
36
|
-
|
|
37
|
-
If ``labeled=True``, then the returned list-like object's values
|
|
38
|
-
are equal to::
|
|
39
|
-
|
|
40
|
-
[(feature_func(tok), label) for (tok, label) in toks]
|
|
41
|
-
|
|
42
|
-
The primary purpose of this function is to avoid the memory
|
|
43
|
-
overhead involved in storing all the featuresets for every token
|
|
44
|
-
in a corpus. Instead, these featuresets are constructed lazily,
|
|
45
|
-
as-needed. The reduction in memory overhead can be especially
|
|
46
|
-
significant when the underlying list of tokens is itself lazy (as
|
|
47
|
-
is the case with many corpus readers).
|
|
48
|
-
|
|
49
|
-
:param feature_func: The function that will be applied to each
|
|
50
|
-
token. It should return a featureset -- i.e., a dict
|
|
51
|
-
mapping feature names to feature values.
|
|
52
|
-
:param toks: The list of tokens to which ``feature_func`` should be
|
|
53
|
-
applied. If ``labeled=True``, then the list elements will be
|
|
54
|
-
passed directly to ``feature_func()``. If ``labeled=False``,
|
|
55
|
-
then the list elements should be tuples ``(tok,label)``, and
|
|
56
|
-
``tok`` will be passed to ``feature_func()``.
|
|
57
|
-
:param labeled: If true, then ``toks`` contains labeled tokens --
|
|
58
|
-
i.e., tuples of the form ``(tok, label)``. (Default:
|
|
59
|
-
auto-detect based on types.)
|
|
60
|
-
"""
|
|
61
|
-
if labeled is None:
|
|
62
|
-
labeled = toks and isinstance(toks[0], (tuple, list))
|
|
63
|
-
if labeled:
|
|
64
|
-
def lazy_func(labeled_token):
|
|
65
|
-
return (feature_func(labeled_token[0]), labeled_token[1])
|
|
66
|
-
return LazyMap(lazy_func, toks)
|
|
67
|
-
else:
|
|
68
|
-
return LazyMap(feature_func, toks)
|
|
69
|
-
|
|
70
|
-
def attested_labels(tokens):
|
|
71
|
-
"""
|
|
72
|
-
:return: A list of all labels that are attested in the given list
|
|
73
|
-
of tokens.
|
|
74
|
-
:rtype: list of (immutable)
|
|
75
|
-
:param tokens: The list of classified tokens from which to extract
|
|
76
|
-
labels. A classified token has the form ``(token, label)``.
|
|
77
|
-
:type tokens: list
|
|
78
|
-
"""
|
|
79
|
-
return tuple(set(label for (tok, label) in tokens))
|
|
80
|
-
|
|
81
|
-
def log_likelihood(classifier, gold):
|
|
82
|
-
results = classifier.prob_classify_many([fs for (fs, l) in gold])
|
|
83
|
-
ll = [pdist.prob(l) for ((fs, l), pdist) in zip(gold, results)]
|
|
84
|
-
return math.log(sum(ll) / len(ll))
|
|
85
|
-
|
|
86
|
-
def accuracy(classifier, gold):
|
|
87
|
-
results = classifier.classify_many([fs for (fs, l) in gold])
|
|
88
|
-
correct = [l == r for ((fs, l), r) in zip(gold, results)]
|
|
89
|
-
if correct:
|
|
90
|
-
return sum(correct) / len(correct)
|
|
91
|
-
else:
|
|
92
|
-
return 0
|
|
93
|
-
|
|
94
|
-
class CutoffChecker(object):
|
|
95
|
-
"""
|
|
96
|
-
A helper class that implements cutoff checks based on number of
|
|
97
|
-
iterations and log likelihood.
|
|
98
|
-
|
|
99
|
-
Accuracy cutoffs are also implemented, but they're almost never
|
|
100
|
-
a good idea to use.
|
|
101
|
-
"""
|
|
102
|
-
def __init__(self, cutoffs):
|
|
103
|
-
self.cutoffs = cutoffs.copy()
|
|
104
|
-
if 'min_ll' in cutoffs:
|
|
105
|
-
cutoffs['min_ll'] = -abs(cutoffs['min_ll'])
|
|
106
|
-
if 'min_lldelta' in cutoffs:
|
|
107
|
-
cutoffs['min_lldelta'] = abs(cutoffs['min_lldelta'])
|
|
108
|
-
self.ll = None
|
|
109
|
-
self.acc = None
|
|
110
|
-
self.iter = 1
|
|
111
|
-
|
|
112
|
-
def check(self, classifier, train_toks):
|
|
113
|
-
cutoffs = self.cutoffs
|
|
114
|
-
self.iter += 1
|
|
115
|
-
if 'max_iter' in cutoffs and self.iter >= cutoffs['max_iter']:
|
|
116
|
-
return True # iteration cutoff.
|
|
117
|
-
|
|
118
|
-
new_ll = nltk.classify.util.log_likelihood(classifier, train_toks)
|
|
119
|
-
if math.isnan(new_ll):
|
|
120
|
-
return True
|
|
121
|
-
|
|
122
|
-
if 'min_ll' in cutoffs or 'min_lldelta' in cutoffs:
|
|
123
|
-
if 'min_ll' in cutoffs and new_ll >= cutoffs['min_ll']:
|
|
124
|
-
return True # log likelihood cutoff
|
|
125
|
-
if ('min_lldelta' in cutoffs and self.ll and
|
|
126
|
-
((new_ll - self.ll) <= abs(cutoffs['min_lldelta']))):
|
|
127
|
-
return True # log likelihood delta cutoff
|
|
128
|
-
self.ll = new_ll
|
|
129
|
-
|
|
130
|
-
if 'max_acc' in cutoffs or 'min_accdelta' in cutoffs:
|
|
131
|
-
new_acc = nltk.classify.util.log_likelihood(
|
|
132
|
-
classifier, train_toks)
|
|
133
|
-
if 'max_acc' in cutoffs and new_acc >= cutoffs['max_acc']:
|
|
134
|
-
return True # log likelihood cutoff
|
|
135
|
-
if ('min_accdelta' in cutoffs and self.acc and
|
|
136
|
-
((new_acc - self.acc) <= abs(cutoffs['min_accdelta']))):
|
|
137
|
-
return True # log likelihood delta cutoff
|
|
138
|
-
self.acc = new_acc
|
|
139
|
-
|
|
140
|
-
return False # no cutoff reached.
|
|
141
|
-
|
|
142
|
-
######################################################################
|
|
143
|
-
#{ Demos
|
|
144
|
-
######################################################################
|
|
145
|
-
|
|
146
|
-
def names_demo_features(name):
|
|
147
|
-
features = {}
|
|
148
|
-
features['alwayson'] = True
|
|
149
|
-
features['startswith'] = name[0].lower()
|
|
150
|
-
features['endswith'] = name[-1].lower()
|
|
151
|
-
for letter in 'abcdefghijklmnopqrstuvwxyz':
|
|
152
|
-
features['count(%s)' % letter] = name.lower().count(letter)
|
|
153
|
-
features['has(%s)' % letter] = letter in name.lower()
|
|
154
|
-
return features
|
|
155
|
-
|
|
156
|
-
def binary_names_demo_features(name):
|
|
157
|
-
features = {}
|
|
158
|
-
features['alwayson'] = True
|
|
159
|
-
features['startswith(vowel)'] = name[0].lower() in 'aeiouy'
|
|
160
|
-
features['endswith(vowel)'] = name[-1].lower() in 'aeiouy'
|
|
161
|
-
for letter in 'abcdefghijklmnopqrstuvwxyz':
|
|
162
|
-
features['count(%s)' % letter] = name.lower().count(letter)
|
|
163
|
-
features['has(%s)' % letter] = letter in name.lower()
|
|
164
|
-
features['startswith(%s)' % letter] = (letter == name[0].lower())
|
|
165
|
-
features['endswith(%s)' % letter] = (letter == name[-1].lower())
|
|
166
|
-
return features
|
|
167
|
-
|
|
168
|
-
def names_demo(trainer, features=names_demo_features):
|
|
169
|
-
from nltk.corpus import names
|
|
170
|
-
import random
|
|
171
|
-
|
|
172
|
-
# Construct a list of classified names, using the names corpus.
|
|
173
|
-
namelist = ([(name, 'male') for name in names.words('male.txt')] +
|
|
174
|
-
[(name, 'female') for name in names.words('female.txt')])
|
|
175
|
-
|
|
176
|
-
# Randomly split the names into a test & train set.
|
|
177
|
-
random.seed(123456)
|
|
178
|
-
random.shuffle(namelist)
|
|
179
|
-
train = namelist[:5000]
|
|
180
|
-
test = namelist[5000:5500]
|
|
181
|
-
|
|
182
|
-
# Train up a classifier.
|
|
183
|
-
print('Training classifier...')
|
|
184
|
-
classifier = trainer( [(features(n), g) for (n, g) in train] )
|
|
185
|
-
|
|
186
|
-
# Run the classifier on the test data.
|
|
187
|
-
print('Testing classifier...')
|
|
188
|
-
acc = accuracy(classifier, [(features(n), g) for (n, g) in test])
|
|
189
|
-
print('Accuracy: %6.4f' % acc)
|
|
190
|
-
|
|
191
|
-
# For classifiers that can find probabilities, show the log
|
|
192
|
-
# likelihood and some sample probability distributions.
|
|
193
|
-
try:
|
|
194
|
-
test_featuresets = [features(n) for (n, g) in test]
|
|
195
|
-
pdists = classifier.prob_classify_many(test_featuresets)
|
|
196
|
-
ll = [pdist.logprob(gold)
|
|
197
|
-
for ((name, gold), pdist) in zip(test, pdists)]
|
|
198
|
-
print('Avg. log likelihood: %6.4f' % (sum(ll) / len(test)))
|
|
199
|
-
print()
|
|
200
|
-
print('Unseen Names P(Male) P(Female)\n'+'-'*40)
|
|
201
|
-
for ((name, gender), pdist) in list(zip(test, pdists))[:5]:
|
|
202
|
-
if gender == 'male':
|
|
203
|
-
fmt = ' %-15s *%6.4f %6.4f'
|
|
204
|
-
else:
|
|
205
|
-
fmt = ' %-15s %6.4f *%6.4f'
|
|
206
|
-
print(fmt % (name, pdist.prob('male'), pdist.prob('female')))
|
|
207
|
-
except NotImplementedError:
|
|
208
|
-
pass
|
|
209
|
-
|
|
210
|
-
# Return the classifier
|
|
211
|
-
return classifier
|
|
212
|
-
|
|
213
|
-
def partial_names_demo(trainer, features=names_demo_features):
|
|
214
|
-
from nltk.corpus import names
|
|
215
|
-
import random
|
|
216
|
-
|
|
217
|
-
male_names = names.words('male.txt')
|
|
218
|
-
female_names = names.words('female.txt')
|
|
219
|
-
|
|
220
|
-
random.seed(654321)
|
|
221
|
-
random.shuffle(male_names)
|
|
222
|
-
random.shuffle(female_names)
|
|
223
|
-
|
|
224
|
-
# Create a list of male names to be used as positive-labeled examples for training
|
|
225
|
-
positive = map(features, male_names[:2000])
|
|
226
|
-
|
|
227
|
-
# Create a list of male and female names to be used as unlabeled examples
|
|
228
|
-
unlabeled = map(features, male_names[2000:2500] + female_names[:500])
|
|
229
|
-
|
|
230
|
-
# Create a test set with correctly-labeled male and female names
|
|
231
|
-
test = [(name, True) for name in male_names[2500:2750]] \
|
|
232
|
-
+ [(name, False) for name in female_names[500:750]]
|
|
233
|
-
|
|
234
|
-
random.shuffle(test)
|
|
235
|
-
|
|
236
|
-
# Train up a classifier.
|
|
237
|
-
print('Training classifier...')
|
|
238
|
-
classifier = trainer(positive, unlabeled)
|
|
239
|
-
|
|
240
|
-
# Run the classifier on the test data.
|
|
241
|
-
print('Testing classifier...')
|
|
242
|
-
acc = accuracy(classifier, [(features(n), m) for (n, m) in test])
|
|
243
|
-
print('Accuracy: %6.4f' % acc)
|
|
244
|
-
|
|
245
|
-
# For classifiers that can find probabilities, show the log
|
|
246
|
-
# likelihood and some sample probability distributions.
|
|
247
|
-
try:
|
|
248
|
-
test_featuresets = [features(n) for (n, m) in test]
|
|
249
|
-
pdists = classifier.prob_classify_many(test_featuresets)
|
|
250
|
-
ll = [pdist.logprob(gold)
|
|
251
|
-
for ((name, gold), pdist) in zip(test, pdists)]
|
|
252
|
-
print('Avg. log likelihood: %6.4f' % (sum(ll) / len(test)))
|
|
253
|
-
print()
|
|
254
|
-
print('Unseen Names P(Male) P(Female)\n'+'-'*40)
|
|
255
|
-
for ((name, is_male), pdist) in zip(test, pdists)[:5]:
|
|
256
|
-
if is_male == True:
|
|
257
|
-
fmt = ' %-15s *%6.4f %6.4f'
|
|
258
|
-
else:
|
|
259
|
-
fmt = ' %-15s %6.4f *%6.4f'
|
|
260
|
-
print(fmt % (name, pdist.prob(True), pdist.prob(False)))
|
|
261
|
-
except NotImplementedError:
|
|
262
|
-
pass
|
|
263
|
-
|
|
264
|
-
# Return the classifier
|
|
265
|
-
return classifier
|
|
266
|
-
|
|
267
|
-
_inst_cache = {}
|
|
268
|
-
def wsd_demo(trainer, word, features, n=1000):
|
|
269
|
-
from nltk.corpus import senseval
|
|
270
|
-
import random
|
|
271
|
-
|
|
272
|
-
# Get the instances.
|
|
273
|
-
print('Reading data...')
|
|
274
|
-
global _inst_cache
|
|
275
|
-
if word not in _inst_cache:
|
|
276
|
-
_inst_cache[word] = [(i, i.senses[0]) for i in senseval.instances(word)]
|
|
277
|
-
instances = _inst_cache[word][:]
|
|
278
|
-
if n > len(instances):
|
|
279
|
-
n = len(instances)
|
|
280
|
-
senses = list(set(l for (i, l) in instances))
|
|
281
|
-
print(' Senses: ' + ' '.join(senses))
|
|
282
|
-
|
|
283
|
-
# Randomly split the names into a test & train set.
|
|
284
|
-
print('Splitting into test & train...')
|
|
285
|
-
random.seed(123456)
|
|
286
|
-
random.shuffle(instances)
|
|
287
|
-
train = instances[:int(.8*n)]
|
|
288
|
-
test = instances[int(.8*n):n]
|
|
289
|
-
|
|
290
|
-
# Train up a classifier.
|
|
291
|
-
print('Training classifier...')
|
|
292
|
-
classifier = trainer([(features(i), l) for (i, l) in train])
|
|
293
|
-
|
|
294
|
-
# Run the classifier on the test data.
|
|
295
|
-
print('Testing classifier...')
|
|
296
|
-
acc = accuracy(classifier, [(features(i), l) for (i, l) in test])
|
|
297
|
-
print('Accuracy: %6.4f' % acc)
|
|
298
|
-
|
|
299
|
-
# For classifiers that can find probabilities, show the log
|
|
300
|
-
# likelihood and some sample probability distributions.
|
|
301
|
-
try:
|
|
302
|
-
test_featuresets = [features(i) for (i, n) in test]
|
|
303
|
-
pdists = classifier.prob_classify_many(test_featuresets)
|
|
304
|
-
ll = [pdist.logprob(gold)
|
|
305
|
-
for ((name, gold), pdist) in zip(test, pdists)]
|
|
306
|
-
print('Avg. log likelihood: %6.4f' % (sum(ll) / len(test)))
|
|
307
|
-
except NotImplementedError:
|
|
308
|
-
pass
|
|
309
|
-
|
|
310
|
-
# Return the classifier
|
|
311
|
-
return classifier
|
|
312
|
-
|
|
1
|
+
# Natural Language Toolkit: Classifier Utility Functions
|
|
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
|
+
Utility functions and classes for classifiers.
|
|
11
|
+
"""
|
|
12
|
+
from __future__ import print_function, division
|
|
13
|
+
|
|
14
|
+
import math
|
|
15
|
+
|
|
16
|
+
#from nltk.util import Deprecated
|
|
17
|
+
import nltk.classify.util # for accuracy & log_likelihood
|
|
18
|
+
from nltk.util import LazyMap
|
|
19
|
+
|
|
20
|
+
######################################################################
|
|
21
|
+
#{ Helper Functions
|
|
22
|
+
######################################################################
|
|
23
|
+
|
|
24
|
+
# alternative name possibility: 'map_featurefunc()'?
|
|
25
|
+
# alternative name possibility: 'detect_features()'?
|
|
26
|
+
# alternative name possibility: 'map_featuredetect()'?
|
|
27
|
+
# or.. just have users use LazyMap directly?
|
|
28
|
+
def apply_features(feature_func, toks, labeled=None):
|
|
29
|
+
"""
|
|
30
|
+
Use the ``LazyMap`` class to construct a lazy list-like
|
|
31
|
+
object that is analogous to ``map(feature_func, toks)``. In
|
|
32
|
+
particular, if ``labeled=False``, then the returned list-like
|
|
33
|
+
object's values are equal to::
|
|
34
|
+
|
|
35
|
+
[feature_func(tok) for tok in toks]
|
|
36
|
+
|
|
37
|
+
If ``labeled=True``, then the returned list-like object's values
|
|
38
|
+
are equal to::
|
|
39
|
+
|
|
40
|
+
[(feature_func(tok), label) for (tok, label) in toks]
|
|
41
|
+
|
|
42
|
+
The primary purpose of this function is to avoid the memory
|
|
43
|
+
overhead involved in storing all the featuresets for every token
|
|
44
|
+
in a corpus. Instead, these featuresets are constructed lazily,
|
|
45
|
+
as-needed. The reduction in memory overhead can be especially
|
|
46
|
+
significant when the underlying list of tokens is itself lazy (as
|
|
47
|
+
is the case with many corpus readers).
|
|
48
|
+
|
|
49
|
+
:param feature_func: The function that will be applied to each
|
|
50
|
+
token. It should return a featureset -- i.e., a dict
|
|
51
|
+
mapping feature names to feature values.
|
|
52
|
+
:param toks: The list of tokens to which ``feature_func`` should be
|
|
53
|
+
applied. If ``labeled=True``, then the list elements will be
|
|
54
|
+
passed directly to ``feature_func()``. If ``labeled=False``,
|
|
55
|
+
then the list elements should be tuples ``(tok,label)``, and
|
|
56
|
+
``tok`` will be passed to ``feature_func()``.
|
|
57
|
+
:param labeled: If true, then ``toks`` contains labeled tokens --
|
|
58
|
+
i.e., tuples of the form ``(tok, label)``. (Default:
|
|
59
|
+
auto-detect based on types.)
|
|
60
|
+
"""
|
|
61
|
+
if labeled is None:
|
|
62
|
+
labeled = toks and isinstance(toks[0], (tuple, list))
|
|
63
|
+
if labeled:
|
|
64
|
+
def lazy_func(labeled_token):
|
|
65
|
+
return (feature_func(labeled_token[0]), labeled_token[1])
|
|
66
|
+
return LazyMap(lazy_func, toks)
|
|
67
|
+
else:
|
|
68
|
+
return LazyMap(feature_func, toks)
|
|
69
|
+
|
|
70
|
+
def attested_labels(tokens):
|
|
71
|
+
"""
|
|
72
|
+
:return: A list of all labels that are attested in the given list
|
|
73
|
+
of tokens.
|
|
74
|
+
:rtype: list of (immutable)
|
|
75
|
+
:param tokens: The list of classified tokens from which to extract
|
|
76
|
+
labels. A classified token has the form ``(token, label)``.
|
|
77
|
+
:type tokens: list
|
|
78
|
+
"""
|
|
79
|
+
return tuple(set(label for (tok, label) in tokens))
|
|
80
|
+
|
|
81
|
+
def log_likelihood(classifier, gold):
|
|
82
|
+
results = classifier.prob_classify_many([fs for (fs, l) in gold])
|
|
83
|
+
ll = [pdist.prob(l) for ((fs, l), pdist) in zip(gold, results)]
|
|
84
|
+
return math.log(sum(ll) / len(ll))
|
|
85
|
+
|
|
86
|
+
def accuracy(classifier, gold):
|
|
87
|
+
results = classifier.classify_many([fs for (fs, l) in gold])
|
|
88
|
+
correct = [l == r for ((fs, l), r) in zip(gold, results)]
|
|
89
|
+
if correct:
|
|
90
|
+
return sum(correct) / len(correct)
|
|
91
|
+
else:
|
|
92
|
+
return 0
|
|
93
|
+
|
|
94
|
+
class CutoffChecker(object):
|
|
95
|
+
"""
|
|
96
|
+
A helper class that implements cutoff checks based on number of
|
|
97
|
+
iterations and log likelihood.
|
|
98
|
+
|
|
99
|
+
Accuracy cutoffs are also implemented, but they're almost never
|
|
100
|
+
a good idea to use.
|
|
101
|
+
"""
|
|
102
|
+
def __init__(self, cutoffs):
|
|
103
|
+
self.cutoffs = cutoffs.copy()
|
|
104
|
+
if 'min_ll' in cutoffs:
|
|
105
|
+
cutoffs['min_ll'] = -abs(cutoffs['min_ll'])
|
|
106
|
+
if 'min_lldelta' in cutoffs:
|
|
107
|
+
cutoffs['min_lldelta'] = abs(cutoffs['min_lldelta'])
|
|
108
|
+
self.ll = None
|
|
109
|
+
self.acc = None
|
|
110
|
+
self.iter = 1
|
|
111
|
+
|
|
112
|
+
def check(self, classifier, train_toks):
|
|
113
|
+
cutoffs = self.cutoffs
|
|
114
|
+
self.iter += 1
|
|
115
|
+
if 'max_iter' in cutoffs and self.iter >= cutoffs['max_iter']:
|
|
116
|
+
return True # iteration cutoff.
|
|
117
|
+
|
|
118
|
+
new_ll = nltk.classify.util.log_likelihood(classifier, train_toks)
|
|
119
|
+
if math.isnan(new_ll):
|
|
120
|
+
return True
|
|
121
|
+
|
|
122
|
+
if 'min_ll' in cutoffs or 'min_lldelta' in cutoffs:
|
|
123
|
+
if 'min_ll' in cutoffs and new_ll >= cutoffs['min_ll']:
|
|
124
|
+
return True # log likelihood cutoff
|
|
125
|
+
if ('min_lldelta' in cutoffs and self.ll and
|
|
126
|
+
((new_ll - self.ll) <= abs(cutoffs['min_lldelta']))):
|
|
127
|
+
return True # log likelihood delta cutoff
|
|
128
|
+
self.ll = new_ll
|
|
129
|
+
|
|
130
|
+
if 'max_acc' in cutoffs or 'min_accdelta' in cutoffs:
|
|
131
|
+
new_acc = nltk.classify.util.log_likelihood(
|
|
132
|
+
classifier, train_toks)
|
|
133
|
+
if 'max_acc' in cutoffs and new_acc >= cutoffs['max_acc']:
|
|
134
|
+
return True # log likelihood cutoff
|
|
135
|
+
if ('min_accdelta' in cutoffs and self.acc and
|
|
136
|
+
((new_acc - self.acc) <= abs(cutoffs['min_accdelta']))):
|
|
137
|
+
return True # log likelihood delta cutoff
|
|
138
|
+
self.acc = new_acc
|
|
139
|
+
|
|
140
|
+
return False # no cutoff reached.
|
|
141
|
+
|
|
142
|
+
######################################################################
|
|
143
|
+
#{ Demos
|
|
144
|
+
######################################################################
|
|
145
|
+
|
|
146
|
+
def names_demo_features(name):
|
|
147
|
+
features = {}
|
|
148
|
+
features['alwayson'] = True
|
|
149
|
+
features['startswith'] = name[0].lower()
|
|
150
|
+
features['endswith'] = name[-1].lower()
|
|
151
|
+
for letter in 'abcdefghijklmnopqrstuvwxyz':
|
|
152
|
+
features['count(%s)' % letter] = name.lower().count(letter)
|
|
153
|
+
features['has(%s)' % letter] = letter in name.lower()
|
|
154
|
+
return features
|
|
155
|
+
|
|
156
|
+
def binary_names_demo_features(name):
|
|
157
|
+
features = {}
|
|
158
|
+
features['alwayson'] = True
|
|
159
|
+
features['startswith(vowel)'] = name[0].lower() in 'aeiouy'
|
|
160
|
+
features['endswith(vowel)'] = name[-1].lower() in 'aeiouy'
|
|
161
|
+
for letter in 'abcdefghijklmnopqrstuvwxyz':
|
|
162
|
+
features['count(%s)' % letter] = name.lower().count(letter)
|
|
163
|
+
features['has(%s)' % letter] = letter in name.lower()
|
|
164
|
+
features['startswith(%s)' % letter] = (letter == name[0].lower())
|
|
165
|
+
features['endswith(%s)' % letter] = (letter == name[-1].lower())
|
|
166
|
+
return features
|
|
167
|
+
|
|
168
|
+
def names_demo(trainer, features=names_demo_features):
|
|
169
|
+
from nltk.corpus import names
|
|
170
|
+
import random
|
|
171
|
+
|
|
172
|
+
# Construct a list of classified names, using the names corpus.
|
|
173
|
+
namelist = ([(name, 'male') for name in names.words('male.txt')] +
|
|
174
|
+
[(name, 'female') for name in names.words('female.txt')])
|
|
175
|
+
|
|
176
|
+
# Randomly split the names into a test & train set.
|
|
177
|
+
random.seed(123456)
|
|
178
|
+
random.shuffle(namelist)
|
|
179
|
+
train = namelist[:5000]
|
|
180
|
+
test = namelist[5000:5500]
|
|
181
|
+
|
|
182
|
+
# Train up a classifier.
|
|
183
|
+
print('Training classifier...')
|
|
184
|
+
classifier = trainer( [(features(n), g) for (n, g) in train] )
|
|
185
|
+
|
|
186
|
+
# Run the classifier on the test data.
|
|
187
|
+
print('Testing classifier...')
|
|
188
|
+
acc = accuracy(classifier, [(features(n), g) for (n, g) in test])
|
|
189
|
+
print('Accuracy: %6.4f' % acc)
|
|
190
|
+
|
|
191
|
+
# For classifiers that can find probabilities, show the log
|
|
192
|
+
# likelihood and some sample probability distributions.
|
|
193
|
+
try:
|
|
194
|
+
test_featuresets = [features(n) for (n, g) in test]
|
|
195
|
+
pdists = classifier.prob_classify_many(test_featuresets)
|
|
196
|
+
ll = [pdist.logprob(gold)
|
|
197
|
+
for ((name, gold), pdist) in zip(test, pdists)]
|
|
198
|
+
print('Avg. log likelihood: %6.4f' % (sum(ll) / len(test)))
|
|
199
|
+
print()
|
|
200
|
+
print('Unseen Names P(Male) P(Female)\n'+'-'*40)
|
|
201
|
+
for ((name, gender), pdist) in list(zip(test, pdists))[:5]:
|
|
202
|
+
if gender == 'male':
|
|
203
|
+
fmt = ' %-15s *%6.4f %6.4f'
|
|
204
|
+
else:
|
|
205
|
+
fmt = ' %-15s %6.4f *%6.4f'
|
|
206
|
+
print(fmt % (name, pdist.prob('male'), pdist.prob('female')))
|
|
207
|
+
except NotImplementedError:
|
|
208
|
+
pass
|
|
209
|
+
|
|
210
|
+
# Return the classifier
|
|
211
|
+
return classifier
|
|
212
|
+
|
|
213
|
+
def partial_names_demo(trainer, features=names_demo_features):
|
|
214
|
+
from nltk.corpus import names
|
|
215
|
+
import random
|
|
216
|
+
|
|
217
|
+
male_names = names.words('male.txt')
|
|
218
|
+
female_names = names.words('female.txt')
|
|
219
|
+
|
|
220
|
+
random.seed(654321)
|
|
221
|
+
random.shuffle(male_names)
|
|
222
|
+
random.shuffle(female_names)
|
|
223
|
+
|
|
224
|
+
# Create a list of male names to be used as positive-labeled examples for training
|
|
225
|
+
positive = map(features, male_names[:2000])
|
|
226
|
+
|
|
227
|
+
# Create a list of male and female names to be used as unlabeled examples
|
|
228
|
+
unlabeled = map(features, male_names[2000:2500] + female_names[:500])
|
|
229
|
+
|
|
230
|
+
# Create a test set with correctly-labeled male and female names
|
|
231
|
+
test = [(name, True) for name in male_names[2500:2750]] \
|
|
232
|
+
+ [(name, False) for name in female_names[500:750]]
|
|
233
|
+
|
|
234
|
+
random.shuffle(test)
|
|
235
|
+
|
|
236
|
+
# Train up a classifier.
|
|
237
|
+
print('Training classifier...')
|
|
238
|
+
classifier = trainer(positive, unlabeled)
|
|
239
|
+
|
|
240
|
+
# Run the classifier on the test data.
|
|
241
|
+
print('Testing classifier...')
|
|
242
|
+
acc = accuracy(classifier, [(features(n), m) for (n, m) in test])
|
|
243
|
+
print('Accuracy: %6.4f' % acc)
|
|
244
|
+
|
|
245
|
+
# For classifiers that can find probabilities, show the log
|
|
246
|
+
# likelihood and some sample probability distributions.
|
|
247
|
+
try:
|
|
248
|
+
test_featuresets = [features(n) for (n, m) in test]
|
|
249
|
+
pdists = classifier.prob_classify_many(test_featuresets)
|
|
250
|
+
ll = [pdist.logprob(gold)
|
|
251
|
+
for ((name, gold), pdist) in zip(test, pdists)]
|
|
252
|
+
print('Avg. log likelihood: %6.4f' % (sum(ll) / len(test)))
|
|
253
|
+
print()
|
|
254
|
+
print('Unseen Names P(Male) P(Female)\n'+'-'*40)
|
|
255
|
+
for ((name, is_male), pdist) in zip(test, pdists)[:5]:
|
|
256
|
+
if is_male == True:
|
|
257
|
+
fmt = ' %-15s *%6.4f %6.4f'
|
|
258
|
+
else:
|
|
259
|
+
fmt = ' %-15s %6.4f *%6.4f'
|
|
260
|
+
print(fmt % (name, pdist.prob(True), pdist.prob(False)))
|
|
261
|
+
except NotImplementedError:
|
|
262
|
+
pass
|
|
263
|
+
|
|
264
|
+
# Return the classifier
|
|
265
|
+
return classifier
|
|
266
|
+
|
|
267
|
+
_inst_cache = {}
|
|
268
|
+
def wsd_demo(trainer, word, features, n=1000):
|
|
269
|
+
from nltk.corpus import senseval
|
|
270
|
+
import random
|
|
271
|
+
|
|
272
|
+
# Get the instances.
|
|
273
|
+
print('Reading data...')
|
|
274
|
+
global _inst_cache
|
|
275
|
+
if word not in _inst_cache:
|
|
276
|
+
_inst_cache[word] = [(i, i.senses[0]) for i in senseval.instances(word)]
|
|
277
|
+
instances = _inst_cache[word][:]
|
|
278
|
+
if n > len(instances):
|
|
279
|
+
n = len(instances)
|
|
280
|
+
senses = list(set(l for (i, l) in instances))
|
|
281
|
+
print(' Senses: ' + ' '.join(senses))
|
|
282
|
+
|
|
283
|
+
# Randomly split the names into a test & train set.
|
|
284
|
+
print('Splitting into test & train...')
|
|
285
|
+
random.seed(123456)
|
|
286
|
+
random.shuffle(instances)
|
|
287
|
+
train = instances[:int(.8*n)]
|
|
288
|
+
test = instances[int(.8*n):n]
|
|
289
|
+
|
|
290
|
+
# Train up a classifier.
|
|
291
|
+
print('Training classifier...')
|
|
292
|
+
classifier = trainer([(features(i), l) for (i, l) in train])
|
|
293
|
+
|
|
294
|
+
# Run the classifier on the test data.
|
|
295
|
+
print('Testing classifier...')
|
|
296
|
+
acc = accuracy(classifier, [(features(i), l) for (i, l) in test])
|
|
297
|
+
print('Accuracy: %6.4f' % acc)
|
|
298
|
+
|
|
299
|
+
# For classifiers that can find probabilities, show the log
|
|
300
|
+
# likelihood and some sample probability distributions.
|
|
301
|
+
try:
|
|
302
|
+
test_featuresets = [features(i) for (i, n) in test]
|
|
303
|
+
pdists = classifier.prob_classify_many(test_featuresets)
|
|
304
|
+
ll = [pdist.logprob(gold)
|
|
305
|
+
for ((name, gold), pdist) in zip(test, pdists)]
|
|
306
|
+
print('Avg. log likelihood: %6.4f' % (sum(ll) / len(test)))
|
|
307
|
+
except NotImplementedError:
|
|
308
|
+
pass
|
|
309
|
+
|
|
310
|
+
# Return the classifier
|
|
311
|
+
return classifier
|
|
312
|
+
|
|
313
|
+
|
|
314
|
+
|
|
315
|
+
def check_megam_config(self):
|
|
316
|
+
"""
|
|
317
|
+
Checks whether the MEGAM binary is configured.
|
|
318
|
+
"""
|
|
319
|
+
try:
|
|
320
|
+
_megam_bin
|
|
321
|
+
except NameError:
|
|
322
|
+
err_msg = str("Please configure your megam binary first, e.g.\n"
|
|
323
|
+
">>> nltk.config_megam('/usr/bin/local/megam')")
|
|
324
|
+
raise NameError(err_msg)
|