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
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Natural Language Toolkit: ChrF score
|
|
3
|
+
#
|
|
4
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
5
|
+
# Authors: Maja Popovic
|
|
6
|
+
# Contributors: Liling Tan
|
|
7
|
+
# URL: <http://nltk.org/>
|
|
8
|
+
# For license information, see LICENSE.TXT
|
|
9
|
+
|
|
10
|
+
""" ChrF score implementation """
|
|
11
|
+
from __future__ import division
|
|
12
|
+
from collections import Counter
|
|
13
|
+
|
|
14
|
+
from nltk.util import ngrams, everygrams
|
|
15
|
+
|
|
16
|
+
def sentence_chrf(reference, hypothesis, min_len=1, max_len=6, beta=3.0):
|
|
17
|
+
"""
|
|
18
|
+
Calculates the sentence level CHRF (Character n-gram F-score) described in
|
|
19
|
+
- Maja Popovic. 2015. CHRF: Character n-gram F-score for Automatic MT Evaluation.
|
|
20
|
+
In Proceedings of the 10th Workshop on Machine Translation.
|
|
21
|
+
http://www.statmt.org/wmt15/pdf/WMT49.pdf
|
|
22
|
+
- Maja Popovic. 2016. CHRF Deconstructed: β Parameters and n-gram Weights.
|
|
23
|
+
In Proceedings of the 1st Conference on Machine Translation.
|
|
24
|
+
http://www.statmt.org/wmt16/pdf/W16-2341.pdf
|
|
25
|
+
|
|
26
|
+
Unlike multi-reference BLEU, CHRF only supports a single reference.
|
|
27
|
+
|
|
28
|
+
An example from the original BLEU paper
|
|
29
|
+
http://www.aclweb.org/anthology/P02-1040.pdf
|
|
30
|
+
|
|
31
|
+
>>> ref1 = str('It is a guide to action that ensures that the military '
|
|
32
|
+
... 'will forever heed Party commands').split()
|
|
33
|
+
>>> hyp1 = str('It is a guide to action which ensures that the military '
|
|
34
|
+
... 'always obeys the commands of the party').split()
|
|
35
|
+
>>> hyp2 = str('It is to insure the troops forever hearing the activity '
|
|
36
|
+
... 'guidebook that party direct').split()
|
|
37
|
+
>>> sentence_chrf(ref1, hyp1) # doctest: +ELLIPSIS
|
|
38
|
+
0.6768...
|
|
39
|
+
>>> sentence_chrf(ref1, hyp2) # doctest: +ELLIPSIS
|
|
40
|
+
0.4201...
|
|
41
|
+
|
|
42
|
+
The infamous "the the the ... " example
|
|
43
|
+
|
|
44
|
+
>>> ref = 'the cat is on the mat'.split()
|
|
45
|
+
>>> hyp = 'the the the the the the the'.split()
|
|
46
|
+
>>> sentence_chrf(ref, hyp) # doctest: +ELLIPSIS
|
|
47
|
+
0.2530...
|
|
48
|
+
|
|
49
|
+
An example to show that this function allows users to use strings instead of
|
|
50
|
+
tokens, i.e. list(str) as inputs.
|
|
51
|
+
|
|
52
|
+
>>> ref1 = str('It is a guide to action that ensures that the military '
|
|
53
|
+
... 'will forever heed Party commands')
|
|
54
|
+
>>> hyp1 = str('It is a guide to action which ensures that the military '
|
|
55
|
+
... 'always obeys the commands of the party')
|
|
56
|
+
>>> sentence_chrf(ref1, hyp1) # doctest: +ELLIPSIS
|
|
57
|
+
0.6768...
|
|
58
|
+
>>> type(ref1) == type(hyp1) == str
|
|
59
|
+
True
|
|
60
|
+
>>> sentence_chrf(ref1.split(), hyp1.split()) # doctest: +ELLIPSIS
|
|
61
|
+
0.6768...
|
|
62
|
+
|
|
63
|
+
To skip the unigrams and only use 2- to 3-grams:
|
|
64
|
+
|
|
65
|
+
>>> sentence_chrf(ref1, hyp1, min_len=2, max_len=3) # doctest: +ELLIPSIS
|
|
66
|
+
0.7018...
|
|
67
|
+
|
|
68
|
+
:param references: reference sentence
|
|
69
|
+
:type references: list(str) / str
|
|
70
|
+
:param hypothesis: a hypothesis sentence
|
|
71
|
+
:type hypothesis: list(str) / str
|
|
72
|
+
:param min_len: The minimum order of n-gram this function should extract.
|
|
73
|
+
:type min_len: int
|
|
74
|
+
:param max_len: The maximum order of n-gram this function should extract.
|
|
75
|
+
:type max_len: int
|
|
76
|
+
:param beta: the parameter to assign more importance to recall over precision
|
|
77
|
+
:type beta: float
|
|
78
|
+
:return: the sentence level CHRF score.
|
|
79
|
+
:rtype: float
|
|
80
|
+
"""
|
|
81
|
+
return corpus_chrf([reference], [hypothesis], min_len, max_len, beta=beta)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def corpus_chrf(list_of_references, hypotheses, min_len=1, max_len=6, beta=3.0):
|
|
85
|
+
"""
|
|
86
|
+
Calculates the corpus level CHRF (Character n-gram F-score), it is the
|
|
87
|
+
micro-averaged value of the sentence/segment level CHRF score.
|
|
88
|
+
|
|
89
|
+
CHRF only supports a single reference.
|
|
90
|
+
|
|
91
|
+
>>> ref1 = str('It is a guide to action that ensures that the military '
|
|
92
|
+
... 'will forever heed Party commands').split()
|
|
93
|
+
>>> ref2 = str('It is the guiding principle which guarantees the military '
|
|
94
|
+
... 'forces always being under the command of the Party').split()
|
|
95
|
+
>>>
|
|
96
|
+
>>> hyp1 = str('It is a guide to action which ensures that the military '
|
|
97
|
+
... 'always obeys the commands of the party').split()
|
|
98
|
+
>>> hyp2 = str('It is to insure the troops forever hearing the activity '
|
|
99
|
+
... 'guidebook that party direct')
|
|
100
|
+
>>> corpus_chrf([ref1, ref2, ref1, ref2], [hyp1, hyp2, hyp2, hyp1]) # doctest: +ELLIPSIS
|
|
101
|
+
0.4915...
|
|
102
|
+
|
|
103
|
+
:param references: a corpus of list of reference sentences, w.r.t. hypotheses
|
|
104
|
+
:type references: list(list(str)) / list(str)
|
|
105
|
+
:param hypotheses: a list of hypothesis sentences
|
|
106
|
+
:type hypotheses: list(list(str)) / list(str)
|
|
107
|
+
:param min_len: The minimum order of n-gram this function should extract.
|
|
108
|
+
:type min_len: int
|
|
109
|
+
:param max_len: The maximum order of n-gram this function should extract.
|
|
110
|
+
:type max_len: int
|
|
111
|
+
:param beta: the parameter to assign more importance to recall over precision
|
|
112
|
+
:type beta: float
|
|
113
|
+
:return: the sentence level CHRF score.
|
|
114
|
+
:rtype: float
|
|
115
|
+
"""
|
|
116
|
+
|
|
117
|
+
assert len(list_of_references) == len(hypotheses), "The number of hypotheses and their references should be the same"
|
|
118
|
+
|
|
119
|
+
# Iterate through each hypothesis and their corresponding references.
|
|
120
|
+
for reference, hypothesis in zip(list_of_references, hypotheses):
|
|
121
|
+
# Cheating condition to allow users to input strings instead of tokens.
|
|
122
|
+
if type(reference) and type(hypothesis) != str:
|
|
123
|
+
reference, hypothesis = ' '.join(reference), ' '.join(hypothesis)
|
|
124
|
+
# For each order of ngram, calculate the no. of ngram matches and
|
|
125
|
+
# keep track of no. of ngram in references.
|
|
126
|
+
ref_ngrams = Counter(everygrams(reference, min_len, max_len))
|
|
127
|
+
hyp_ngrams = Counter(everygrams(hypothesis, min_len, max_len))
|
|
128
|
+
overlap_ngrams = ref_ngrams & hyp_ngrams
|
|
129
|
+
tp = sum(overlap_ngrams.values()) # True positives.
|
|
130
|
+
tpfp = sum(hyp_ngrams.values()) # True positives + False positives.
|
|
131
|
+
tffn = sum(ref_ngrams.values()) # True posities + False negatives.
|
|
132
|
+
|
|
133
|
+
precision = tp / tpfp
|
|
134
|
+
recall = tp / tffn
|
|
135
|
+
factor = beta**2
|
|
136
|
+
score = (1+ factor ) * (precision * recall) / ( factor * precision + recall)
|
|
137
|
+
return score
|
|
@@ -1,235 +1,248 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
|
|
3
|
-
# Natural Language Toolkit: Gale-Church Aligner
|
|
4
|
-
#
|
|
5
|
-
# Copyright (C) 2001-
|
|
6
|
-
# Author: Torsten Marek <marek@ifi.uzh.ch>
|
|
7
|
-
#
|
|
8
|
-
#
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
import
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
from
|
|
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
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
#
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
(
|
|
69
|
-
(
|
|
70
|
-
(
|
|
71
|
-
(
|
|
72
|
-
(
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
"""
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
"""
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
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
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
|
|
3
|
+
# Natural Language Toolkit: Gale-Church Aligner
|
|
4
|
+
#
|
|
5
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
6
|
+
# Author: Torsten Marek <marek@ifi.uzh.ch>
|
|
7
|
+
# Contributor: Cassidy Laidlaw, Liling Tan
|
|
8
|
+
# URL: <http://nltk.org/>
|
|
9
|
+
# For license information, see LICENSE.TXT
|
|
10
|
+
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
A port of the Gale-Church Aligner.
|
|
14
|
+
|
|
15
|
+
Gale & Church (1993), A Program for Aligning Sentences in Bilingual Corpora.
|
|
16
|
+
http://aclweb.org/anthology/J93-1004.pdf
|
|
17
|
+
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
from __future__ import division
|
|
21
|
+
import math
|
|
22
|
+
|
|
23
|
+
try:
|
|
24
|
+
from scipy.stats import norm
|
|
25
|
+
from norm import logsf as norm_logsf
|
|
26
|
+
except ImportError:
|
|
27
|
+
def erfcc(x):
|
|
28
|
+
"""Complementary error function."""
|
|
29
|
+
z = abs(x)
|
|
30
|
+
t = 1 / (1 + 0.5 * z)
|
|
31
|
+
r = t * math.exp(-z * z -
|
|
32
|
+
1.26551223 + t *
|
|
33
|
+
(1.00002368 + t *
|
|
34
|
+
(.37409196 + t *
|
|
35
|
+
(.09678418 + t *
|
|
36
|
+
(-.18628806 + t *
|
|
37
|
+
(.27886807 + t *
|
|
38
|
+
(-1.13520398 + t *
|
|
39
|
+
(1.48851587 + t *
|
|
40
|
+
(-.82215223 + t * .17087277)))))))))
|
|
41
|
+
if x >= 0.:
|
|
42
|
+
return r
|
|
43
|
+
else:
|
|
44
|
+
return 2. - r
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def norm_cdf(x):
|
|
48
|
+
"""Return the area under the normal distribution from M{-∞..x}."""
|
|
49
|
+
return 1 - 0.5 * erfcc(x / math.sqrt(2))
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def norm_logsf(x):
|
|
53
|
+
try:
|
|
54
|
+
return math.log(1 - norm_cdf(x))
|
|
55
|
+
except ValueError:
|
|
56
|
+
return float('-inf')
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
LOG2 = math.log(2)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class LanguageIndependent(object):
|
|
63
|
+
# These are the language-independent probabilities and parameters
|
|
64
|
+
# given in Gale & Church
|
|
65
|
+
|
|
66
|
+
# for the computation, l_1 is always the language with less characters
|
|
67
|
+
PRIORS = {
|
|
68
|
+
(1, 0): 0.0099,
|
|
69
|
+
(0, 1): 0.0099,
|
|
70
|
+
(1, 1): 0.89,
|
|
71
|
+
(2, 1): 0.089,
|
|
72
|
+
(1, 2): 0.089,
|
|
73
|
+
(2, 2): 0.011,
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
AVERAGE_CHARACTERS = 1
|
|
77
|
+
VARIANCE_CHARACTERS = 6.8
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def trace(backlinks, source_sents_lens, target_sents_lens):
|
|
81
|
+
"""
|
|
82
|
+
Traverse the alignment cost from the tracebacks and retrieves
|
|
83
|
+
appropriate sentence pairs.
|
|
84
|
+
|
|
85
|
+
:param backlinks: A dictionary where the key is the alignment points and value is the cost (referencing the LanguageIndependent.PRIORS)
|
|
86
|
+
:type backlinks: dict
|
|
87
|
+
:param source_sents_lens: A list of target sentences' lengths
|
|
88
|
+
:type source_sents_lens: list(int)
|
|
89
|
+
:param target_sents_lens: A list of target sentences' lengths
|
|
90
|
+
:type target_sents_lens: list(int)
|
|
91
|
+
"""
|
|
92
|
+
links = []
|
|
93
|
+
position = (len(source_sents_lens), len(target_sents_lens))
|
|
94
|
+
while position != (0, 0) and all(p >=0 for p in position):
|
|
95
|
+
try:
|
|
96
|
+
s, t = backlinks[position]
|
|
97
|
+
except TypeError:
|
|
98
|
+
position = (position[0]-1 , position[1]-1)
|
|
99
|
+
continue
|
|
100
|
+
for i in range(s):
|
|
101
|
+
for j in range(t):
|
|
102
|
+
links.append((position[0] - i - 1, position[1] - j - 1))
|
|
103
|
+
position = (position[0] - s, position[1] - t)
|
|
104
|
+
|
|
105
|
+
return links[::-1]
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
def align_log_prob(i, j, source_sents, target_sents, alignment, params):
|
|
109
|
+
"""Returns the log probability of the two sentences C{source_sents[i]}, C{target_sents[j]}
|
|
110
|
+
being aligned with a specific C{alignment}.
|
|
111
|
+
|
|
112
|
+
@param i: The offset of the source sentence.
|
|
113
|
+
@param j: The offset of the target sentence.
|
|
114
|
+
@param source_sents: The list of source sentence lengths.
|
|
115
|
+
@param target_sents: The list of target sentence lengths.
|
|
116
|
+
@param alignment: The alignment type, a tuple of two integers.
|
|
117
|
+
@param params: The sentence alignment parameters.
|
|
118
|
+
|
|
119
|
+
@returns: The log probability of a specific alignment between the two sentences, given the parameters.
|
|
120
|
+
"""
|
|
121
|
+
l_s = sum(source_sents[i - offset - 1] for offset in range(alignment[0]))
|
|
122
|
+
l_t = sum(target_sents[j - offset - 1] for offset in range(alignment[1]))
|
|
123
|
+
try:
|
|
124
|
+
# actually, the paper says l_s * params.VARIANCE_CHARACTERS, this is based on the C
|
|
125
|
+
# reference implementation. With l_s in the denominator, insertions are impossible.
|
|
126
|
+
m = (l_s + l_t / params.AVERAGE_CHARACTERS) / 2
|
|
127
|
+
delta = (l_s * params.AVERAGE_CHARACTERS - l_t) / math.sqrt(m * params.VARIANCE_CHARACTERS)
|
|
128
|
+
except ZeroDivisionError:
|
|
129
|
+
return float('-inf')
|
|
130
|
+
|
|
131
|
+
return - (LOG2 + norm_logsf(abs(delta)) + math.log(params.PRIORS[alignment]))
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def align_blocks(source_sents_lens, target_sents_lens, params = LanguageIndependent):
|
|
135
|
+
"""Return the sentence alignment of two text blocks (usually paragraphs).
|
|
136
|
+
|
|
137
|
+
>>> align_blocks([5,5,5], [7,7,7])
|
|
138
|
+
[(0, 0), (1, 1), (2, 2)]
|
|
139
|
+
>>> align_blocks([10,5,5], [12,20])
|
|
140
|
+
[(0, 0), (1, 1), (2, 1)]
|
|
141
|
+
>>> align_blocks([12,20], [10,5,5])
|
|
142
|
+
[(0, 0), (1, 1), (1, 2)]
|
|
143
|
+
>>> align_blocks([10,2,10,10,2,10], [12,3,20,3,12])
|
|
144
|
+
[(0, 0), (1, 1), (2, 2), (3, 2), (4, 3), (5, 4)]
|
|
145
|
+
|
|
146
|
+
@param source_sents_lens: The list of source sentence lengths.
|
|
147
|
+
@param target_sents_lens: The list of target sentence lengths.
|
|
148
|
+
@param params: the sentence alignment parameters.
|
|
149
|
+
@return: The sentence alignments, a list of index pairs.
|
|
150
|
+
"""
|
|
151
|
+
|
|
152
|
+
alignment_types = list(params.PRIORS.keys())
|
|
153
|
+
|
|
154
|
+
# there are always three rows in the history (with the last of them being filled)
|
|
155
|
+
D = [[]]
|
|
156
|
+
|
|
157
|
+
backlinks = {}
|
|
158
|
+
|
|
159
|
+
for i in range(len(source_sents_lens) + 1):
|
|
160
|
+
for j in range(len(target_sents_lens) + 1):
|
|
161
|
+
min_dist = float('inf')
|
|
162
|
+
min_align = None
|
|
163
|
+
for a in alignment_types:
|
|
164
|
+
prev_i = - 1 - a[0]
|
|
165
|
+
prev_j = j - a[1]
|
|
166
|
+
if prev_i < -len(D) or prev_j < 0:
|
|
167
|
+
continue
|
|
168
|
+
p = D[prev_i][prev_j] + align_log_prob(i, j, source_sents_lens,
|
|
169
|
+
target_sents_lens, a, params)
|
|
170
|
+
if p < min_dist:
|
|
171
|
+
min_dist = p
|
|
172
|
+
min_align = a
|
|
173
|
+
|
|
174
|
+
if min_dist == float('inf'):
|
|
175
|
+
min_dist = 0
|
|
176
|
+
|
|
177
|
+
backlinks[(i, j)] = min_align
|
|
178
|
+
D[-1].append(min_dist)
|
|
179
|
+
|
|
180
|
+
if len(D) > 2:
|
|
181
|
+
D.pop(0)
|
|
182
|
+
D.append([])
|
|
183
|
+
|
|
184
|
+
return trace(backlinks, source_sents_lens, target_sents_lens)
|
|
185
|
+
|
|
186
|
+
|
|
187
|
+
def align_texts(source_blocks, target_blocks, params = LanguageIndependent):
|
|
188
|
+
"""Creates the sentence alignment of two texts.
|
|
189
|
+
|
|
190
|
+
Texts can consist of several blocks. Block boundaries cannot be crossed by sentence
|
|
191
|
+
alignment links.
|
|
192
|
+
|
|
193
|
+
Each block consists of a list that contains the lengths (in characters) of the sentences
|
|
194
|
+
in this block.
|
|
195
|
+
|
|
196
|
+
@param source_blocks: The list of blocks in the source text.
|
|
197
|
+
@param target_blocks: The list of blocks in the target text.
|
|
198
|
+
@param params: the sentence alignment parameters.
|
|
199
|
+
|
|
200
|
+
@returns: A list of sentence alignment lists
|
|
201
|
+
"""
|
|
202
|
+
if len(source_blocks) != len(target_blocks):
|
|
203
|
+
raise ValueError("Source and target texts do not have the same number of blocks.")
|
|
204
|
+
|
|
205
|
+
return [align_blocks(source_block, target_block, params)
|
|
206
|
+
for source_block, target_block in zip(source_blocks, target_blocks)]
|
|
207
|
+
|
|
208
|
+
|
|
209
|
+
# File I/O functions; may belong in a corpus reader
|
|
210
|
+
|
|
211
|
+
def split_at(it, split_value):
|
|
212
|
+
"""Splits an iterator C{it} at values of C{split_value}.
|
|
213
|
+
|
|
214
|
+
Each instance of C{split_value} is swallowed. The iterator produces
|
|
215
|
+
subiterators which need to be consumed fully before the next subiterator
|
|
216
|
+
can be used.
|
|
217
|
+
"""
|
|
218
|
+
def _chunk_iterator(first):
|
|
219
|
+
v = first
|
|
220
|
+
while v != split_value:
|
|
221
|
+
yield v
|
|
222
|
+
v = it.next()
|
|
223
|
+
|
|
224
|
+
while True:
|
|
225
|
+
yield _chunk_iterator(it.next())
|
|
226
|
+
|
|
227
|
+
|
|
228
|
+
def parse_token_stream(stream, soft_delimiter, hard_delimiter):
|
|
229
|
+
"""Parses a stream of tokens and splits it into sentences (using C{soft_delimiter} tokens)
|
|
230
|
+
and blocks (using C{hard_delimiter} tokens) for use with the L{align_texts} function.
|
|
231
|
+
"""
|
|
232
|
+
return [
|
|
233
|
+
[sum(len(token) for token in sentence_it)
|
|
234
|
+
for sentence_it in split_at(block_it, soft_delimiter)]
|
|
235
|
+
for block_it in split_at(stream, hard_delimiter)]
|
|
236
|
+
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
# Code for test files in nltk_contrib/align/data/*.tok
|
|
241
|
+
# import sys
|
|
242
|
+
# from contextlib import nested
|
|
243
|
+
# with nested(open(sys.argv[1], "r"), open(sys.argv[2], "r")) as (s, t):
|
|
244
|
+
# source = parse_token_stream((l.strip() for l in s), ".EOS", ".EOP")
|
|
245
|
+
# target = parse_token_stream((l.strip() for l in t), ".EOS", ".EOP")
|
|
246
|
+
# print align_texts(source, target)
|
|
247
|
+
|
|
248
|
+
|