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,242 +1,242 @@
|
|
|
1
|
-
.. Copyright (C) 2001-
|
|
2
|
-
.. For license information, see LICENSE.TXT
|
|
3
|
-
|
|
4
|
-
.. -*- coding: utf-8 -*-
|
|
5
|
-
|
|
6
|
-
=========
|
|
7
|
-
Alignment
|
|
8
|
-
=========
|
|
9
|
-
|
|
10
|
-
Corpus Reader
|
|
11
|
-
-------------
|
|
12
|
-
|
|
13
|
-
>>> from nltk.corpus import comtrans
|
|
14
|
-
>>> words = comtrans.words('alignment-en-fr.txt')
|
|
15
|
-
>>> for word in words[:6]:
|
|
16
|
-
... print(word)
|
|
17
|
-
Resumption
|
|
18
|
-
of
|
|
19
|
-
the
|
|
20
|
-
session
|
|
21
|
-
I
|
|
22
|
-
declare
|
|
23
|
-
>>> als = comtrans.aligned_sents('alignment-en-fr.txt')[0]
|
|
24
|
-
>>> als # doctest: +NORMALIZE_WHITESPACE
|
|
25
|
-
AlignedSent(['Resumption', 'of', 'the', 'session'],
|
|
26
|
-
['Reprise', 'de', 'la', 'session'],
|
|
27
|
-
Alignment([(0, 0), (1, 1), (2, 2), (3, 3)]))
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
Alignment Objects
|
|
31
|
-
-----------------
|
|
32
|
-
|
|
33
|
-
Aligned sentences are simply a mapping between words in a sentence:
|
|
34
|
-
|
|
35
|
-
>>> print(" ".join(als.words))
|
|
36
|
-
Resumption of the session
|
|
37
|
-
>>> print(" ".join(als.mots))
|
|
38
|
-
Reprise de la session
|
|
39
|
-
>>> als.alignment
|
|
40
|
-
Alignment([(0, 0), (1, 1), (2, 2), (3, 3)])
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
Usually we look at them from the perspective of a source to a target language,
|
|
44
|
-
but they are easily inverted:
|
|
45
|
-
|
|
46
|
-
>>> als.invert() # doctest: +NORMALIZE_WHITESPACE
|
|
47
|
-
AlignedSent(['Reprise', 'de', 'la', 'session'],
|
|
48
|
-
['Resumption', 'of', 'the', 'session'],
|
|
49
|
-
Alignment([(0, 0), (1, 1), (2, 2), (3, 3)]))
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
We can create new alignments, but these need to be in the correct range of
|
|
53
|
-
the corresponding sentences:
|
|
54
|
-
|
|
55
|
-
>>> from nltk.translate import Alignment, AlignedSent
|
|
56
|
-
>>> als = AlignedSent(['Reprise', 'de', 'la', 'session'],
|
|
57
|
-
... ['Resumption', 'of', 'the', 'session'],
|
|
58
|
-
... Alignment([(0, 0), (1, 4), (2, 1), (3, 3)]))
|
|
59
|
-
Traceback (most recent call last):
|
|
60
|
-
...
|
|
61
|
-
IndexError: Alignment is outside boundary of mots
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
You can set alignments with any sequence of tuples, so long as the first two
|
|
65
|
-
indexes of the tuple are the alignment indices:
|
|
66
|
-
|
|
67
|
-
>>> als.alignment = Alignment([(0, 0), (1, 1), (2, 2, "boat"), (3, 3, False, (1,2))])
|
|
68
|
-
|
|
69
|
-
>>> Alignment([(0, 0), (1, 1), (2, 2, "boat"), (3, 3, False, (1,2))])
|
|
70
|
-
Alignment([(0, 0), (1, 1), (2, 2, 'boat'), (3, 3, False, (1, 2))])
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
Alignment Algorithms
|
|
74
|
-
--------------------
|
|
75
|
-
|
|
76
|
-
EM for IBM Model 1
|
|
77
|
-
~~~~~~~~~~~~~~~~~~
|
|
78
|
-
|
|
79
|
-
Here is an example from Koehn, 2010:
|
|
80
|
-
|
|
81
|
-
>>> from nltk.translate import IBMModel1
|
|
82
|
-
>>> corpus = [AlignedSent(['the', 'house'], ['das', 'Haus']),
|
|
83
|
-
... AlignedSent(['the', 'book'], ['das', 'Buch']),
|
|
84
|
-
... AlignedSent(['a', 'book'], ['ein', 'Buch'])]
|
|
85
|
-
>>> em_ibm1 = IBMModel1(corpus, 20)
|
|
86
|
-
>>> print(round(em_ibm1.translation_table['the']['das'], 1))
|
|
87
|
-
1.0
|
|
88
|
-
>>> print(round(em_ibm1.translation_table['book']['das'], 1))
|
|
89
|
-
0.0
|
|
90
|
-
>>> print(round(em_ibm1.translation_table['house']['das'], 1))
|
|
91
|
-
0.0
|
|
92
|
-
>>> print(round(em_ibm1.translation_table['the']['Buch'], 1))
|
|
93
|
-
0.0
|
|
94
|
-
>>> print(round(em_ibm1.translation_table['book']['Buch'], 1))
|
|
95
|
-
1.0
|
|
96
|
-
>>> print(round(em_ibm1.translation_table['a']['Buch'], 1))
|
|
97
|
-
0.0
|
|
98
|
-
>>> print(round(em_ibm1.translation_table['book']['ein'], 1))
|
|
99
|
-
0.0
|
|
100
|
-
>>> print(round(em_ibm1.translation_table['a']['ein'], 1))
|
|
101
|
-
1.0
|
|
102
|
-
>>> print(round(em_ibm1.translation_table['the']['Haus'], 1))
|
|
103
|
-
0.0
|
|
104
|
-
>>> print(round(em_ibm1.translation_table['house']['Haus'], 1))
|
|
105
|
-
1.0
|
|
106
|
-
>>> print(round(em_ibm1.translation_table['book'][None], 1))
|
|
107
|
-
0.5
|
|
108
|
-
|
|
109
|
-
And using an NLTK corpus. We train on only 10 sentences, since it is so slow:
|
|
110
|
-
|
|
111
|
-
>>> from nltk.corpus import comtrans
|
|
112
|
-
>>> com_ibm1 = IBMModel1(comtrans.aligned_sents()[:10], 20)
|
|
113
|
-
>>> print(round(com_ibm1.translation_table['bitte']['Please'], 1))
|
|
114
|
-
0.2
|
|
115
|
-
>>> print(round(com_ibm1.translation_table['Sitzungsperiode']['session'], 1))
|
|
116
|
-
1.0
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
Evaluation
|
|
120
|
-
----------
|
|
121
|
-
The evaluation metrics for alignments are usually not interested in the
|
|
122
|
-
contents of alignments but more often the comparison to a "gold standard"
|
|
123
|
-
alignment that has been been constructed by human experts. For this reason we
|
|
124
|
-
often want to work just with raw set operations against the alignment points.
|
|
125
|
-
This then gives us a very clean form for defining our evaluation metrics.
|
|
126
|
-
|
|
127
|
-
.. Note::
|
|
128
|
-
The AlignedSent class has no distinction of "possible" or "sure"
|
|
129
|
-
alignments. Thus all alignments are treated as "sure".
|
|
130
|
-
|
|
131
|
-
Consider the following aligned sentence for evaluation:
|
|
132
|
-
|
|
133
|
-
>>> my_als = AlignedSent(['Resumption', 'of', 'the', 'session'],
|
|
134
|
-
... ['Reprise', 'de', 'la', 'session'],
|
|
135
|
-
... Alignment([(0, 0), (3, 3), (1, 2), (1, 1), (1, 3)]))
|
|
136
|
-
|
|
137
|
-
Precision
|
|
138
|
-
~~~~~~~~~
|
|
139
|
-
``precision = |A∩P| / |A|``
|
|
140
|
-
|
|
141
|
-
**Precision** is probably the most well known evaluation metric and it is implemented
|
|
142
|
-
in `nltk.metrics.scores.precision`_. Since precision is simply interested in the
|
|
143
|
-
proportion of correct alignments, we calculate the ratio of the number of our
|
|
144
|
-
test alignments (*A*) that match a possible alignment (*P*), over the number of
|
|
145
|
-
test alignments provided. There is no penalty for missing a possible alignment
|
|
146
|
-
in our test alignments. An easy way to game this metric is to provide just one
|
|
147
|
-
test alignment that is in *P* [OCH2000]_.
|
|
148
|
-
|
|
149
|
-
Here are some examples:
|
|
150
|
-
|
|
151
|
-
>>> from nltk.metrics import precision
|
|
152
|
-
>>> als.alignment = Alignment([(0,0), (1,1), (2,2), (3,3)])
|
|
153
|
-
>>> precision(Alignment([]), als.alignment)
|
|
154
|
-
0.0
|
|
155
|
-
>>> precision(Alignment([(0,0), (1,1), (2,2), (3,3)]), als.alignment)
|
|
156
|
-
1.0
|
|
157
|
-
>>> precision(Alignment([(0,0), (3,3)]), als.alignment)
|
|
158
|
-
0.5
|
|
159
|
-
>>> precision(Alignment.fromstring('0-0 3-3'), als.alignment)
|
|
160
|
-
0.5
|
|
161
|
-
>>> precision(Alignment([(0,0), (1,1), (2,2), (3,3), (1,2), (2,1)]), als.alignment)
|
|
162
|
-
1.0
|
|
163
|
-
>>> precision(als.alignment, my_als.alignment)
|
|
164
|
-
0.6
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
.. _nltk.metrics.scores.precision:
|
|
168
|
-
http://www.nltk.org/api/nltk.metrics.html#nltk.metrics.scores.precision
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
Recall
|
|
172
|
-
~~~~~~
|
|
173
|
-
``recall = |A∩S| / |S|``
|
|
174
|
-
|
|
175
|
-
**Recall** is another well known evaluation metric that has a set based
|
|
176
|
-
implementation in NLTK as `nltk.metrics.scores.recall`_. Since recall is
|
|
177
|
-
simply interested in the proportion of found alignments, we calculate the
|
|
178
|
-
ratio of the number of our test alignments (*A*) that match a sure alignment
|
|
179
|
-
(*S*) over the number of sure alignments. There is no penalty for producing
|
|
180
|
-
a lot of test alignments. An easy way to game this metric is to include every
|
|
181
|
-
possible alignment in our test alignments, regardless if they are correct or
|
|
182
|
-
not [OCH2000]_.
|
|
183
|
-
|
|
184
|
-
Here are some examples:
|
|
185
|
-
|
|
186
|
-
>>> from nltk.metrics import recall
|
|
187
|
-
>>> print(recall(Alignment([]), als.alignment))
|
|
188
|
-
None
|
|
189
|
-
>>> recall(Alignment([(0,0), (1,1), (2,2), (3,3)]), als.alignment)
|
|
190
|
-
1.0
|
|
191
|
-
>>> recall(Alignment.fromstring('0-0 3-3'), als.alignment)
|
|
192
|
-
1.0
|
|
193
|
-
>>> recall(Alignment([(0,0), (3,3)]), als.alignment)
|
|
194
|
-
1.0
|
|
195
|
-
>>> recall(Alignment([(0,0), (1,1), (2,2), (3,3), (1,2), (2,1)]), als.alignment)
|
|
196
|
-
0.66666...
|
|
197
|
-
>>> recall(als.alignment, my_als.alignment)
|
|
198
|
-
0.75
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
.. _nltk.metrics.scores.recall:
|
|
202
|
-
http://www.nltk.org/api/nltk.metrics.html#nltk.metrics.scores.recall
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
Alignment Error Rate (AER)
|
|
206
|
-
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
207
|
-
``AER = 1 - (|A∩S| + |A∩P|) / (|A| + |S|)``
|
|
208
|
-
|
|
209
|
-
**Alignment Error Rate** is commonly used metric for assessing sentence
|
|
210
|
-
alignments. It combines precision and recall metrics together such that a
|
|
211
|
-
perfect alignment must have all of the sure alignments and may have some
|
|
212
|
-
possible alignments [MIHALCEA2003]_ [KOEHN2010]_.
|
|
213
|
-
|
|
214
|
-
.. Note::
|
|
215
|
-
[KOEHN2010]_ defines the AER as ``AER = (|A∩S| + |A∩P|) / (|A| + |S|)``
|
|
216
|
-
in his book, but corrects it to the above in his online errata. This is
|
|
217
|
-
in line with [MIHALCEA2003]_.
|
|
218
|
-
|
|
219
|
-
Here are some examples:
|
|
220
|
-
|
|
221
|
-
>>> from nltk.translate import alignment_error_rate
|
|
222
|
-
>>> alignment_error_rate(Alignment([]), als.alignment)
|
|
223
|
-
1.0
|
|
224
|
-
>>> alignment_error_rate(Alignment([(0,0), (1,1), (2,2), (3,3)]), als.alignment)
|
|
225
|
-
0.0
|
|
226
|
-
>>> alignment_error_rate(als.alignment, my_als.alignment)
|
|
227
|
-
0.333333...
|
|
228
|
-
>>> alignment_error_rate(als.alignment, my_als.alignment,
|
|
229
|
-
... als.alignment | Alignment([(1,2), (2,1)]))
|
|
230
|
-
0.222222...
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
.. [OCH2000] Och, F. and Ney, H. (2000)
|
|
234
|
-
*Statistical Machine Translation*, EAMT Workshop
|
|
235
|
-
|
|
236
|
-
.. [MIHALCEA2003] Mihalcea, R. and Pedersen, T. (2003)
|
|
237
|
-
*An evaluation exercise for word alignment*, HLT-NAACL 2003
|
|
238
|
-
|
|
239
|
-
.. [KOEHN2010] Koehn, P. (2010)
|
|
240
|
-
*Statistical Machine Translation*, Cambridge University Press
|
|
241
|
-
|
|
242
|
-
|
|
1
|
+
.. Copyright (C) 2001-2018 NLTK Project
|
|
2
|
+
.. For license information, see LICENSE.TXT
|
|
3
|
+
|
|
4
|
+
.. -*- coding: utf-8 -*-
|
|
5
|
+
|
|
6
|
+
=========
|
|
7
|
+
Alignment
|
|
8
|
+
=========
|
|
9
|
+
|
|
10
|
+
Corpus Reader
|
|
11
|
+
-------------
|
|
12
|
+
|
|
13
|
+
>>> from nltk.corpus import comtrans
|
|
14
|
+
>>> words = comtrans.words('alignment-en-fr.txt')
|
|
15
|
+
>>> for word in words[:6]:
|
|
16
|
+
... print(word)
|
|
17
|
+
Resumption
|
|
18
|
+
of
|
|
19
|
+
the
|
|
20
|
+
session
|
|
21
|
+
I
|
|
22
|
+
declare
|
|
23
|
+
>>> als = comtrans.aligned_sents('alignment-en-fr.txt')[0]
|
|
24
|
+
>>> als # doctest: +NORMALIZE_WHITESPACE
|
|
25
|
+
AlignedSent(['Resumption', 'of', 'the', 'session'],
|
|
26
|
+
['Reprise', 'de', 'la', 'session'],
|
|
27
|
+
Alignment([(0, 0), (1, 1), (2, 2), (3, 3)]))
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
Alignment Objects
|
|
31
|
+
-----------------
|
|
32
|
+
|
|
33
|
+
Aligned sentences are simply a mapping between words in a sentence:
|
|
34
|
+
|
|
35
|
+
>>> print(" ".join(als.words))
|
|
36
|
+
Resumption of the session
|
|
37
|
+
>>> print(" ".join(als.mots))
|
|
38
|
+
Reprise de la session
|
|
39
|
+
>>> als.alignment
|
|
40
|
+
Alignment([(0, 0), (1, 1), (2, 2), (3, 3)])
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
Usually we look at them from the perspective of a source to a target language,
|
|
44
|
+
but they are easily inverted:
|
|
45
|
+
|
|
46
|
+
>>> als.invert() # doctest: +NORMALIZE_WHITESPACE
|
|
47
|
+
AlignedSent(['Reprise', 'de', 'la', 'session'],
|
|
48
|
+
['Resumption', 'of', 'the', 'session'],
|
|
49
|
+
Alignment([(0, 0), (1, 1), (2, 2), (3, 3)]))
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
We can create new alignments, but these need to be in the correct range of
|
|
53
|
+
the corresponding sentences:
|
|
54
|
+
|
|
55
|
+
>>> from nltk.translate import Alignment, AlignedSent
|
|
56
|
+
>>> als = AlignedSent(['Reprise', 'de', 'la', 'session'],
|
|
57
|
+
... ['Resumption', 'of', 'the', 'session'],
|
|
58
|
+
... Alignment([(0, 0), (1, 4), (2, 1), (3, 3)]))
|
|
59
|
+
Traceback (most recent call last):
|
|
60
|
+
...
|
|
61
|
+
IndexError: Alignment is outside boundary of mots
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
You can set alignments with any sequence of tuples, so long as the first two
|
|
65
|
+
indexes of the tuple are the alignment indices:
|
|
66
|
+
|
|
67
|
+
>>> als.alignment = Alignment([(0, 0), (1, 1), (2, 2, "boat"), (3, 3, False, (1,2))])
|
|
68
|
+
|
|
69
|
+
>>> Alignment([(0, 0), (1, 1), (2, 2, "boat"), (3, 3, False, (1,2))])
|
|
70
|
+
Alignment([(0, 0), (1, 1), (2, 2, 'boat'), (3, 3, False, (1, 2))])
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
Alignment Algorithms
|
|
74
|
+
--------------------
|
|
75
|
+
|
|
76
|
+
EM for IBM Model 1
|
|
77
|
+
~~~~~~~~~~~~~~~~~~
|
|
78
|
+
|
|
79
|
+
Here is an example from Koehn, 2010:
|
|
80
|
+
|
|
81
|
+
>>> from nltk.translate import IBMModel1
|
|
82
|
+
>>> corpus = [AlignedSent(['the', 'house'], ['das', 'Haus']),
|
|
83
|
+
... AlignedSent(['the', 'book'], ['das', 'Buch']),
|
|
84
|
+
... AlignedSent(['a', 'book'], ['ein', 'Buch'])]
|
|
85
|
+
>>> em_ibm1 = IBMModel1(corpus, 20)
|
|
86
|
+
>>> print(round(em_ibm1.translation_table['the']['das'], 1))
|
|
87
|
+
1.0
|
|
88
|
+
>>> print(round(em_ibm1.translation_table['book']['das'], 1))
|
|
89
|
+
0.0
|
|
90
|
+
>>> print(round(em_ibm1.translation_table['house']['das'], 1))
|
|
91
|
+
0.0
|
|
92
|
+
>>> print(round(em_ibm1.translation_table['the']['Buch'], 1))
|
|
93
|
+
0.0
|
|
94
|
+
>>> print(round(em_ibm1.translation_table['book']['Buch'], 1))
|
|
95
|
+
1.0
|
|
96
|
+
>>> print(round(em_ibm1.translation_table['a']['Buch'], 1))
|
|
97
|
+
0.0
|
|
98
|
+
>>> print(round(em_ibm1.translation_table['book']['ein'], 1))
|
|
99
|
+
0.0
|
|
100
|
+
>>> print(round(em_ibm1.translation_table['a']['ein'], 1))
|
|
101
|
+
1.0
|
|
102
|
+
>>> print(round(em_ibm1.translation_table['the']['Haus'], 1))
|
|
103
|
+
0.0
|
|
104
|
+
>>> print(round(em_ibm1.translation_table['house']['Haus'], 1))
|
|
105
|
+
1.0
|
|
106
|
+
>>> print(round(em_ibm1.translation_table['book'][None], 1))
|
|
107
|
+
0.5
|
|
108
|
+
|
|
109
|
+
And using an NLTK corpus. We train on only 10 sentences, since it is so slow:
|
|
110
|
+
|
|
111
|
+
>>> from nltk.corpus import comtrans
|
|
112
|
+
>>> com_ibm1 = IBMModel1(comtrans.aligned_sents()[:10], 20)
|
|
113
|
+
>>> print(round(com_ibm1.translation_table['bitte']['Please'], 1))
|
|
114
|
+
0.2
|
|
115
|
+
>>> print(round(com_ibm1.translation_table['Sitzungsperiode']['session'], 1))
|
|
116
|
+
1.0
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
Evaluation
|
|
120
|
+
----------
|
|
121
|
+
The evaluation metrics for alignments are usually not interested in the
|
|
122
|
+
contents of alignments but more often the comparison to a "gold standard"
|
|
123
|
+
alignment that has been been constructed by human experts. For this reason we
|
|
124
|
+
often want to work just with raw set operations against the alignment points.
|
|
125
|
+
This then gives us a very clean form for defining our evaluation metrics.
|
|
126
|
+
|
|
127
|
+
.. Note::
|
|
128
|
+
The AlignedSent class has no distinction of "possible" or "sure"
|
|
129
|
+
alignments. Thus all alignments are treated as "sure".
|
|
130
|
+
|
|
131
|
+
Consider the following aligned sentence for evaluation:
|
|
132
|
+
|
|
133
|
+
>>> my_als = AlignedSent(['Resumption', 'of', 'the', 'session'],
|
|
134
|
+
... ['Reprise', 'de', 'la', 'session'],
|
|
135
|
+
... Alignment([(0, 0), (3, 3), (1, 2), (1, 1), (1, 3)]))
|
|
136
|
+
|
|
137
|
+
Precision
|
|
138
|
+
~~~~~~~~~
|
|
139
|
+
``precision = |A∩P| / |A|``
|
|
140
|
+
|
|
141
|
+
**Precision** is probably the most well known evaluation metric and it is implemented
|
|
142
|
+
in `nltk.metrics.scores.precision`_. Since precision is simply interested in the
|
|
143
|
+
proportion of correct alignments, we calculate the ratio of the number of our
|
|
144
|
+
test alignments (*A*) that match a possible alignment (*P*), over the number of
|
|
145
|
+
test alignments provided. There is no penalty for missing a possible alignment
|
|
146
|
+
in our test alignments. An easy way to game this metric is to provide just one
|
|
147
|
+
test alignment that is in *P* [OCH2000]_.
|
|
148
|
+
|
|
149
|
+
Here are some examples:
|
|
150
|
+
|
|
151
|
+
>>> from nltk.metrics import precision
|
|
152
|
+
>>> als.alignment = Alignment([(0,0), (1,1), (2,2), (3,3)])
|
|
153
|
+
>>> precision(Alignment([]), als.alignment)
|
|
154
|
+
0.0
|
|
155
|
+
>>> precision(Alignment([(0,0), (1,1), (2,2), (3,3)]), als.alignment)
|
|
156
|
+
1.0
|
|
157
|
+
>>> precision(Alignment([(0,0), (3,3)]), als.alignment)
|
|
158
|
+
0.5
|
|
159
|
+
>>> precision(Alignment.fromstring('0-0 3-3'), als.alignment)
|
|
160
|
+
0.5
|
|
161
|
+
>>> precision(Alignment([(0,0), (1,1), (2,2), (3,3), (1,2), (2,1)]), als.alignment)
|
|
162
|
+
1.0
|
|
163
|
+
>>> precision(als.alignment, my_als.alignment)
|
|
164
|
+
0.6
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
.. _nltk.metrics.scores.precision:
|
|
168
|
+
http://www.nltk.org/api/nltk.metrics.html#nltk.metrics.scores.precision
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
Recall
|
|
172
|
+
~~~~~~
|
|
173
|
+
``recall = |A∩S| / |S|``
|
|
174
|
+
|
|
175
|
+
**Recall** is another well known evaluation metric that has a set based
|
|
176
|
+
implementation in NLTK as `nltk.metrics.scores.recall`_. Since recall is
|
|
177
|
+
simply interested in the proportion of found alignments, we calculate the
|
|
178
|
+
ratio of the number of our test alignments (*A*) that match a sure alignment
|
|
179
|
+
(*S*) over the number of sure alignments. There is no penalty for producing
|
|
180
|
+
a lot of test alignments. An easy way to game this metric is to include every
|
|
181
|
+
possible alignment in our test alignments, regardless if they are correct or
|
|
182
|
+
not [OCH2000]_.
|
|
183
|
+
|
|
184
|
+
Here are some examples:
|
|
185
|
+
|
|
186
|
+
>>> from nltk.metrics import recall
|
|
187
|
+
>>> print(recall(Alignment([]), als.alignment))
|
|
188
|
+
None
|
|
189
|
+
>>> recall(Alignment([(0,0), (1,1), (2,2), (3,3)]), als.alignment)
|
|
190
|
+
1.0
|
|
191
|
+
>>> recall(Alignment.fromstring('0-0 3-3'), als.alignment)
|
|
192
|
+
1.0
|
|
193
|
+
>>> recall(Alignment([(0,0), (3,3)]), als.alignment)
|
|
194
|
+
1.0
|
|
195
|
+
>>> recall(Alignment([(0,0), (1,1), (2,2), (3,3), (1,2), (2,1)]), als.alignment)
|
|
196
|
+
0.66666...
|
|
197
|
+
>>> recall(als.alignment, my_als.alignment)
|
|
198
|
+
0.75
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
.. _nltk.metrics.scores.recall:
|
|
202
|
+
http://www.nltk.org/api/nltk.metrics.html#nltk.metrics.scores.recall
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
Alignment Error Rate (AER)
|
|
206
|
+
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
207
|
+
``AER = 1 - (|A∩S| + |A∩P|) / (|A| + |S|)``
|
|
208
|
+
|
|
209
|
+
**Alignment Error Rate** is commonly used metric for assessing sentence
|
|
210
|
+
alignments. It combines precision and recall metrics together such that a
|
|
211
|
+
perfect alignment must have all of the sure alignments and may have some
|
|
212
|
+
possible alignments [MIHALCEA2003]_ [KOEHN2010]_.
|
|
213
|
+
|
|
214
|
+
.. Note::
|
|
215
|
+
[KOEHN2010]_ defines the AER as ``AER = (|A∩S| + |A∩P|) / (|A| + |S|)``
|
|
216
|
+
in his book, but corrects it to the above in his online errata. This is
|
|
217
|
+
in line with [MIHALCEA2003]_.
|
|
218
|
+
|
|
219
|
+
Here are some examples:
|
|
220
|
+
|
|
221
|
+
>>> from nltk.translate import alignment_error_rate
|
|
222
|
+
>>> alignment_error_rate(Alignment([]), als.alignment)
|
|
223
|
+
1.0
|
|
224
|
+
>>> alignment_error_rate(Alignment([(0,0), (1,1), (2,2), (3,3)]), als.alignment)
|
|
225
|
+
0.0
|
|
226
|
+
>>> alignment_error_rate(als.alignment, my_als.alignment)
|
|
227
|
+
0.333333...
|
|
228
|
+
>>> alignment_error_rate(als.alignment, my_als.alignment,
|
|
229
|
+
... als.alignment | Alignment([(1,2), (2,1)]))
|
|
230
|
+
0.222222...
|
|
231
|
+
|
|
232
|
+
|
|
233
|
+
.. [OCH2000] Och, F. and Ney, H. (2000)
|
|
234
|
+
*Statistical Machine Translation*, EAMT Workshop
|
|
235
|
+
|
|
236
|
+
.. [MIHALCEA2003] Mihalcea, R. and Pedersen, T. (2003)
|
|
237
|
+
*An evaluation exercise for word alignment*, HLT-NAACL 2003
|
|
238
|
+
|
|
239
|
+
.. [KOEHN2010] Koehn, P. (2010)
|
|
240
|
+
*Statistical Machine Translation*, Cambridge University Press
|
|
241
|
+
|
|
242
|
+
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
from __future__ import absolute_import
|
|
3
|
-
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
from __future__ import absolute_import
|
|
3
|
+
|
|
4
4
|
from nltk.corpus import teardown_module
|