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,131 +1,135 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
# Natural Language Toolkit: GDFA word alignment symmetrization
|
|
3
|
-
#
|
|
4
|
-
# Copyright (C) 2001-
|
|
5
|
-
# Authors: Liling Tan
|
|
6
|
-
# URL: <http://nltk.org/>
|
|
7
|
-
# For license information, see LICENSE.TXT
|
|
8
|
-
|
|
9
|
-
import
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
... '
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
... "
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
... "
|
|
37
|
-
|
|
38
|
-
>>>
|
|
39
|
-
>>>
|
|
40
|
-
>>>
|
|
41
|
-
>>> gdfa
|
|
42
|
-
|
|
43
|
-
... (
|
|
44
|
-
...
|
|
45
|
-
...
|
|
46
|
-
... 12), (
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
:
|
|
56
|
-
:
|
|
57
|
-
:
|
|
58
|
-
:
|
|
59
|
-
:
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
:
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
:
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
aligned['
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
# for english word e = 0 ... en
|
|
92
|
-
for e in range(srclen):
|
|
93
|
-
# for foreign word f = 0 ... fn
|
|
94
|
-
for f in range(trglen):
|
|
95
|
-
# if ( e aligned with f)
|
|
96
|
-
if (e,f) in alignment:
|
|
97
|
-
# for each neighboring point (e-new, f-new)
|
|
98
|
-
for neighbor in neighbors:
|
|
99
|
-
neighbor = tuple(i+j for i,j in zip((e,f),neighbor))
|
|
100
|
-
e_new, f_new = neighbor
|
|
101
|
-
# if ( ( e-new not aligned and f-new not aligned)
|
|
102
|
-
# and (e-new, f-new in union(e2f, f2e) )
|
|
103
|
-
if (e_new not in aligned and f_new not in aligned)\
|
|
104
|
-
and neighbor in union:
|
|
105
|
-
alignment.add(neighbor)
|
|
106
|
-
aligned['e'].add(e_new); aligned['f'].add(f_new)
|
|
107
|
-
prev_len+=1
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Natural Language Toolkit: GDFA word alignment symmetrization
|
|
3
|
+
#
|
|
4
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
5
|
+
# Authors: Liling Tan
|
|
6
|
+
# URL: <http://nltk.org/>
|
|
7
|
+
# For license information, see LICENSE.TXT
|
|
8
|
+
|
|
9
|
+
from collections import defaultdict
|
|
10
|
+
|
|
11
|
+
def grow_diag_final_and(srclen, trglen, e2f, f2e):
|
|
12
|
+
"""
|
|
13
|
+
This module symmetrisatizes the source-to-target and target-to-source
|
|
14
|
+
word alignment output and produces, aka. GDFA algorithm (Koehn, 2005).
|
|
15
|
+
|
|
16
|
+
Step 1: Find the intersection of the bidirectional alignment.
|
|
17
|
+
|
|
18
|
+
Step 2: Search for additional neighbor alignment points to be added, given
|
|
19
|
+
these criteria: (i) neighbor alignments points are not in the
|
|
20
|
+
intersection and (ii) neighbor alignments are in the union.
|
|
21
|
+
|
|
22
|
+
Step 3: Add all other alignment points thats not in the intersection, not in
|
|
23
|
+
the neighboring alignments that met the criteria but in the original
|
|
24
|
+
foward/backward alignment outputs.
|
|
25
|
+
|
|
26
|
+
>>> forw = ('0-0 2-1 9-2 21-3 10-4 7-5 11-6 9-7 12-8 1-9 3-10 '
|
|
27
|
+
... '4-11 17-12 17-13 25-14 13-15 24-16 11-17 28-18')
|
|
28
|
+
>>> back = ('0-0 1-9 2-9 3-10 4-11 5-12 6-6 7-5 8-6 9-7 10-4 '
|
|
29
|
+
... '11-6 12-8 13-12 15-12 17-13 18-13 19-12 20-13 '
|
|
30
|
+
... '21-3 22-12 23-14 24-17 25-15 26-17 27-18 28-18')
|
|
31
|
+
>>> srctext = ("この よう な ハロー 白色 わい 星 の L 関数 "
|
|
32
|
+
... "は L と 共 に 不連続 に 増加 する こと が "
|
|
33
|
+
... "期待 さ れる こと を 示し た 。")
|
|
34
|
+
>>> trgtext = ("Therefore , we expect that the luminosity function "
|
|
35
|
+
... "of such halo white dwarfs increases discontinuously "
|
|
36
|
+
... "with the luminosity .")
|
|
37
|
+
>>> srclen = len(srctext.split())
|
|
38
|
+
>>> trglen = len(trgtext.split())
|
|
39
|
+
>>>
|
|
40
|
+
>>> gdfa = grow_diag_final_and(srclen, trglen, forw, back)
|
|
41
|
+
>>> gdfa == sorted(set([(28, 18), (6, 6), (24, 17), (2, 1), (15, 12), (13, 12),
|
|
42
|
+
... (2, 9), (3, 10), (26, 17), (25, 15), (8, 6), (9, 7), (20,
|
|
43
|
+
... 13), (18, 13), (0, 0), (10, 4), (13, 15), (23, 14), (7, 5),
|
|
44
|
+
... (25, 14), (1, 9), (17, 13), (4, 11), (11, 17), (9, 2), (22,
|
|
45
|
+
... 12), (27, 18), (24, 16), (21, 3), (19, 12), (17, 12), (5,
|
|
46
|
+
... 12), (11, 6), (12, 8)]))
|
|
47
|
+
True
|
|
48
|
+
|
|
49
|
+
References:
|
|
50
|
+
Koehn, P., A. Axelrod, A. Birch, C. Callison, M. Osborne, and D. Talbot.
|
|
51
|
+
2005. Edinburgh System Description for the 2005 IWSLT Speech
|
|
52
|
+
Translation Evaluation. In MT Eval Workshop.
|
|
53
|
+
|
|
54
|
+
:type srclen: int
|
|
55
|
+
:param srclen: the number of tokens in the source language
|
|
56
|
+
:type trglen: int
|
|
57
|
+
:param trglen: the number of tokens in the target language
|
|
58
|
+
:type e2f: str
|
|
59
|
+
:param e2f: the forward word alignment outputs from source-to-target
|
|
60
|
+
language (in pharaoh output format)
|
|
61
|
+
:type f2e: str
|
|
62
|
+
:param f2e: the backward word alignment outputs from target-to-source
|
|
63
|
+
language (in pharaoh output format)
|
|
64
|
+
:rtype: set(tuple(int))
|
|
65
|
+
:return: the symmetrized alignment points from the GDFA algorithm
|
|
66
|
+
"""
|
|
67
|
+
|
|
68
|
+
# Converts pharaoh text format into list of tuples.
|
|
69
|
+
e2f = [tuple(map(int,a.split('-'))) for a in e2f.split()]
|
|
70
|
+
f2e = [tuple(map(int,a.split('-'))) for a in f2e.split()]
|
|
71
|
+
|
|
72
|
+
neighbors = [(-1,0),(0,-1),(1,0),(0,1),(-1,-1),(-1,1),(1,-1),(1,1)]
|
|
73
|
+
alignment = set(e2f).intersection(set(f2e)) # Find the intersection.
|
|
74
|
+
union = set(e2f).union(set(f2e))
|
|
75
|
+
|
|
76
|
+
# *aligned* is used to check if neighbors are aligned in grow_diag()
|
|
77
|
+
aligned = defaultdict(set)
|
|
78
|
+
for i,j in alignment:
|
|
79
|
+
aligned['e'].add(i)
|
|
80
|
+
aligned['f'].add(j)
|
|
81
|
+
|
|
82
|
+
def grow_diag():
|
|
83
|
+
"""
|
|
84
|
+
Search for the neighbor points and them to the intersected alignment
|
|
85
|
+
points if criteria are met.
|
|
86
|
+
"""
|
|
87
|
+
prev_len = len(alignment) - 1
|
|
88
|
+
# iterate until no new points added
|
|
89
|
+
while prev_len < len(alignment):
|
|
90
|
+
no_new_points = True
|
|
91
|
+
# for english word e = 0 ... en
|
|
92
|
+
for e in range(srclen):
|
|
93
|
+
# for foreign word f = 0 ... fn
|
|
94
|
+
for f in range(trglen):
|
|
95
|
+
# if ( e aligned with f)
|
|
96
|
+
if (e,f) in alignment:
|
|
97
|
+
# for each neighboring point (e-new, f-new)
|
|
98
|
+
for neighbor in neighbors:
|
|
99
|
+
neighbor = tuple(i+j for i,j in zip((e,f),neighbor))
|
|
100
|
+
e_new, f_new = neighbor
|
|
101
|
+
# if ( ( e-new not aligned and f-new not aligned)
|
|
102
|
+
# and (e-new, f-new in union(e2f, f2e) )
|
|
103
|
+
if (e_new not in aligned and f_new not in aligned)\
|
|
104
|
+
and neighbor in union:
|
|
105
|
+
alignment.add(neighbor)
|
|
106
|
+
aligned['e'].add(e_new); aligned['f'].add(f_new)
|
|
107
|
+
prev_len+=1
|
|
108
|
+
no_new_points = False
|
|
109
|
+
# iterate until no new points added
|
|
110
|
+
if no_new_points:
|
|
111
|
+
break
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def final_and(a):
|
|
115
|
+
"""
|
|
116
|
+
Adds remaining points that are not in the intersection, not in the
|
|
117
|
+
neighboring alignments but in the original *e2f* and *f2e* alignments
|
|
118
|
+
"""
|
|
119
|
+
# for english word e = 0 ... en
|
|
120
|
+
for e_new in range(srclen):
|
|
121
|
+
# for foreign word f = 0 ... fn
|
|
122
|
+
for f_new in range(trglen):
|
|
123
|
+
# if ( ( e-new not aligned and f-new not aligned)
|
|
124
|
+
# and (e-new, f-new in union(e2f, f2e) )
|
|
125
|
+
if (e_new not in aligned
|
|
126
|
+
and f_new not in aligned
|
|
127
|
+
and (e_new, f_new) in union):
|
|
128
|
+
alignment.add((e_new, f_new))
|
|
129
|
+
aligned['e'].add(e_new); aligned['f'].add(f_new)
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
grow_diag()
|
|
133
|
+
final_and(e2f)
|
|
134
|
+
final_and(f2e)
|
|
135
|
+
return sorted(alignment)
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Natural Language Toolkit: GLEU Score
|
|
3
|
+
#
|
|
4
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
5
|
+
# Authors:
|
|
6
|
+
# Contributors: Mike Schuster, Michael Wayne Goodman, Liling Tan
|
|
7
|
+
# URL: <http://nltk.org/>
|
|
8
|
+
# For license information, see LICENSE.TXT
|
|
9
|
+
|
|
10
|
+
""" GLEU score implementation. """
|
|
11
|
+
from __future__ import division
|
|
12
|
+
from collections import Counter
|
|
13
|
+
|
|
14
|
+
from nltk.util import ngrams, everygrams
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def sentence_gleu(references, hypothesis, min_len=1, max_len=4):
|
|
18
|
+
"""
|
|
19
|
+
Calculates the sentence level GLEU (Google-BLEU) score described in
|
|
20
|
+
|
|
21
|
+
Yonghui Wu, Mike Schuster, Zhifeng Chen, Quoc V. Le, Mohammad Norouzi,
|
|
22
|
+
Wolfgang Macherey, Maxim Krikun, Yuan Cao, Qin Gao, Klaus Macherey,
|
|
23
|
+
Jeff Klingner, Apurva Shah, Melvin Johnson, Xiaobing Liu, Lukasz Kaiser,
|
|
24
|
+
Stephan Gouws, Yoshikiyo Kato, Taku Kudo, Hideto Kazawa, Keith Stevens,
|
|
25
|
+
George Kurian, Nishant Patil, Wei Wang, Cliff Young, Jason Smith,
|
|
26
|
+
Jason Riesa, Alex Rudnick, Oriol Vinyals, Greg Corrado, Macduff Hughes,
|
|
27
|
+
Jeffrey Dean. (2016) Google’s Neural Machine Translation System:
|
|
28
|
+
Bridging the Gap between Human and Machine Translation.
|
|
29
|
+
eprint arXiv:1609.08144. https://arxiv.org/pdf/1609.08144v2.pdf
|
|
30
|
+
Retrieved on 27 Oct 2016.
|
|
31
|
+
|
|
32
|
+
From Wu et al. (2016):
|
|
33
|
+
"The BLEU score has some undesirable properties when used for single
|
|
34
|
+
sentences, as it was designed to be a corpus measure. We therefore
|
|
35
|
+
use a slightly different score for our RL experiments which we call
|
|
36
|
+
the 'GLEU score'. For the GLEU score, we record all sub-sequences of
|
|
37
|
+
1, 2, 3 or 4 tokens in output and target sequence (n-grams). We then
|
|
38
|
+
compute a recall, which is the ratio of the number of matching n-grams
|
|
39
|
+
to the number of total n-grams in the target (ground truth) sequence,
|
|
40
|
+
and a precision, which is the ratio of the number of matching n-grams
|
|
41
|
+
to the number of total n-grams in the generated output sequence. Then
|
|
42
|
+
GLEU score is simply the minimum of recall and precision. This GLEU
|
|
43
|
+
score's range is always between 0 (no matches) and 1 (all match) and
|
|
44
|
+
it is symmetrical when switching output and target. According to
|
|
45
|
+
our experiments, GLEU score correlates quite well with the BLEU
|
|
46
|
+
metric on a corpus level but does not have its drawbacks for our per
|
|
47
|
+
sentence reward objective."
|
|
48
|
+
|
|
49
|
+
Note: The initial implementation only allowed a single reference, but now
|
|
50
|
+
a list of references is required (which is consistent with
|
|
51
|
+
bleu_score.sentence_bleu()).
|
|
52
|
+
|
|
53
|
+
The infamous "the the the ... " example
|
|
54
|
+
|
|
55
|
+
>>> ref = 'the cat is on the mat'.split()
|
|
56
|
+
>>> hyp = 'the the the the the the the'.split()
|
|
57
|
+
>>> sentence_gleu([ref], hyp) # doctest: +ELLIPSIS
|
|
58
|
+
0.0909...
|
|
59
|
+
|
|
60
|
+
An example to evaluate normal machine translation outputs
|
|
61
|
+
|
|
62
|
+
>>> ref1 = str('It is a guide to action that ensures that the military '
|
|
63
|
+
... 'will forever heed Party commands').split()
|
|
64
|
+
>>> hyp1 = str('It is a guide to action which ensures that the military '
|
|
65
|
+
... 'always obeys the commands of the party').split()
|
|
66
|
+
>>> hyp2 = str('It is to insure the troops forever hearing the activity '
|
|
67
|
+
... 'guidebook that party direct').split()
|
|
68
|
+
>>> sentence_gleu([ref1], hyp1) # doctest: +ELLIPSIS
|
|
69
|
+
0.4393...
|
|
70
|
+
>>> sentence_gleu([ref1], hyp2) # doctest: +ELLIPSIS
|
|
71
|
+
0.1206...
|
|
72
|
+
|
|
73
|
+
:param references: a list of reference sentences
|
|
74
|
+
:type references: list(list(str))
|
|
75
|
+
:param hypothesis: a hypothesis sentence
|
|
76
|
+
:type hypothesis: list(str)
|
|
77
|
+
:param min_len: The minimum order of n-gram this function should extract.
|
|
78
|
+
:type min_len: int
|
|
79
|
+
:param max_len: The maximum order of n-gram this function should extract.
|
|
80
|
+
:type max_len: int
|
|
81
|
+
:return: the sentence level GLEU score.
|
|
82
|
+
:rtype: float
|
|
83
|
+
"""
|
|
84
|
+
return corpus_gleu(
|
|
85
|
+
[references],
|
|
86
|
+
[hypothesis],
|
|
87
|
+
min_len=min_len,
|
|
88
|
+
max_len=max_len
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
def corpus_gleu(list_of_references, hypotheses, min_len=1, max_len=4):
|
|
92
|
+
"""
|
|
93
|
+
Calculate a single corpus-level GLEU score (aka. system-level GLEU) for all
|
|
94
|
+
the hypotheses and their respective references.
|
|
95
|
+
|
|
96
|
+
Instead of averaging the sentence level GLEU scores (i.e. macro-average
|
|
97
|
+
precision), Wu et al. (2016) sum up the matching tokens and the max of
|
|
98
|
+
hypothesis and reference tokens for each sentence, then compute using the
|
|
99
|
+
aggregate values.
|
|
100
|
+
|
|
101
|
+
From Mike Schuster (via email):
|
|
102
|
+
"For the corpus, we just add up the two statistics n_match and
|
|
103
|
+
n_all = max(n_all_output, n_all_target) for all sentences, then
|
|
104
|
+
calculate gleu_score = n_match / n_all, so it is not just a mean of
|
|
105
|
+
the sentence gleu scores (in our case, longer sentences count more,
|
|
106
|
+
which I think makes sense as they are more difficult to translate)."
|
|
107
|
+
|
|
108
|
+
>>> hyp1 = ['It', 'is', 'a', 'guide', 'to', 'action', 'which',
|
|
109
|
+
... 'ensures', 'that', 'the', 'military', 'always',
|
|
110
|
+
... 'obeys', 'the', 'commands', 'of', 'the', 'party']
|
|
111
|
+
>>> ref1a = ['It', 'is', 'a', 'guide', 'to', 'action', 'that',
|
|
112
|
+
... 'ensures', 'that', 'the', 'military', 'will', 'forever',
|
|
113
|
+
... 'heed', 'Party', 'commands']
|
|
114
|
+
>>> ref1b = ['It', 'is', 'the', 'guiding', 'principle', 'which',
|
|
115
|
+
... 'guarantees', 'the', 'military', 'forces', 'always',
|
|
116
|
+
... 'being', 'under', 'the', 'command', 'of', 'the', 'Party']
|
|
117
|
+
>>> ref1c = ['It', 'is', 'the', 'practical', 'guide', 'for', 'the',
|
|
118
|
+
... 'army', 'always', 'to', 'heed', 'the', 'directions',
|
|
119
|
+
... 'of', 'the', 'party']
|
|
120
|
+
|
|
121
|
+
>>> hyp2 = ['he', 'read', 'the', 'book', 'because', 'he', 'was',
|
|
122
|
+
... 'interested', 'in', 'world', 'history']
|
|
123
|
+
>>> ref2a = ['he', 'was', 'interested', 'in', 'world', 'history',
|
|
124
|
+
... 'because', 'he', 'read', 'the', 'book']
|
|
125
|
+
|
|
126
|
+
>>> list_of_references = [[ref1a, ref1b, ref1c], [ref2a]]
|
|
127
|
+
>>> hypotheses = [hyp1, hyp2]
|
|
128
|
+
>>> corpus_gleu(list_of_references, hypotheses) # doctest: +ELLIPSIS
|
|
129
|
+
0.5673...
|
|
130
|
+
|
|
131
|
+
The example below show that corpus_gleu() is different from averaging
|
|
132
|
+
sentence_gleu() for hypotheses
|
|
133
|
+
|
|
134
|
+
>>> score1 = sentence_gleu([ref1a], hyp1)
|
|
135
|
+
>>> score2 = sentence_gleu([ref2a], hyp2)
|
|
136
|
+
>>> (score1 + score2) / 2 # doctest: +ELLIPSIS
|
|
137
|
+
0.6144...
|
|
138
|
+
|
|
139
|
+
:param list_of_references: a list of reference sentences, w.r.t. hypotheses
|
|
140
|
+
:type list_of_references: list(list(list(str)))
|
|
141
|
+
:param hypotheses: a list of hypothesis sentences
|
|
142
|
+
:type hypotheses: list(list(str))
|
|
143
|
+
:param min_len: The minimum order of n-gram this function should extract.
|
|
144
|
+
:type min_len: int
|
|
145
|
+
:param max_len: The maximum order of n-gram this function should extract.
|
|
146
|
+
:type max_len: int
|
|
147
|
+
:return: The corpus-level GLEU score.
|
|
148
|
+
:rtype: float
|
|
149
|
+
"""
|
|
150
|
+
# sanity check
|
|
151
|
+
assert len(list_of_references) == len(hypotheses), "The number of hypotheses and their reference(s) should be the same"
|
|
152
|
+
|
|
153
|
+
# sum matches and max-token-lengths over all sentences
|
|
154
|
+
corpus_n_match = 0
|
|
155
|
+
corpus_n_all = 0
|
|
156
|
+
|
|
157
|
+
for references, hypothesis in zip(list_of_references, hypotheses):
|
|
158
|
+
hyp_ngrams = Counter(everygrams(hypothesis, min_len, max_len))
|
|
159
|
+
tpfp = sum(hyp_ngrams.values()) # True positives + False positives.
|
|
160
|
+
|
|
161
|
+
hyp_counts = []
|
|
162
|
+
for reference in references:
|
|
163
|
+
ref_ngrams = Counter(everygrams(reference, min_len, max_len))
|
|
164
|
+
tpfn = sum(ref_ngrams.values()) # True positives + False negatives.
|
|
165
|
+
|
|
166
|
+
overlap_ngrams = ref_ngrams & hyp_ngrams
|
|
167
|
+
tp = sum(overlap_ngrams.values()) # True positives.
|
|
168
|
+
|
|
169
|
+
# While GLEU is defined as the minimum of precision and
|
|
170
|
+
# recall, we can reduce the number of division operations by one by
|
|
171
|
+
# instead finding the maximum of the denominators for the precision
|
|
172
|
+
# and recall formulae, since the numerators are the same:
|
|
173
|
+
# precision = tp / tpfp
|
|
174
|
+
# recall = tp / tpfn
|
|
175
|
+
# gleu_score = min(precision, recall) == tp / max(tpfp, tpfn)
|
|
176
|
+
n_all = max(tpfp, tpfn)
|
|
177
|
+
|
|
178
|
+
if n_all > 0:
|
|
179
|
+
hyp_counts.append((tp, n_all))
|
|
180
|
+
|
|
181
|
+
# use the reference yielding the highest score
|
|
182
|
+
if hyp_counts:
|
|
183
|
+
n_match, n_all = max(hyp_counts, key=lambda hc: hc[0]/hc[1])
|
|
184
|
+
corpus_n_match += n_match
|
|
185
|
+
corpus_n_all += n_all
|
|
186
|
+
|
|
187
|
+
# corner case: empty corpus or empty references---don't divide by zero!
|
|
188
|
+
if corpus_n_all == 0:
|
|
189
|
+
gleu_score = 0.0
|
|
190
|
+
else:
|
|
191
|
+
gleu_score = corpus_n_match / corpus_n_all
|
|
192
|
+
|
|
193
|
+
return gleu_score
|