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,410 +1,414 @@
|
|
|
1
|
-
# Natural Language Toolkit: Ngram Association Measures
|
|
2
|
-
#
|
|
3
|
-
# Copyright (C) 2001-
|
|
4
|
-
# Author: Joel Nothman <jnothman@student.usyd.edu.au>
|
|
5
|
-
# URL: <http://nltk.org>
|
|
6
|
-
# For license information, see LICENSE.TXT
|
|
7
|
-
|
|
8
|
-
"""
|
|
9
|
-
Provides scoring functions for a number of association measures through a
|
|
10
|
-
generic, abstract implementation in ``NgramAssocMeasures``, and n-specific
|
|
11
|
-
``BigramAssocMeasures`` and ``TrigramAssocMeasures``.
|
|
12
|
-
"""
|
|
13
|
-
|
|
14
|
-
from __future__ import division
|
|
15
|
-
import
|
|
16
|
-
from
|
|
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
|
-
|
|
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
|
-
for
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
@
|
|
95
|
-
def
|
|
96
|
-
"""Scores ngrams
|
|
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
|
-
return (n_ii,
|
|
196
|
-
|
|
197
|
-
@staticmethod
|
|
198
|
-
def
|
|
199
|
-
"""Calculates
|
|
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
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
(
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
1
|
+
# Natural Language Toolkit: Ngram Association Measures
|
|
2
|
+
#
|
|
3
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
4
|
+
# Author: Joel Nothman <jnothman@student.usyd.edu.au>
|
|
5
|
+
# URL: <http://nltk.org>
|
|
6
|
+
# For license information, see LICENSE.TXT
|
|
7
|
+
|
|
8
|
+
"""
|
|
9
|
+
Provides scoring functions for a number of association measures through a
|
|
10
|
+
generic, abstract implementation in ``NgramAssocMeasures``, and n-specific
|
|
11
|
+
``BigramAssocMeasures`` and ``TrigramAssocMeasures``.
|
|
12
|
+
"""
|
|
13
|
+
|
|
14
|
+
from __future__ import division
|
|
15
|
+
from abc import ABCMeta, abstractmethod
|
|
16
|
+
from six import add_metaclass
|
|
17
|
+
import math as _math
|
|
18
|
+
from functools import reduce
|
|
19
|
+
_log2 = lambda x: _math.log(x, 2.0)
|
|
20
|
+
_ln = _math.log
|
|
21
|
+
|
|
22
|
+
_product = lambda s: reduce(lambda x, y: x * y, s)
|
|
23
|
+
|
|
24
|
+
_SMALL = 1e-20
|
|
25
|
+
|
|
26
|
+
try:
|
|
27
|
+
from scipy.stats import fisher_exact
|
|
28
|
+
except ImportError:
|
|
29
|
+
def fisher_exact(*_args, **_kwargs):
|
|
30
|
+
raise NotImplementedError
|
|
31
|
+
|
|
32
|
+
### Indices to marginals arguments:
|
|
33
|
+
|
|
34
|
+
NGRAM = 0
|
|
35
|
+
"""Marginals index for the ngram count"""
|
|
36
|
+
|
|
37
|
+
UNIGRAMS = -2
|
|
38
|
+
"""Marginals index for a tuple of each unigram count"""
|
|
39
|
+
|
|
40
|
+
TOTAL = -1
|
|
41
|
+
"""Marginals index for the number of words in the data"""
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@add_metaclass(ABCMeta)
|
|
45
|
+
class NgramAssocMeasures(object):
|
|
46
|
+
"""
|
|
47
|
+
An abstract class defining a collection of generic association measures.
|
|
48
|
+
Each public method returns a score, taking the following arguments::
|
|
49
|
+
|
|
50
|
+
score_fn(count_of_ngram,
|
|
51
|
+
(count_of_n-1gram_1, ..., count_of_n-1gram_j),
|
|
52
|
+
(count_of_n-2gram_1, ..., count_of_n-2gram_k),
|
|
53
|
+
...,
|
|
54
|
+
(count_of_1gram_1, ..., count_of_1gram_n),
|
|
55
|
+
count_of_total_words)
|
|
56
|
+
|
|
57
|
+
See ``BigramAssocMeasures`` and ``TrigramAssocMeasures``
|
|
58
|
+
|
|
59
|
+
Inheriting classes should define a property _n, and a method _contingency
|
|
60
|
+
which calculates contingency values from marginals in order for all
|
|
61
|
+
association measures defined here to be usable.
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
_n = 0
|
|
65
|
+
|
|
66
|
+
@staticmethod
|
|
67
|
+
@abstractmethod
|
|
68
|
+
def _contingency(*marginals):
|
|
69
|
+
"""Calculates values of a contingency table from marginal values."""
|
|
70
|
+
raise NotImplementedError("The contingency table is not available"
|
|
71
|
+
"in the general ngram case")
|
|
72
|
+
|
|
73
|
+
@staticmethod
|
|
74
|
+
@abstractmethod
|
|
75
|
+
def _marginals(*contingency):
|
|
76
|
+
"""Calculates values of contingency table marginals from its values."""
|
|
77
|
+
raise NotImplementedError("The contingency table is not available"
|
|
78
|
+
"in the general ngram case")
|
|
79
|
+
|
|
80
|
+
@classmethod
|
|
81
|
+
def _expected_values(cls, cont):
|
|
82
|
+
"""Calculates expected values for a contingency table."""
|
|
83
|
+
n_all = sum(cont)
|
|
84
|
+
bits = [1 << i for i in range(cls._n)]
|
|
85
|
+
|
|
86
|
+
# For each contingency table cell
|
|
87
|
+
for i in range(len(cont)):
|
|
88
|
+
# Yield the expected value
|
|
89
|
+
yield (_product(sum(cont[x] for x in range(2 ** cls._n)
|
|
90
|
+
if (x & j) == (i & j))
|
|
91
|
+
for j in bits) /
|
|
92
|
+
(n_all ** (cls._n - 1)))
|
|
93
|
+
|
|
94
|
+
@staticmethod
|
|
95
|
+
def raw_freq(*marginals):
|
|
96
|
+
"""Scores ngrams by their frequency"""
|
|
97
|
+
return marginals[NGRAM] / marginals[TOTAL]
|
|
98
|
+
|
|
99
|
+
@classmethod
|
|
100
|
+
def student_t(cls, *marginals):
|
|
101
|
+
"""Scores ngrams using Student's t test with independence hypothesis
|
|
102
|
+
for unigrams, as in Manning and Schutze 5.3.1.
|
|
103
|
+
"""
|
|
104
|
+
return ((marginals[NGRAM] -
|
|
105
|
+
_product(marginals[UNIGRAMS]) /
|
|
106
|
+
(marginals[TOTAL] ** (cls._n - 1))) /
|
|
107
|
+
(marginals[NGRAM] + _SMALL) ** .5)
|
|
108
|
+
|
|
109
|
+
@classmethod
|
|
110
|
+
def chi_sq(cls, *marginals):
|
|
111
|
+
"""Scores ngrams using Pearson's chi-square as in Manning and Schutze
|
|
112
|
+
5.3.3.
|
|
113
|
+
"""
|
|
114
|
+
cont = cls._contingency(*marginals)
|
|
115
|
+
exps = cls._expected_values(cont)
|
|
116
|
+
return sum((obs - exp) ** 2 / (exp + _SMALL)
|
|
117
|
+
for obs, exp in zip(cont, exps))
|
|
118
|
+
|
|
119
|
+
@staticmethod
|
|
120
|
+
def mi_like(*marginals, **kwargs):
|
|
121
|
+
"""Scores ngrams using a variant of mutual information. The keyword
|
|
122
|
+
argument power sets an exponent (default 3) for the numerator. No
|
|
123
|
+
logarithm of the result is calculated.
|
|
124
|
+
"""
|
|
125
|
+
return (marginals[NGRAM] ** kwargs.get('power', 3) /
|
|
126
|
+
_product(marginals[UNIGRAMS]))
|
|
127
|
+
|
|
128
|
+
@classmethod
|
|
129
|
+
def pmi(cls, *marginals):
|
|
130
|
+
"""Scores ngrams by pointwise mutual information, as in Manning and
|
|
131
|
+
Schutze 5.4.
|
|
132
|
+
"""
|
|
133
|
+
return (_log2(marginals[NGRAM] * marginals[TOTAL] ** (cls._n - 1)) -
|
|
134
|
+
_log2(_product(marginals[UNIGRAMS])))
|
|
135
|
+
|
|
136
|
+
@classmethod
|
|
137
|
+
def likelihood_ratio(cls, *marginals):
|
|
138
|
+
"""Scores ngrams using likelihood ratios as in Manning and Schutze 5.3.4.
|
|
139
|
+
"""
|
|
140
|
+
cont = cls._contingency(*marginals)
|
|
141
|
+
return (cls._n *
|
|
142
|
+
sum(obs * _ln(obs / (exp + _SMALL) + _SMALL)
|
|
143
|
+
for obs, exp in zip(cont, cls._expected_values(cont))))
|
|
144
|
+
|
|
145
|
+
@classmethod
|
|
146
|
+
def poisson_stirling(cls, *marginals):
|
|
147
|
+
"""Scores ngrams using the Poisson-Stirling measure."""
|
|
148
|
+
exp = (_product(marginals[UNIGRAMS]) /
|
|
149
|
+
(marginals[TOTAL] ** (cls._n - 1)))
|
|
150
|
+
return marginals[NGRAM] * (_log2(marginals[NGRAM] / exp) - 1)
|
|
151
|
+
|
|
152
|
+
@classmethod
|
|
153
|
+
def jaccard(cls, *marginals):
|
|
154
|
+
"""Scores ngrams using the Jaccard index."""
|
|
155
|
+
cont = cls._contingency(*marginals)
|
|
156
|
+
return cont[0] / sum(cont[:-1])
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
class BigramAssocMeasures(NgramAssocMeasures):
|
|
160
|
+
"""
|
|
161
|
+
A collection of bigram association measures. Each association measure
|
|
162
|
+
is provided as a function with three arguments::
|
|
163
|
+
|
|
164
|
+
bigram_score_fn(n_ii, (n_ix, n_xi), n_xx)
|
|
165
|
+
|
|
166
|
+
The arguments constitute the marginals of a contingency table, counting
|
|
167
|
+
the occurrences of particular events in a corpus. The letter i in the
|
|
168
|
+
suffix refers to the appearance of the word in question, while x indicates
|
|
169
|
+
the appearance of any word. Thus, for example:
|
|
170
|
+
|
|
171
|
+
n_ii counts (w1, w2), i.e. the bigram being scored
|
|
172
|
+
n_ix counts (w1, *)
|
|
173
|
+
n_xi counts (*, w2)
|
|
174
|
+
n_xx counts (*, *), i.e. any bigram
|
|
175
|
+
|
|
176
|
+
This may be shown with respect to a contingency table::
|
|
177
|
+
|
|
178
|
+
w1 ~w1
|
|
179
|
+
------ ------
|
|
180
|
+
w2 | n_ii | n_oi | = n_xi
|
|
181
|
+
------ ------
|
|
182
|
+
~w2 | n_io | n_oo |
|
|
183
|
+
------ ------
|
|
184
|
+
= n_ix TOTAL = n_xx
|
|
185
|
+
"""
|
|
186
|
+
|
|
187
|
+
_n = 2
|
|
188
|
+
|
|
189
|
+
@staticmethod
|
|
190
|
+
def _contingency(n_ii, n_ix_xi_tuple, n_xx):
|
|
191
|
+
"""Calculates values of a bigram contingency table from marginal values."""
|
|
192
|
+
(n_ix, n_xi) = n_ix_xi_tuple
|
|
193
|
+
n_oi = n_xi - n_ii
|
|
194
|
+
n_io = n_ix - n_ii
|
|
195
|
+
return (n_ii, n_oi, n_io, n_xx - n_ii - n_oi - n_io)
|
|
196
|
+
|
|
197
|
+
@staticmethod
|
|
198
|
+
def _marginals(n_ii, n_oi, n_io, n_oo):
|
|
199
|
+
"""Calculates values of contingency table marginals from its values."""
|
|
200
|
+
return (n_ii, (n_oi + n_ii, n_io + n_ii), n_oo + n_oi + n_io + n_ii)
|
|
201
|
+
|
|
202
|
+
@staticmethod
|
|
203
|
+
def _expected_values(cont):
|
|
204
|
+
"""Calculates expected values for a contingency table."""
|
|
205
|
+
n_xx = sum(cont)
|
|
206
|
+
# For each contingency table cell
|
|
207
|
+
for i in range(4):
|
|
208
|
+
yield (cont[i] + cont[i ^ 1]) * (cont[i] + cont[i ^ 2]) / n_xx
|
|
209
|
+
|
|
210
|
+
@classmethod
|
|
211
|
+
def phi_sq(cls, *marginals):
|
|
212
|
+
"""Scores bigrams using phi-square, the square of the Pearson correlation
|
|
213
|
+
coefficient.
|
|
214
|
+
"""
|
|
215
|
+
n_ii, n_io, n_oi, n_oo = cls._contingency(*marginals)
|
|
216
|
+
|
|
217
|
+
return ((n_ii*n_oo - n_io*n_oi)**2 /
|
|
218
|
+
((n_ii + n_io) * (n_ii + n_oi) * (n_io + n_oo) * (n_oi + n_oo)))
|
|
219
|
+
|
|
220
|
+
@classmethod
|
|
221
|
+
def chi_sq(cls, n_ii, n_ix_xi_tuple, n_xx):
|
|
222
|
+
"""Scores bigrams using chi-square, i.e. phi-sq multiplied by the number
|
|
223
|
+
of bigrams, as in Manning and Schutze 5.3.3.
|
|
224
|
+
"""
|
|
225
|
+
(n_ix, n_xi) = n_ix_xi_tuple
|
|
226
|
+
return n_xx * cls.phi_sq(n_ii, (n_ix, n_xi), n_xx)
|
|
227
|
+
|
|
228
|
+
@classmethod
|
|
229
|
+
def fisher(cls, *marginals):
|
|
230
|
+
"""Scores bigrams using Fisher's Exact Test (Pedersen 1996). Less
|
|
231
|
+
sensitive to small counts than PMI or Chi Sq, but also more expensive
|
|
232
|
+
to compute. Requires scipy.
|
|
233
|
+
"""
|
|
234
|
+
|
|
235
|
+
n_ii, n_io, n_oi, n_oo = cls._contingency(*marginals)
|
|
236
|
+
|
|
237
|
+
(odds, pvalue) = fisher_exact([[n_ii, n_io], [n_oi, n_oo]], alternative='less')
|
|
238
|
+
return pvalue
|
|
239
|
+
|
|
240
|
+
@staticmethod
|
|
241
|
+
def dice(n_ii, n_ix_xi_tuple, n_xx):
|
|
242
|
+
"""Scores bigrams using Dice's coefficient."""
|
|
243
|
+
(n_ix, n_xi) = n_ix_xi_tuple
|
|
244
|
+
return 2 * n_ii / (n_ix + n_xi)
|
|
245
|
+
|
|
246
|
+
|
|
247
|
+
class TrigramAssocMeasures(NgramAssocMeasures):
|
|
248
|
+
"""
|
|
249
|
+
A collection of trigram association measures. Each association measure
|
|
250
|
+
is provided as a function with four arguments::
|
|
251
|
+
|
|
252
|
+
trigram_score_fn(n_iii,
|
|
253
|
+
(n_iix, n_ixi, n_xii),
|
|
254
|
+
(n_ixx, n_xix, n_xxi),
|
|
255
|
+
n_xxx)
|
|
256
|
+
|
|
257
|
+
The arguments constitute the marginals of a contingency table, counting
|
|
258
|
+
the occurrences of particular events in a corpus. The letter i in the
|
|
259
|
+
suffix refers to the appearance of the word in question, while x indicates
|
|
260
|
+
the appearance of any word. Thus, for example:
|
|
261
|
+
n_iii counts (w1, w2, w3), i.e. the trigram being scored
|
|
262
|
+
n_ixx counts (w1, *, *)
|
|
263
|
+
n_xxx counts (*, *, *), i.e. any trigram
|
|
264
|
+
"""
|
|
265
|
+
|
|
266
|
+
_n = 3
|
|
267
|
+
|
|
268
|
+
@staticmethod
|
|
269
|
+
def _contingency(n_iii, n_iix_tuple, n_ixx_tuple, n_xxx):
|
|
270
|
+
"""Calculates values of a trigram contingency table (or cube) from
|
|
271
|
+
marginal values.
|
|
272
|
+
>>> TrigramAssocMeasures._contingency(1, (1, 1, 1), (1, 73, 1), 2000)
|
|
273
|
+
(1, 0, 0, 0, 0, 72, 0, 1927)
|
|
274
|
+
"""
|
|
275
|
+
(n_iix, n_ixi, n_xii) = n_iix_tuple
|
|
276
|
+
(n_ixx, n_xix, n_xxi) = n_ixx_tuple
|
|
277
|
+
n_oii = n_xii - n_iii
|
|
278
|
+
n_ioi = n_ixi - n_iii
|
|
279
|
+
n_iio = n_iix - n_iii
|
|
280
|
+
n_ooi = n_xxi - n_iii - n_oii - n_ioi
|
|
281
|
+
n_oio = n_xix - n_iii - n_oii - n_iio
|
|
282
|
+
n_ioo = n_ixx - n_iii - n_ioi - n_iio
|
|
283
|
+
n_ooo = n_xxx - n_iii - n_oii - n_ioi - n_iio - n_ooi - n_oio - n_ioo
|
|
284
|
+
|
|
285
|
+
return (n_iii, n_oii, n_ioi, n_ooi,
|
|
286
|
+
n_iio, n_oio, n_ioo, n_ooo)
|
|
287
|
+
|
|
288
|
+
@staticmethod
|
|
289
|
+
def _marginals(*contingency):
|
|
290
|
+
"""Calculates values of contingency table marginals from its values.
|
|
291
|
+
>>> TrigramAssocMeasures._marginals(1, 0, 0, 0, 0, 72, 0, 1927)
|
|
292
|
+
(1, (1, 1, 1), (1, 73, 1), 2000)
|
|
293
|
+
"""
|
|
294
|
+
n_iii, n_oii, n_ioi, n_ooi, n_iio, n_oio, n_ioo, n_ooo = contingency
|
|
295
|
+
return (n_iii,
|
|
296
|
+
(n_iii + n_iio, n_iii + n_ioi, n_iii + n_oii),
|
|
297
|
+
(n_iii + n_ioi + n_iio + n_ioo,
|
|
298
|
+
n_iii + n_oii + n_iio + n_oio,
|
|
299
|
+
n_iii + n_oii + n_ioi + n_ooi),
|
|
300
|
+
sum(contingency))
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
class QuadgramAssocMeasures(NgramAssocMeasures):
|
|
304
|
+
"""
|
|
305
|
+
A collection of quadgram association measures. Each association measure
|
|
306
|
+
is provided as a function with five arguments::
|
|
307
|
+
|
|
308
|
+
trigram_score_fn(n_iiii,
|
|
309
|
+
(n_iiix, n_iixi, n_ixii, n_xiii),
|
|
310
|
+
(n_iixx, n_ixix, n_ixxi, n_xixi, n_xxii, n_xiix),
|
|
311
|
+
(n_ixxx, n_xixx, n_xxix, n_xxxi),
|
|
312
|
+
n_all)
|
|
313
|
+
|
|
314
|
+
The arguments constitute the marginals of a contingency table, counting
|
|
315
|
+
the occurrences of particular events in a corpus. The letter i in the
|
|
316
|
+
suffix refers to the appearance of the word in question, while x indicates
|
|
317
|
+
the appearance of any word. Thus, for example:
|
|
318
|
+
n_iiii counts (w1, w2, w3, w4), i.e. the quadgram being scored
|
|
319
|
+
n_ixxi counts (w1, *, *, w4)
|
|
320
|
+
n_xxxx counts (*, *, *, *), i.e. any quadgram
|
|
321
|
+
"""
|
|
322
|
+
|
|
323
|
+
_n = 4
|
|
324
|
+
|
|
325
|
+
@staticmethod
|
|
326
|
+
def _contingency(n_iiii, n_iiix_tuple, n_iixx_tuple, n_ixxx_tuple, n_xxxx):
|
|
327
|
+
"""Calculates values of a quadgram contingency table from
|
|
328
|
+
marginal values.
|
|
329
|
+
"""
|
|
330
|
+
(n_iiix, n_iixi, n_ixii, n_xiii) = n_iiix_tuple
|
|
331
|
+
(n_iixx, n_ixix, n_ixxi, n_xixi, n_xxii, n_xiix) = n_iixx_tuple
|
|
332
|
+
(n_ixxx, n_xixx, n_xxix, n_xxxi) = n_ixxx_tuple
|
|
333
|
+
n_oiii = n_xiii - n_iiii
|
|
334
|
+
n_ioii = n_ixii - n_iiii
|
|
335
|
+
n_iioi = n_iixi - n_iiii
|
|
336
|
+
n_ooii = n_xxii - n_iiii - n_oiii - n_ioii
|
|
337
|
+
n_oioi = n_xixi - n_iiii - n_oiii - n_iioi
|
|
338
|
+
n_iooi = n_ixxi - n_iiii - n_ioii - n_iioi
|
|
339
|
+
n_oooi = n_xxxi - n_iiii - n_oiii - n_ioii - n_iioi - n_ooii - n_iooi - n_oioi
|
|
340
|
+
n_iiio = n_iiix - n_iiii
|
|
341
|
+
n_oiio = n_xiix - n_iiii - n_oiii - n_iiio
|
|
342
|
+
n_ioio = n_ixix - n_iiii - n_ioii - n_iiio
|
|
343
|
+
n_ooio = n_xxix - n_iiii - n_oiii - n_ioii - n_iiio - n_ooii - n_ioio - n_oiio
|
|
344
|
+
n_iioo = n_iixx - n_iiii - n_iioi - n_iiio
|
|
345
|
+
n_oioo = n_xixx - n_iiii - n_oiii - n_iioi - n_iiio - n_oioi - n_oiio - n_iioo
|
|
346
|
+
n_iooo = n_ixxx - n_iiii - n_ioii - n_iioi - n_iiio - n_iooi - n_iioo - n_ioio
|
|
347
|
+
n_oooo = n_xxxx - n_iiii - n_oiii - n_ioii - n_iioi - n_ooii - n_oioi - n_iooi - \
|
|
348
|
+
n_oooi - n_iiio - n_oiio - n_ioio - n_ooio - n_iioo - n_oioo - n_iooo
|
|
349
|
+
|
|
350
|
+
return (n_iiii, n_oiii, n_ioii, n_ooii, n_iioi,
|
|
351
|
+
n_oioi, n_iooi, n_oooi, n_iiio, n_oiio,
|
|
352
|
+
n_ioio, n_ooio, n_iioo, n_oioo, n_iooo, n_oooo)
|
|
353
|
+
|
|
354
|
+
@staticmethod
|
|
355
|
+
def _marginals(*contingency):
|
|
356
|
+
"""Calculates values of contingency table marginals from its values.
|
|
357
|
+
QuadgramAssocMeasures._marginals(1, 0, 2, 46, 552, 825, 2577, 34967, 1, 0, 2, 48, 7250, 9031, 28585, 356653)
|
|
358
|
+
(1, (2, 553, 3, 1), (7804, 6, 3132, 1378, 49, 2), (38970, 17660, 100, 38970), 440540)
|
|
359
|
+
"""
|
|
360
|
+
n_iiii, n_oiii, n_ioii, n_ooii, n_iioi, n_oioi, n_iooi, n_oooi, n_iiio, n_oiio, n_ioio, n_ooio, \
|
|
361
|
+
n_iioo, n_oioo, n_iooo, n_oooo = contingency
|
|
362
|
+
|
|
363
|
+
n_iiix = n_iiii + n_iiio
|
|
364
|
+
n_iixi = n_iiii + n_iioi
|
|
365
|
+
n_ixii = n_iiii + n_ioii
|
|
366
|
+
n_xiii = n_iiii + n_oiii
|
|
367
|
+
|
|
368
|
+
n_iixx = n_iiii + n_iioi + n_iiio + n_iioo
|
|
369
|
+
n_ixix = n_iiii + n_ioii + n_iiio + n_ioio
|
|
370
|
+
n_ixxi = n_iiii + n_ioii + n_iioi + n_iooi
|
|
371
|
+
n_xixi = n_iiii + n_oiii + n_iioi + n_oioi
|
|
372
|
+
n_xxii = n_iiii + n_oiii + n_ioii + n_ooii
|
|
373
|
+
n_xiix = n_iiii + n_oiii + n_iiio + n_oiio
|
|
374
|
+
|
|
375
|
+
n_ixxx = n_iiii + n_ioii + n_iioi + n_iiio + n_iooi + n_iioo + n_ioio + n_iooo
|
|
376
|
+
n_xixx = n_iiii + n_oiii + n_iioi + n_iiio + n_oioi + n_oiio + n_iioo + n_oioo
|
|
377
|
+
n_xxix = n_iiii + n_oiii + n_ioii + n_iiio + n_ooii + n_ioio + n_oiio + n_ooio
|
|
378
|
+
n_xxxi = n_iiii + n_oiii + n_ioii + n_iioi + n_ooii + n_iooi + n_oioi + n_oooi
|
|
379
|
+
|
|
380
|
+
n_all = sum(contingency)
|
|
381
|
+
|
|
382
|
+
return (n_iiii,
|
|
383
|
+
(n_iiix, n_iixi, n_ixii, n_xiii),
|
|
384
|
+
(n_iixx, n_ixix, n_ixxi, n_xixi, n_xxii, n_xiix),
|
|
385
|
+
(n_ixxx, n_xixx, n_xxix, n_xxxi),
|
|
386
|
+
n_all)
|
|
387
|
+
|
|
388
|
+
|
|
389
|
+
class ContingencyMeasures(object):
|
|
390
|
+
"""Wraps NgramAssocMeasures classes such that the arguments of association
|
|
391
|
+
measures are contingency table values rather than marginals.
|
|
392
|
+
"""
|
|
393
|
+
|
|
394
|
+
def __init__(self, measures):
|
|
395
|
+
"""Constructs a ContingencyMeasures given a NgramAssocMeasures class"""
|
|
396
|
+
self.__class__.__name__ = 'Contingency' + measures.__class__.__name__
|
|
397
|
+
for k in dir(measures):
|
|
398
|
+
if k.startswith('__'):
|
|
399
|
+
continue
|
|
400
|
+
v = getattr(measures, k)
|
|
401
|
+
if not k.startswith('_'):
|
|
402
|
+
v = self._make_contingency_fn(measures, v)
|
|
403
|
+
setattr(self, k, v)
|
|
404
|
+
|
|
405
|
+
@staticmethod
|
|
406
|
+
def _make_contingency_fn(measures, old_fn):
|
|
407
|
+
"""From an association measure function, produces a new function which
|
|
408
|
+
accepts contingency table values as its arguments.
|
|
409
|
+
"""
|
|
410
|
+
def res(*contingency):
|
|
411
|
+
return old_fn(*measures._marginals(*contingency))
|
|
412
|
+
res.__doc__ = old_fn.__doc__
|
|
413
|
+
res.__name__ = old_fn.__name__
|
|
414
|
+
return res
|