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,426 +1,424 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
# Natural Language Toolkit: Transformation-based learning
|
|
3
|
-
#
|
|
4
|
-
# Copyright (C) 2001-
|
|
5
|
-
# Author: Marcus Uneson <marcus.uneson@gmail.com>
|
|
6
|
-
# based on previous (nltk2) version by
|
|
7
|
-
# Christopher Maloof, Edward Loper, Steven Bird
|
|
8
|
-
# URL: <http://nltk.org/>
|
|
9
|
-
# For license information, see LICENSE.TXT
|
|
10
|
-
|
|
11
|
-
from __future__ import print_function, division
|
|
12
|
-
|
|
13
|
-
from collections import defaultdict
|
|
14
|
-
|
|
15
|
-
from nltk.
|
|
16
|
-
from nltk.
|
|
17
|
-
from nltk
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
Template(Pos([
|
|
59
|
-
Template(Pos([
|
|
60
|
-
Template(Pos([
|
|
61
|
-
Template(Pos([2])),
|
|
62
|
-
Template(Pos([
|
|
63
|
-
Template(Pos([
|
|
64
|
-
Template(Pos([
|
|
65
|
-
Template(Pos([1,
|
|
66
|
-
Template(
|
|
67
|
-
Template(Word([
|
|
68
|
-
Template(Word([
|
|
69
|
-
Template(Word([
|
|
70
|
-
Template(Word([2])),
|
|
71
|
-
Template(Word([
|
|
72
|
-
Template(Word([
|
|
73
|
-
Template(Word([
|
|
74
|
-
Template(Word([1,
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
Template(
|
|
86
|
-
Template(
|
|
87
|
-
Template(
|
|
88
|
-
Template(Pos([-1]), Word([0]),
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
Template(Word([
|
|
102
|
-
Template(Word([
|
|
103
|
-
Template(Word([0]), Word([
|
|
104
|
-
Template(Word([0]), Word([
|
|
105
|
-
Template(Word([0]), Word([2])),
|
|
106
|
-
Template(Word([
|
|
107
|
-
Template(Word([
|
|
108
|
-
Template(Word([
|
|
109
|
-
Template(Word([
|
|
110
|
-
Template(Word([
|
|
111
|
-
Template(Word([0]), Pos([2])),
|
|
112
|
-
Template(Word([0]), Pos([
|
|
113
|
-
Template(Word([0]), Pos([1])),
|
|
114
|
-
Template(Word([0])
|
|
115
|
-
Template(Word([
|
|
116
|
-
Template(Word([
|
|
117
|
-
Template(Word([
|
|
118
|
-
Template(Word([1])),
|
|
119
|
-
Template(
|
|
120
|
-
Template(Pos([
|
|
121
|
-
Template(Pos([1]), Pos([2])),
|
|
122
|
-
Template(Pos([
|
|
123
|
-
Template(Pos([1])),
|
|
124
|
-
Template(Pos([-
|
|
125
|
-
Template(Pos([
|
|
126
|
-
Template(Pos([2])),
|
|
127
|
-
Template(Pos([1, 2
|
|
128
|
-
Template(Pos([
|
|
129
|
-
Template(Pos([-
|
|
130
|
-
Template(Pos([
|
|
131
|
-
Template(Pos([1]), Word([0]), Word([1])),
|
|
132
|
-
Template(Pos([1]), Word([
|
|
133
|
-
Template(Pos([-1]), Word([
|
|
134
|
-
Template(Pos([-
|
|
135
|
-
Template(Pos([
|
|
136
|
-
Template(Pos([1]), Pos([2]))
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
Template(Pos([
|
|
147
|
-
Template(Pos([
|
|
148
|
-
Template(Pos([
|
|
149
|
-
Template(Pos([2])),
|
|
150
|
-
Template(Pos([
|
|
151
|
-
Template(Pos([
|
|
152
|
-
Template(Pos([
|
|
153
|
-
Template(Pos([1,
|
|
154
|
-
Template(Pos([-
|
|
155
|
-
Template(Pos([
|
|
156
|
-
Template(
|
|
157
|
-
Template(Word([
|
|
158
|
-
Template(Word([
|
|
159
|
-
Template(Word([
|
|
160
|
-
Template(Word([2])),
|
|
161
|
-
Template(Word([
|
|
162
|
-
Template(Word([1,
|
|
163
|
-
Template(Word([
|
|
164
|
-
Template(Word([0
|
|
165
|
-
Template(Word([
|
|
166
|
-
Template(Word([
|
|
167
|
-
Template(Word([1]), Pos([1])),
|
|
168
|
-
Template(Word([0]), Word([
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
"
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
import
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
:
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
self.
|
|
225
|
-
self.
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
_initial_tagger, _rules, _training_stats
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
:
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
:
|
|
251
|
-
:
|
|
252
|
-
:
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
#
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
#
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
#
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
tag_to_positions[rule.
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
:
|
|
299
|
-
:
|
|
300
|
-
:
|
|
301
|
-
:
|
|
302
|
-
:
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
trainscores
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
#
|
|
318
|
-
#
|
|
319
|
-
#
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
len(
|
|
327
|
-
|
|
328
|
-
)
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
head
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
trainscore,
|
|
338
|
-
|
|
339
|
-
template_counts[tid],
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
)
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
len(
|
|
349
|
-
|
|
350
|
-
)
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
head
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
testscore,
|
|
366
|
-
|
|
367
|
-
weighted_traincounts[tid],
|
|
368
|
-
|
|
369
|
-
template_counts[tid],
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
)
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
for (tid, tpl) in unused:
|
|
380
|
-
print("{0:03d} {1:s}".format(tid, tpl))
|
|
381
|
-
|
|
382
|
-
if test_stats is None:
|
|
383
|
-
print_train_stats()
|
|
384
|
-
else:
|
|
385
|
-
print_testtrain_stats()
|
|
386
|
-
print()
|
|
387
|
-
if printunused:
|
|
388
|
-
print_unused_templates()
|
|
389
|
-
print()
|
|
390
|
-
|
|
391
|
-
def batch_tag_incremental(self, sequences, gold):
|
|
392
|
-
"""
|
|
393
|
-
Tags by applying each rule to the entire corpus (rather than all rules to a
|
|
394
|
-
single sequence). The point is to collect statistics on the test set for
|
|
395
|
-
individual rules.
|
|
396
|
-
|
|
397
|
-
NOTE: This is inefficient (does not build any index, so will traverse the entire
|
|
398
|
-
corpus N times for N rules) -- usually you would not care about statistics for
|
|
399
|
-
individual rules and thus use batch_tag() instead
|
|
400
|
-
|
|
401
|
-
:param sequences: lists of token sequences (sentences, in some applications) to be tagged
|
|
402
|
-
:type sequences: list of list of strings
|
|
403
|
-
:param gold: the gold standard
|
|
404
|
-
:type gold: list of list of strings
|
|
405
|
-
:returns: tuple of (tagged_sequences, ordered list of rule scores (one for each rule))
|
|
406
|
-
"""
|
|
407
|
-
def counterrors(xs):
|
|
408
|
-
return sum(t[1] != g[1] for pair in zip(xs, gold) for (t, g) in zip(*pair))
|
|
409
|
-
testing_stats = {}
|
|
410
|
-
testing_stats['tokencount'] = sum(len(t) for t in sequences)
|
|
411
|
-
testing_stats['sequencecount'] = len(sequences)
|
|
412
|
-
tagged_tokenses = [self._initial_tagger.tag(tokens) for tokens in sequences]
|
|
413
|
-
testing_stats['initialerrors'] = counterrors(tagged_tokenses)
|
|
414
|
-
testing_stats['initialacc'] = 1 - testing_stats['initialerrors']/testing_stats['tokencount']
|
|
415
|
-
# Apply each rule to the entire corpus, in order
|
|
416
|
-
errors = [testing_stats['initialerrors']]
|
|
417
|
-
for rule in self._rules:
|
|
418
|
-
for tagged_tokens in tagged_tokenses:
|
|
419
|
-
rule.apply(tagged_tokens)
|
|
420
|
-
errors.append(counterrors(tagged_tokenses))
|
|
421
|
-
testing_stats['rulescores'] = [err0 - err1 for (err0, err1) in zip(errors, errors[1:])]
|
|
422
|
-
testing_stats['finalerrors'] = errors[-1]
|
|
423
|
-
testing_stats['finalacc'] = 1 - testing_stats['finalerrors']/testing_stats['tokencount']
|
|
424
|
-
return (tagged_tokenses, testing_stats)
|
|
425
|
-
|
|
426
|
-
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Natural Language Toolkit: Transformation-based learning
|
|
3
|
+
#
|
|
4
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
5
|
+
# Author: Marcus Uneson <marcus.uneson@gmail.com>
|
|
6
|
+
# based on previous (nltk2) version by
|
|
7
|
+
# Christopher Maloof, Edward Loper, Steven Bird
|
|
8
|
+
# URL: <http://nltk.org/>
|
|
9
|
+
# For license information, see LICENSE.TXT
|
|
10
|
+
|
|
11
|
+
from __future__ import print_function, division
|
|
12
|
+
|
|
13
|
+
from collections import defaultdict, Counter
|
|
14
|
+
|
|
15
|
+
from nltk.tag import TaggerI
|
|
16
|
+
from nltk.tbl import Feature, Template
|
|
17
|
+
from nltk import jsontags
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
######################################################################
|
|
21
|
+
# Brill Templates
|
|
22
|
+
######################################################################
|
|
23
|
+
|
|
24
|
+
@jsontags.register_tag
|
|
25
|
+
class Word(Feature):
|
|
26
|
+
"""
|
|
27
|
+
Feature which examines the text (word) of nearby tokens.
|
|
28
|
+
"""
|
|
29
|
+
|
|
30
|
+
json_tag = 'nltk.tag.brill.Word'
|
|
31
|
+
|
|
32
|
+
@staticmethod
|
|
33
|
+
def extract_property(tokens, index):
|
|
34
|
+
"""@return: The given token's text."""
|
|
35
|
+
return tokens[index][0]
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@jsontags.register_tag
|
|
39
|
+
class Pos(Feature):
|
|
40
|
+
"""
|
|
41
|
+
Feature which examines the tags of nearby tokens.
|
|
42
|
+
"""
|
|
43
|
+
|
|
44
|
+
json_tag = 'nltk.tag.brill.Pos'
|
|
45
|
+
|
|
46
|
+
@staticmethod
|
|
47
|
+
def extract_property(tokens, index):
|
|
48
|
+
"""@return: The given token's tag."""
|
|
49
|
+
return tokens[index][1]
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def nltkdemo18():
|
|
53
|
+
"""
|
|
54
|
+
Return 18 templates, from the original nltk demo, in multi-feature syntax
|
|
55
|
+
"""
|
|
56
|
+
return [
|
|
57
|
+
Template(Pos([-1])),
|
|
58
|
+
Template(Pos([1])),
|
|
59
|
+
Template(Pos([-2])),
|
|
60
|
+
Template(Pos([2])),
|
|
61
|
+
Template(Pos([-2, -1])),
|
|
62
|
+
Template(Pos([1, 2])),
|
|
63
|
+
Template(Pos([-3, -2, -1])),
|
|
64
|
+
Template(Pos([1, 2, 3])),
|
|
65
|
+
Template(Pos([-1]), Pos([1])),
|
|
66
|
+
Template(Word([-1])),
|
|
67
|
+
Template(Word([1])),
|
|
68
|
+
Template(Word([-2])),
|
|
69
|
+
Template(Word([2])),
|
|
70
|
+
Template(Word([-2, -1])),
|
|
71
|
+
Template(Word([1, 2])),
|
|
72
|
+
Template(Word([-3, -2, -1])),
|
|
73
|
+
Template(Word([1, 2, 3])),
|
|
74
|
+
Template(Word([-1]), Word([1])),
|
|
75
|
+
]
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def nltkdemo18plus():
|
|
79
|
+
"""
|
|
80
|
+
Return 18 templates, from the original nltk demo, and additionally a few
|
|
81
|
+
multi-feature ones (the motivation is easy comparison with nltkdemo18)
|
|
82
|
+
"""
|
|
83
|
+
return nltkdemo18() + [
|
|
84
|
+
Template(Word([-1]), Pos([1])),
|
|
85
|
+
Template(Pos([-1]), Word([1])),
|
|
86
|
+
Template(Word([-1]), Word([0]), Pos([1])),
|
|
87
|
+
Template(Pos([-1]), Word([0]), Word([1])),
|
|
88
|
+
Template(Pos([-1]), Word([0]), Pos([1])),
|
|
89
|
+
]
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def fntbl37():
|
|
93
|
+
"""
|
|
94
|
+
Return 37 templates taken from the postagging task of the
|
|
95
|
+
fntbl distribution http://www.cs.jhu.edu/~rflorian/fntbl/
|
|
96
|
+
(37 is after excluding a handful which do not condition on Pos[0];
|
|
97
|
+
fntbl can do that but the current nltk implementation cannot.)
|
|
98
|
+
"""
|
|
99
|
+
return [
|
|
100
|
+
Template(Word([0]), Word([1]), Word([2])),
|
|
101
|
+
Template(Word([-1]), Word([0]), Word([1])),
|
|
102
|
+
Template(Word([0]), Word([-1])),
|
|
103
|
+
Template(Word([0]), Word([1])),
|
|
104
|
+
Template(Word([0]), Word([2])),
|
|
105
|
+
Template(Word([0]), Word([-2])),
|
|
106
|
+
Template(Word([1, 2])),
|
|
107
|
+
Template(Word([-2, -1])),
|
|
108
|
+
Template(Word([1, 2, 3])),
|
|
109
|
+
Template(Word([-3, -2, -1])),
|
|
110
|
+
Template(Word([0]), Pos([2])),
|
|
111
|
+
Template(Word([0]), Pos([-2])),
|
|
112
|
+
Template(Word([0]), Pos([1])),
|
|
113
|
+
Template(Word([0]), Pos([-1])),
|
|
114
|
+
Template(Word([0])),
|
|
115
|
+
Template(Word([-2])),
|
|
116
|
+
Template(Word([2])),
|
|
117
|
+
Template(Word([1])),
|
|
118
|
+
Template(Word([-1])),
|
|
119
|
+
Template(Pos([-1]), Pos([1])),
|
|
120
|
+
Template(Pos([1]), Pos([2])),
|
|
121
|
+
Template(Pos([-1]), Pos([-2])),
|
|
122
|
+
Template(Pos([1])),
|
|
123
|
+
Template(Pos([-1])),
|
|
124
|
+
Template(Pos([-2])),
|
|
125
|
+
Template(Pos([2])),
|
|
126
|
+
Template(Pos([1, 2, 3])),
|
|
127
|
+
Template(Pos([1, 2])),
|
|
128
|
+
Template(Pos([-3, -2, -1])),
|
|
129
|
+
Template(Pos([-2, -1])),
|
|
130
|
+
Template(Pos([1]), Word([0]), Word([1])),
|
|
131
|
+
Template(Pos([1]), Word([0]), Word([-1])),
|
|
132
|
+
Template(Pos([-1]), Word([-1]), Word([0])),
|
|
133
|
+
Template(Pos([-1]), Word([0]), Word([1])),
|
|
134
|
+
Template(Pos([-2]), Pos([-1])),
|
|
135
|
+
Template(Pos([1]), Pos([2])),
|
|
136
|
+
Template(Pos([1]), Pos([2]), Word([1]))
|
|
137
|
+
]
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
def brill24():
|
|
141
|
+
"""
|
|
142
|
+
Return 24 templates of the seminal TBL paper, Brill (1995)
|
|
143
|
+
"""
|
|
144
|
+
return [
|
|
145
|
+
Template(Pos([-1])),
|
|
146
|
+
Template(Pos([1])),
|
|
147
|
+
Template(Pos([-2])),
|
|
148
|
+
Template(Pos([2])),
|
|
149
|
+
Template(Pos([-2, -1])),
|
|
150
|
+
Template(Pos([1, 2])),
|
|
151
|
+
Template(Pos([-3, -2, -1])),
|
|
152
|
+
Template(Pos([1, 2, 3])),
|
|
153
|
+
Template(Pos([-1]), Pos([1])),
|
|
154
|
+
Template(Pos([-2]), Pos([-1])),
|
|
155
|
+
Template(Pos([1]), Pos([2])),
|
|
156
|
+
Template(Word([-1])),
|
|
157
|
+
Template(Word([1])),
|
|
158
|
+
Template(Word([-2])),
|
|
159
|
+
Template(Word([2])),
|
|
160
|
+
Template(Word([-2, -1])),
|
|
161
|
+
Template(Word([1, 2])),
|
|
162
|
+
Template(Word([-1, 0])),
|
|
163
|
+
Template(Word([0, 1])),
|
|
164
|
+
Template(Word([0])),
|
|
165
|
+
Template(Word([-1]), Pos([-1])),
|
|
166
|
+
Template(Word([1]), Pos([1])),
|
|
167
|
+
Template(Word([0]), Word([-1]), Pos([-1])),
|
|
168
|
+
Template(Word([0]), Word([1]), Pos([1])),
|
|
169
|
+
]
|
|
170
|
+
|
|
171
|
+
|
|
172
|
+
def describe_template_sets():
|
|
173
|
+
"""
|
|
174
|
+
Print the available template sets in this demo, with a short description"
|
|
175
|
+
"""
|
|
176
|
+
import inspect
|
|
177
|
+
import sys
|
|
178
|
+
|
|
179
|
+
# a bit of magic to get all functions in this module
|
|
180
|
+
templatesets = inspect.getmembers(sys.modules[__name__], inspect.isfunction)
|
|
181
|
+
for (name, obj) in templatesets:
|
|
182
|
+
if name == "describe_template_sets":
|
|
183
|
+
continue
|
|
184
|
+
print(name, obj.__doc__, "\n")
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
######################################################################
|
|
188
|
+
# The Brill Tagger
|
|
189
|
+
######################################################################
|
|
190
|
+
|
|
191
|
+
@jsontags.register_tag
|
|
192
|
+
class BrillTagger(TaggerI):
|
|
193
|
+
"""
|
|
194
|
+
Brill's transformational rule-based tagger. Brill taggers use an
|
|
195
|
+
initial tagger (such as ``tag.DefaultTagger``) to assign an initial
|
|
196
|
+
tag sequence to a text; and then apply an ordered list of
|
|
197
|
+
transformational rules to correct the tags of individual tokens.
|
|
198
|
+
These transformation rules are specified by the ``TagRule``
|
|
199
|
+
interface.
|
|
200
|
+
|
|
201
|
+
Brill taggers can be created directly, from an initial tagger and
|
|
202
|
+
a list of transformational rules; but more often, Brill taggers
|
|
203
|
+
are created by learning rules from a training corpus, using one
|
|
204
|
+
of the TaggerTrainers available.
|
|
205
|
+
"""
|
|
206
|
+
|
|
207
|
+
json_tag = 'nltk.tag.BrillTagger'
|
|
208
|
+
|
|
209
|
+
def __init__(self, initial_tagger, rules, training_stats=None):
|
|
210
|
+
"""
|
|
211
|
+
:param initial_tagger: The initial tagger
|
|
212
|
+
:type initial_tagger: TaggerI
|
|
213
|
+
|
|
214
|
+
:param rules: An ordered list of transformation rules that
|
|
215
|
+
should be used to correct the initial tagging.
|
|
216
|
+
:type rules: list(TagRule)
|
|
217
|
+
|
|
218
|
+
:param training_stats: A dictionary of statistics collected
|
|
219
|
+
during training, for possible later use
|
|
220
|
+
:type training_stats: dict
|
|
221
|
+
|
|
222
|
+
"""
|
|
223
|
+
self._initial_tagger = initial_tagger
|
|
224
|
+
self._rules = tuple(rules)
|
|
225
|
+
self._training_stats = training_stats
|
|
226
|
+
|
|
227
|
+
def encode_json_obj(self):
|
|
228
|
+
return self._initial_tagger, self._rules, self._training_stats
|
|
229
|
+
|
|
230
|
+
@classmethod
|
|
231
|
+
def decode_json_obj(cls, obj):
|
|
232
|
+
_initial_tagger, _rules, _training_stats = obj
|
|
233
|
+
return cls(_initial_tagger, _rules, _training_stats)
|
|
234
|
+
|
|
235
|
+
def rules(self):
|
|
236
|
+
"""
|
|
237
|
+
Return the ordered list of transformation rules that this tagger has learnt
|
|
238
|
+
|
|
239
|
+
:return: the ordered list of transformation rules that correct the initial tagging
|
|
240
|
+
:rtype: list of Rules
|
|
241
|
+
"""
|
|
242
|
+
return self._rules
|
|
243
|
+
|
|
244
|
+
def train_stats(self, statistic=None):
|
|
245
|
+
"""
|
|
246
|
+
Return a named statistic collected during training, or a dictionary of all
|
|
247
|
+
available statistics if no name given
|
|
248
|
+
|
|
249
|
+
:param statistic: name of statistic
|
|
250
|
+
:type statistic: str
|
|
251
|
+
:return: some statistic collected during training of this tagger
|
|
252
|
+
:rtype: any (but usually a number)
|
|
253
|
+
"""
|
|
254
|
+
if statistic is None:
|
|
255
|
+
return self._training_stats
|
|
256
|
+
else:
|
|
257
|
+
return self._training_stats.get(statistic)
|
|
258
|
+
|
|
259
|
+
def tag(self, tokens):
|
|
260
|
+
# Inherit documentation from TaggerI
|
|
261
|
+
|
|
262
|
+
# Run the initial tagger.
|
|
263
|
+
tagged_tokens = self._initial_tagger.tag(tokens)
|
|
264
|
+
|
|
265
|
+
# Create a dictionary that maps each tag to a list of the
|
|
266
|
+
# indices of tokens that have that tag.
|
|
267
|
+
tag_to_positions = defaultdict(set)
|
|
268
|
+
for i, (token, tag) in enumerate(tagged_tokens):
|
|
269
|
+
tag_to_positions[tag].add(i)
|
|
270
|
+
|
|
271
|
+
# Apply each rule, in order. Only try to apply rules at
|
|
272
|
+
# positions that have the desired original tag.
|
|
273
|
+
for rule in self._rules:
|
|
274
|
+
# Find the positions where it might apply
|
|
275
|
+
positions = tag_to_positions.get(rule.original_tag, [])
|
|
276
|
+
# Apply the rule at those positions.
|
|
277
|
+
changed = rule.apply(tagged_tokens, positions)
|
|
278
|
+
# Update tag_to_positions with the positions of tags that
|
|
279
|
+
# were modified.
|
|
280
|
+
for i in changed:
|
|
281
|
+
tag_to_positions[rule.original_tag].remove(i)
|
|
282
|
+
tag_to_positions[rule.replacement_tag].add(i)
|
|
283
|
+
|
|
284
|
+
return tagged_tokens
|
|
285
|
+
|
|
286
|
+
def print_template_statistics(self, test_stats=None, printunused=True):
|
|
287
|
+
"""
|
|
288
|
+
Print a list of all templates, ranked according to efficiency.
|
|
289
|
+
|
|
290
|
+
If test_stats is available, the templates are ranked according to their
|
|
291
|
+
relative contribution (summed for all rules created from a given template,
|
|
292
|
+
weighted by score) to the performance on the test set. If no test_stats, then
|
|
293
|
+
statistics collected during training are used instead. There is also
|
|
294
|
+
an unweighted measure (just counting the rules). This is less informative,
|
|
295
|
+
though, as many low-score rules will appear towards end of training.
|
|
296
|
+
|
|
297
|
+
:param test_stats: dictionary of statistics collected during testing
|
|
298
|
+
:type test_stats: dict of str -> any (but usually numbers)
|
|
299
|
+
:param printunused: if True, print a list of all unused templates
|
|
300
|
+
:type printunused: bool
|
|
301
|
+
:return: None
|
|
302
|
+
:rtype: None
|
|
303
|
+
"""
|
|
304
|
+
tids = [r.templateid for r in self._rules]
|
|
305
|
+
train_stats = self.train_stats()
|
|
306
|
+
|
|
307
|
+
trainscores = train_stats['rulescores']
|
|
308
|
+
assert len(trainscores) == len(tids), "corrupt statistics: " \
|
|
309
|
+
"{0} train scores for {1} rules".format(trainscores, tids)
|
|
310
|
+
template_counts = Counter(tids)
|
|
311
|
+
weighted_traincounts = Counter()
|
|
312
|
+
for (tid, score) in zip(tids, trainscores):
|
|
313
|
+
weighted_traincounts[tid] += score
|
|
314
|
+
tottrainscores = sum(trainscores)
|
|
315
|
+
|
|
316
|
+
# det_tplsort() is for deterministic sorting;
|
|
317
|
+
# the otherwise convenient Counter.most_common() unfortunately
|
|
318
|
+
# does not break ties deterministically
|
|
319
|
+
# between python versions and will break cross-version tests
|
|
320
|
+
def det_tplsort(tpl_value):
|
|
321
|
+
return (tpl_value[1], repr(tpl_value[0]))
|
|
322
|
+
|
|
323
|
+
def print_train_stats():
|
|
324
|
+
print("TEMPLATE STATISTICS (TRAIN) {0} templates, {1} rules)".format(
|
|
325
|
+
len(template_counts),
|
|
326
|
+
len(tids))
|
|
327
|
+
)
|
|
328
|
+
print("TRAIN ({tokencount:7d} tokens) initial {initialerrors:5d} {initialacc:.4f} "
|
|
329
|
+
"final: {finalerrors:5d} {finalacc:.4f} ".format(**train_stats))
|
|
330
|
+
head = "#ID | Score (train) | #Rules | Template"
|
|
331
|
+
print(head, "\n", "-" * len(head), sep="")
|
|
332
|
+
train_tplscores = sorted(weighted_traincounts.items(), key=det_tplsort, reverse=True)
|
|
333
|
+
for (tid, trainscore) in train_tplscores:
|
|
334
|
+
s = "{0} | {1:5d} {2:5.3f} |{3:4d} {4:.3f} | {5}".format(
|
|
335
|
+
tid,
|
|
336
|
+
trainscore,
|
|
337
|
+
trainscore/tottrainscores,
|
|
338
|
+
template_counts[tid],
|
|
339
|
+
template_counts[tid]/len(tids),
|
|
340
|
+
Template.ALLTEMPLATES[int(tid)],
|
|
341
|
+
)
|
|
342
|
+
print(s)
|
|
343
|
+
|
|
344
|
+
def print_testtrain_stats():
|
|
345
|
+
testscores = test_stats['rulescores']
|
|
346
|
+
print("TEMPLATE STATISTICS (TEST AND TRAIN) ({0} templates, {1} rules)".format(
|
|
347
|
+
len(template_counts),
|
|
348
|
+
len(tids)),
|
|
349
|
+
)
|
|
350
|
+
print("TEST ({tokencount:7d} tokens) initial {initialerrors:5d} {initialacc:.4f} "
|
|
351
|
+
"final: {finalerrors:5d} {finalacc:.4f} ".format(**test_stats))
|
|
352
|
+
print("TRAIN ({tokencount:7d} tokens) initial {initialerrors:5d} {initialacc:.4f} "
|
|
353
|
+
"final: {finalerrors:5d} {finalacc:.4f} ".format(**train_stats))
|
|
354
|
+
weighted_testcounts = Counter()
|
|
355
|
+
for (tid, score) in zip(tids, testscores):
|
|
356
|
+
weighted_testcounts[tid] += score
|
|
357
|
+
tottestscores = sum(testscores)
|
|
358
|
+
head = "#ID | Score (test) | Score (train) | #Rules | Template"
|
|
359
|
+
print(head, "\n", "-" * len(head), sep="")
|
|
360
|
+
test_tplscores = sorted(weighted_testcounts.items(), key=det_tplsort, reverse=True)
|
|
361
|
+
for (tid, testscore) in test_tplscores:
|
|
362
|
+
s = "{0:s} |{1:5d} {2:6.3f} | {3:4d} {4:.3f} |{5:4d} {6:.3f} | {7:s}".format(
|
|
363
|
+
tid,
|
|
364
|
+
testscore,
|
|
365
|
+
testscore/tottestscores,
|
|
366
|
+
weighted_traincounts[tid],
|
|
367
|
+
weighted_traincounts[tid]/tottrainscores,
|
|
368
|
+
template_counts[tid],
|
|
369
|
+
template_counts[tid]/len(tids),
|
|
370
|
+
Template.ALLTEMPLATES[int(tid)],
|
|
371
|
+
)
|
|
372
|
+
print(s)
|
|
373
|
+
|
|
374
|
+
def print_unused_templates():
|
|
375
|
+
usedtpls = set([int(tid) for tid in tids])
|
|
376
|
+
unused = [(tid, tpl) for (tid, tpl) in enumerate(Template.ALLTEMPLATES) if tid not in usedtpls]
|
|
377
|
+
print("UNUSED TEMPLATES ({0})".format(len(unused)))
|
|
378
|
+
|
|
379
|
+
for (tid, tpl) in unused:
|
|
380
|
+
print("{0:03d} {1:s}".format(tid, str(tpl)))
|
|
381
|
+
|
|
382
|
+
if test_stats is None:
|
|
383
|
+
print_train_stats()
|
|
384
|
+
else:
|
|
385
|
+
print_testtrain_stats()
|
|
386
|
+
print()
|
|
387
|
+
if printunused:
|
|
388
|
+
print_unused_templates()
|
|
389
|
+
print()
|
|
390
|
+
|
|
391
|
+
def batch_tag_incremental(self, sequences, gold):
|
|
392
|
+
"""
|
|
393
|
+
Tags by applying each rule to the entire corpus (rather than all rules to a
|
|
394
|
+
single sequence). The point is to collect statistics on the test set for
|
|
395
|
+
individual rules.
|
|
396
|
+
|
|
397
|
+
NOTE: This is inefficient (does not build any index, so will traverse the entire
|
|
398
|
+
corpus N times for N rules) -- usually you would not care about statistics for
|
|
399
|
+
individual rules and thus use batch_tag() instead
|
|
400
|
+
|
|
401
|
+
:param sequences: lists of token sequences (sentences, in some applications) to be tagged
|
|
402
|
+
:type sequences: list of list of strings
|
|
403
|
+
:param gold: the gold standard
|
|
404
|
+
:type gold: list of list of strings
|
|
405
|
+
:returns: tuple of (tagged_sequences, ordered list of rule scores (one for each rule))
|
|
406
|
+
"""
|
|
407
|
+
def counterrors(xs):
|
|
408
|
+
return sum(t[1] != g[1] for pair in zip(xs, gold) for (t, g) in zip(*pair))
|
|
409
|
+
testing_stats = {}
|
|
410
|
+
testing_stats['tokencount'] = sum(len(t) for t in sequences)
|
|
411
|
+
testing_stats['sequencecount'] = len(sequences)
|
|
412
|
+
tagged_tokenses = [self._initial_tagger.tag(tokens) for tokens in sequences]
|
|
413
|
+
testing_stats['initialerrors'] = counterrors(tagged_tokenses)
|
|
414
|
+
testing_stats['initialacc'] = 1 - testing_stats['initialerrors']/testing_stats['tokencount']
|
|
415
|
+
# Apply each rule to the entire corpus, in order
|
|
416
|
+
errors = [testing_stats['initialerrors']]
|
|
417
|
+
for rule in self._rules:
|
|
418
|
+
for tagged_tokens in tagged_tokenses:
|
|
419
|
+
rule.apply(tagged_tokens)
|
|
420
|
+
errors.append(counterrors(tagged_tokenses))
|
|
421
|
+
testing_stats['rulescores'] = [err0 - err1 for (err0, err1) in zip(errors, errors[1:])]
|
|
422
|
+
testing_stats['finalerrors'] = errors[-1]
|
|
423
|
+
testing_stats['finalacc'] = 1 - testing_stats['finalerrors']/testing_stats['tokencount']
|
|
424
|
+
return (tagged_tokenses, testing_stats)
|