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.
Files changed (406) hide show
  1. {nltk-3.2 → nltk-3.3}/INSTALL.txt +6 -6
  2. {nltk-3.2 → nltk-3.3}/LICENSE.txt +13 -13
  3. {nltk-3.2 → nltk-3.3}/MANIFEST.in +6 -6
  4. {nltk-3.2/nltk.egg-info → nltk-3.3}/PKG-INFO +13 -5
  5. nltk-3.2/README.txt → nltk-3.3/README.md +49 -48
  6. nltk-3.3/nltk/VERSION +1 -0
  7. {nltk-3.2 → nltk-3.3}/nltk/__init__.py +185 -185
  8. {nltk-3.2 → nltk-3.3}/nltk/app/__init__.py +52 -53
  9. {nltk-3.2 → nltk-3.3}/nltk/app/chartparser_app.py +2276 -2276
  10. {nltk-3.2 → nltk-3.3}/nltk/app/chunkparser_app.py +1262 -1264
  11. {nltk-3.2 → nltk-3.3}/nltk/app/collocations_app.py +347 -350
  12. {nltk-3.2 → nltk-3.3}/nltk/app/concordance_app.py +568 -570
  13. {nltk-3.2 → nltk-3.3}/nltk/app/nemo_app.py +156 -155
  14. {nltk-3.2 → nltk-3.3}/nltk/app/rdparser_app.py +892 -894
  15. {nltk-3.2 → nltk-3.3}/nltk/app/srparser_app.py +809 -809
  16. {nltk-3.2 → nltk-3.3}/nltk/app/wordfreq_app.py +32 -32
  17. {nltk-3.2 → nltk-3.3}/nltk/app/wordnet_app.py +968 -968
  18. {nltk-3.2 → nltk-3.3}/nltk/book.py +91 -90
  19. {nltk-3.2 → nltk-3.3}/nltk/ccg/__init__.py +22 -22
  20. {nltk-3.2 → nltk-3.3}/nltk/ccg/api.py +359 -335
  21. {nltk-3.2 → nltk-3.3}/nltk/ccg/chart.py +394 -361
  22. {nltk-3.2 → nltk-3.3}/nltk/ccg/combinator.py +343 -312
  23. {nltk-3.2 → nltk-3.3}/nltk/ccg/lexicon.py +328 -290
  24. nltk-3.3/nltk/ccg/logic.py +46 -0
  25. {nltk-3.2 → nltk-3.3}/nltk/chat/__init__.py +49 -49
  26. {nltk-3.2 → nltk-3.3}/nltk/chat/eliza.py +244 -244
  27. {nltk-3.2 → nltk-3.3}/nltk/chat/iesha.py +140 -140
  28. {nltk-3.2 → nltk-3.3}/nltk/chat/rude.py +92 -92
  29. {nltk-3.2 → nltk-3.3}/nltk/chat/suntsu.py +117 -117
  30. {nltk-3.2 → nltk-3.3}/nltk/chat/util.py +122 -120
  31. {nltk-3.2 → nltk-3.3}/nltk/chat/zen.py +282 -282
  32. {nltk-3.2 → nltk-3.3}/nltk/chunk/__init__.py +190 -190
  33. {nltk-3.2 → nltk-3.3}/nltk/chunk/api.py +51 -51
  34. {nltk-3.2 → nltk-3.3}/nltk/chunk/named_entity.py +331 -331
  35. {nltk-3.2 → nltk-3.3}/nltk/chunk/regexp.py +1390 -1384
  36. {nltk-3.2 → nltk-3.3}/nltk/chunk/util.py +600 -600
  37. {nltk-3.2 → nltk-3.3}/nltk/classify/__init__.py +98 -98
  38. {nltk-3.2 → nltk-3.3}/nltk/classify/api.py +193 -193
  39. {nltk-3.2 → nltk-3.3}/nltk/classify/decisiontree.py +295 -295
  40. {nltk-3.2 → nltk-3.3}/nltk/classify/maxent.py +1510 -1492
  41. {nltk-3.2 → nltk-3.3}/nltk/classify/megam.py +179 -178
  42. {nltk-3.2 → nltk-3.3}/nltk/classify/naivebayes.py +245 -242
  43. {nltk-3.2 → nltk-3.3}/nltk/classify/positivenaivebayes.py +170 -170
  44. {nltk-3.2 → nltk-3.3}/nltk/classify/rte_classify.py +160 -191
  45. {nltk-3.2 → nltk-3.3}/nltk/classify/scikitlearn.py +153 -151
  46. {nltk-3.2 → nltk-3.3}/nltk/classify/senna.py +183 -181
  47. {nltk-3.2 → nltk-3.3}/nltk/classify/svm.py +15 -15
  48. {nltk-3.2 → nltk-3.3}/nltk/classify/tadm.py +113 -112
  49. {nltk-3.2 → nltk-3.3}/nltk/classify/textcat.py +193 -193
  50. {nltk-3.2 → nltk-3.3}/nltk/classify/util.py +324 -312
  51. {nltk-3.2 → nltk-3.3}/nltk/classify/weka.py +346 -345
  52. {nltk-3.2 → nltk-3.3}/nltk/cluster/__init__.py +86 -86
  53. {nltk-3.2 → nltk-3.3}/nltk/cluster/api.py +74 -70
  54. {nltk-3.2 → nltk-3.3}/nltk/cluster/em.py +247 -247
  55. {nltk-3.2 → nltk-3.3}/nltk/cluster/gaac.py +168 -168
  56. {nltk-3.2 → nltk-3.3}/nltk/cluster/kmeans.py +221 -221
  57. {nltk-3.2 → nltk-3.3}/nltk/cluster/util.py +304 -289
  58. nltk-3.3/nltk/collections.py +640 -0
  59. {nltk-3.2 → nltk-3.3}/nltk/collocations.py +388 -388
  60. nltk-3.3/nltk/compat.py +365 -0
  61. {nltk-3.2 → nltk-3.3}/nltk/corpus/__init__.py +341 -320
  62. {nltk-3.2 → nltk-3.3}/nltk/corpus/europarl_raw.py +44 -44
  63. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/__init__.py +147 -145
  64. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/aligned.py +115 -114
  65. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/api.py +448 -446
  66. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/bnc.py +252 -252
  67. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/bracket_parse.py +227 -227
  68. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/categorized_sents.py +179 -178
  69. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/chasen.py +140 -139
  70. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/childes.py +522 -494
  71. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/chunked.py +212 -212
  72. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/cmudict.py +97 -95
  73. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/comparative_sents.py +280 -278
  74. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/conll.py +528 -521
  75. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/crubadan.py +116 -116
  76. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/dependency.py +101 -101
  77. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/framenet.py +3059 -2093
  78. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/ieer.py +112 -111
  79. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/indian.py +85 -86
  80. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/ipipan.py +332 -331
  81. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/knbc.py +187 -187
  82. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/lin.py +156 -156
  83. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/mte.py +311 -310
  84. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/nkjp.py +429 -428
  85. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/nombank.py +421 -421
  86. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/nps_chat.py +73 -73
  87. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/opinion_lexicon.py +115 -115
  88. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/panlex_lite.py +165 -165
  89. nltk-3.3/nltk/corpus/reader/pl196x.py +292 -0
  90. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/plaintext.py +232 -233
  91. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/ppattach.py +96 -95
  92. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/propbank.py +479 -481
  93. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/pros_cons.py +128 -126
  94. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/reviews.py +330 -328
  95. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/rte.py +144 -146
  96. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/semcor.py +256 -256
  97. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/senseval.py +203 -201
  98. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/sentiwordnet.py +137 -137
  99. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/sinica_treebank.py +75 -75
  100. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/string_category.py +60 -59
  101. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/switchboard.py +119 -119
  102. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/tagged.py +295 -294
  103. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/timit.py +452 -450
  104. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/toolbox.py +68 -68
  105. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/twitter.py +155 -157
  106. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/udhr.py +80 -80
  107. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/util.py +804 -800
  108. nltk-3.3/nltk/corpus/reader/verbnet.py +595 -0
  109. nltk-3.3/nltk/corpus/reader/wordlist.py +134 -0
  110. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/wordnet.py +2108 -2036
  111. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/xmldocs.py +392 -387
  112. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/ycoe.py +243 -242
  113. {nltk-3.2 → nltk-3.3}/nltk/corpus/util.py +144 -127
  114. {nltk-3.2 → nltk-3.3}/nltk/data.py +1487 -1451
  115. {nltk-3.2 → nltk-3.3}/nltk/decorators.py +219 -215
  116. {nltk-3.2 → nltk-3.3}/nltk/downloader.py +2278 -2274
  117. {nltk-3.2 → nltk-3.3}/nltk/draw/__init__.py +27 -27
  118. {nltk-3.2 → nltk-3.3}/nltk/draw/cfg.py +774 -777
  119. {nltk-3.2 → nltk-3.3}/nltk/draw/dispersion.py +58 -58
  120. {nltk-3.2 → nltk-3.3}/nltk/draw/table.py +1098 -1098
  121. {nltk-3.2 → nltk-3.3}/nltk/draw/tree.py +963 -966
  122. {nltk-3.2 → nltk-3.3}/nltk/draw/util.py +2356 -2356
  123. {nltk-3.2 → nltk-3.3}/nltk/featstruct.py +2617 -2500
  124. {nltk-3.2 → nltk-3.3}/nltk/grammar.py +1559 -1516
  125. {nltk-3.2 → nltk-3.3}/nltk/help.py +56 -56
  126. {nltk-3.2 → nltk-3.3}/nltk/inference/__init__.py +20 -20
  127. {nltk-3.2 → nltk-3.3}/nltk/inference/api.py +597 -589
  128. {nltk-3.2 → nltk-3.3}/nltk/inference/discourse.py +612 -608
  129. {nltk-3.2 → nltk-3.3}/nltk/inference/mace.py +311 -311
  130. {nltk-3.2 → nltk-3.3}/nltk/inference/nonmonotonic.py +509 -509
  131. {nltk-3.2 → nltk-3.3}/nltk/inference/prover9.py +431 -431
  132. {nltk-3.2 → nltk-3.3}/nltk/inference/resolution.py +687 -687
  133. {nltk-3.2 → nltk-3.3}/nltk/inference/tableau.py +607 -607
  134. {nltk-3.2 → nltk-3.3}/nltk/internals.py +982 -982
  135. {nltk-3.2 → nltk-3.3}/nltk/jsontags.py +63 -63
  136. {nltk-3.2 → nltk-3.3}/nltk/lazyimport.py +142 -142
  137. {nltk-3.2 → nltk-3.3}/nltk/metrics/__init__.py +30 -29
  138. {nltk-3.2 → nltk-3.3}/nltk/metrics/agreement.py +421 -401
  139. nltk-3.3/nltk/metrics/aline.py +607 -0
  140. {nltk-3.2 → nltk-3.3}/nltk/metrics/association.py +414 -410
  141. {nltk-3.2 → nltk-3.3}/nltk/metrics/confusionmatrix.py +206 -206
  142. {nltk-3.2 → nltk-3.3}/nltk/metrics/distance.py +207 -202
  143. {nltk-3.2 → nltk-3.3}/nltk/metrics/paice.py +381 -381
  144. {nltk-3.2 → nltk-3.3}/nltk/metrics/scores.py +228 -228
  145. {nltk-3.2 → nltk-3.3}/nltk/metrics/segmentation.py +231 -232
  146. {nltk-3.2 → nltk-3.3}/nltk/metrics/spearman.py +69 -69
  147. {nltk-3.2 → nltk-3.3}/nltk/misc/__init__.py +11 -11
  148. {nltk-3.2 → nltk-3.3}/nltk/misc/babelfish.py +10 -10
  149. {nltk-3.2 → nltk-3.3}/nltk/misc/chomsky.py +135 -133
  150. {nltk-3.2 → nltk-3.3}/nltk/misc/minimalset.py +83 -83
  151. {nltk-3.2 → nltk-3.3}/nltk/misc/sort.py +157 -157
  152. {nltk-3.2 → nltk-3.3}/nltk/misc/wordfinder.py +129 -129
  153. {nltk-3.2 → nltk-3.3}/nltk/parse/__init__.py +81 -80
  154. {nltk-3.2 → nltk-3.3}/nltk/parse/api.py +66 -66
  155. {nltk-3.2 → nltk-3.3}/nltk/parse/bllip.py +282 -282
  156. {nltk-3.2 → nltk-3.3}/nltk/parse/chart.py +1682 -1681
  157. nltk-3.3/nltk/parse/corenlp.py +780 -0
  158. {nltk-3.2 → nltk-3.3}/nltk/parse/dependencygraph.py +760 -758
  159. {nltk-3.2 → nltk-3.3}/nltk/parse/earleychart.py +452 -451
  160. {nltk-3.2 → nltk-3.3}/nltk/parse/evaluate.py +129 -129
  161. {nltk-3.2 → nltk-3.3}/nltk/parse/featurechart.py +580 -578
  162. {nltk-3.2 → nltk-3.3}/nltk/parse/generate.py +87 -76
  163. {nltk-3.2 → nltk-3.3}/nltk/parse/malt.py +356 -356
  164. {nltk-3.2 → nltk-3.3}/nltk/parse/nonprojectivedependencyparser.py +783 -783
  165. {nltk-3.2 → nltk-3.3}/nltk/parse/pchart.py +522 -522
  166. {nltk-3.2 → nltk-3.3}/nltk/parse/projectivedependencyparser.py +579 -578
  167. {nltk-3.2 → nltk-3.3}/nltk/parse/recursivedescent.py +655 -656
  168. {nltk-3.2 → nltk-3.3}/nltk/parse/shiftreduce.py +458 -459
  169. {nltk-3.2 → nltk-3.3}/nltk/parse/stanford.py +431 -406
  170. {nltk-3.2 → nltk-3.3}/nltk/parse/transitionparser.py +774 -772
  171. {nltk-3.2 → nltk-3.3}/nltk/parse/util.py +231 -231
  172. {nltk-3.2 → nltk-3.3}/nltk/parse/viterbi.py +401 -401
  173. {nltk-3.2 → nltk-3.3}/nltk/probability.py +2410 -2355
  174. {nltk-3.2 → nltk-3.3}/nltk/sem/__init__.py +61 -61
  175. {nltk-3.2 → nltk-3.3}/nltk/sem/boxer.py +1261 -1261
  176. {nltk-3.2 → nltk-3.3}/nltk/sem/chat80.py +782 -782
  177. {nltk-3.2 → nltk-3.3}/nltk/sem/cooper_storage.py +118 -118
  178. {nltk-3.2 → nltk-3.3}/nltk/sem/drt.py +1258 -1257
  179. {nltk-3.2 → nltk-3.3}/nltk/sem/drt_glue_demo.py +485 -489
  180. {nltk-3.2 → nltk-3.3}/nltk/sem/evaluate.py +790 -784
  181. {nltk-3.2 → nltk-3.3}/nltk/sem/glue.py +696 -694
  182. {nltk-3.2 → nltk-3.3}/nltk/sem/hole.py +386 -384
  183. {nltk-3.2 → nltk-3.3}/nltk/sem/lfg.py +210 -208
  184. {nltk-3.2 → nltk-3.3}/nltk/sem/linearlogic.py +451 -449
  185. {nltk-3.2 → nltk-3.3}/nltk/sem/logic.py +1910 -1910
  186. {nltk-3.2 → nltk-3.3}/nltk/sem/relextract.py +476 -483
  187. {nltk-3.2 → nltk-3.3}/nltk/sem/skolemize.py +101 -101
  188. {nltk-3.2 → nltk-3.3}/nltk/sem/util.py +249 -249
  189. {nltk-3.2 → nltk-3.3}/nltk/sentiment/__init__.py +14 -14
  190. {nltk-3.2 → nltk-3.3}/nltk/sentiment/sentiment_analyzer.py +229 -229
  191. {nltk-3.2 → nltk-3.3}/nltk/sentiment/util.py +762 -752
  192. {nltk-3.2 → nltk-3.3}/nltk/sentiment/vader.py +443 -445
  193. {nltk-3.2 → nltk-3.3}/nltk/stem/__init__.py +31 -33
  194. {nltk-3.2 → nltk-3.3}/nltk/stem/api.py +28 -25
  195. nltk-3.3/nltk/stem/arlstem.py +369 -0
  196. {nltk-3.2 → nltk-3.3}/nltk/stem/isri.py +345 -345
  197. {nltk-3.2 → nltk-3.3}/nltk/stem/lancaster.py +337 -310
  198. nltk-3.3/nltk/stem/porter.py +710 -0
  199. {nltk-3.2 → nltk-3.3}/nltk/stem/regexp.py +61 -61
  200. {nltk-3.2 → nltk-3.3}/nltk/stem/rslp.py +142 -142
  201. {nltk-3.2 → nltk-3.3}/nltk/stem/snowball.py +4236 -3712
  202. {nltk-3.2 → nltk-3.3}/nltk/stem/util.py +22 -12
  203. {nltk-3.2 → nltk-3.3}/nltk/stem/wordnet.py +51 -51
  204. {nltk-3.2 → nltk-3.3}/nltk/tag/__init__.py +152 -127
  205. {nltk-3.2 → nltk-3.3}/nltk/tag/api.py +86 -81
  206. {nltk-3.2 → nltk-3.3}/nltk/tag/brill.py +424 -426
  207. {nltk-3.2 → nltk-3.3}/nltk/tag/brill_trainer.py +608 -608
  208. {nltk-3.2 → nltk-3.3}/nltk/tag/crf.py +204 -200
  209. {nltk-3.2 → nltk-3.3}/nltk/tag/hmm.py +1277 -1277
  210. {nltk-3.2 → nltk-3.3}/nltk/tag/hunpos.py +132 -132
  211. {nltk-3.2 → nltk-3.3}/nltk/tag/mapping.py +101 -101
  212. {nltk-3.2 → nltk-3.3}/nltk/tag/perceptron.py +329 -314
  213. {nltk-3.2 → nltk-3.3}/nltk/tag/senna.py +147 -145
  214. {nltk-3.2 → nltk-3.3}/nltk/tag/sequential.py +740 -736
  215. {nltk-3.2 → nltk-3.3}/nltk/tag/stanford.py +219 -196
  216. {nltk-3.2 → nltk-3.3}/nltk/tag/tnt.py +595 -604
  217. {nltk-3.2 → nltk-3.3}/nltk/tag/util.py +72 -72
  218. {nltk-3.2 → nltk-3.3}/nltk/tbl/__init__.py +28 -28
  219. {nltk-3.2 → nltk-3.3}/nltk/tbl/api.py +1 -1
  220. {nltk-3.2 → nltk-3.3}/nltk/tbl/demo.py +366 -366
  221. {nltk-3.2 → nltk-3.3}/nltk/tbl/erroranalysis.py +39 -39
  222. {nltk-3.2 → nltk-3.3}/nltk/tbl/feature.py +259 -261
  223. {nltk-3.2 → nltk-3.3}/nltk/tbl/rule.py +321 -321
  224. {nltk-3.2 → nltk-3.3}/nltk/tbl/template.py +303 -308
  225. {nltk-3.2 → nltk-3.3}/nltk/test/__init__.py +18 -18
  226. {nltk-3.2 → nltk-3.3}/nltk/test/all.py +24 -23
  227. {nltk-3.2 → nltk-3.3}/nltk/test/bleu.doctest +14 -14
  228. {nltk-3.2 → nltk-3.3}/nltk/test/bnc.doctest +60 -60
  229. {nltk-3.2 → nltk-3.3}/nltk/test/ccg.doctest +376 -395
  230. nltk-3.3/nltk/test/ccg_semantics.doctest +553 -0
  231. {nltk-3.2 → nltk-3.3}/nltk/test/chat80.doctest +234 -234
  232. {nltk-3.2 → nltk-3.3}/nltk/test/childes.doctest +184 -184
  233. {nltk-3.2 → nltk-3.3}/nltk/test/childes_fixt.py +14 -13
  234. {nltk-3.2 → nltk-3.3}/nltk/test/chunk.doctest +373 -373
  235. {nltk-3.2 → nltk-3.3}/nltk/test/classify.doctest +185 -185
  236. {nltk-3.2 → nltk-3.3}/nltk/test/classify_fixt.py +11 -10
  237. nltk-3.3/nltk/test/collections.doctest +20 -0
  238. {nltk-3.2 → nltk-3.3}/nltk/test/collocations.doctest +276 -276
  239. {nltk-3.2 → nltk-3.3}/nltk/test/compat.doctest +134 -138
  240. {nltk-3.2 → nltk-3.3}/nltk/test/compat_fixt.py +9 -8
  241. nltk-3.3/nltk/test/concordance.doctest +55 -0
  242. {nltk-3.2 → nltk-3.3}/nltk/test/corpus.doctest +2200 -2212
  243. {nltk-3.2 → nltk-3.3}/nltk/test/corpus_fixt.py +3 -3
  244. {nltk-3.2 → nltk-3.3}/nltk/test/crubadan.doctest +65 -65
  245. {nltk-3.2 → nltk-3.3}/nltk/test/data.doctest +379 -379
  246. {nltk-3.2 → nltk-3.3}/nltk/test/dependency.doctest +241 -241
  247. {nltk-3.2 → nltk-3.3}/nltk/test/discourse.doctest +546 -546
  248. {nltk-3.2 → nltk-3.3}/nltk/test/discourse_fixt.py +14 -13
  249. {nltk-3.2 → nltk-3.3}/nltk/test/doctest_nose_plugin.py +159 -156
  250. {nltk-3.2 → nltk-3.3}/nltk/test/drt.doctest +517 -517
  251. {nltk-3.2 → nltk-3.3}/nltk/test/featgram.doctest +607 -607
  252. {nltk-3.2 → nltk-3.3}/nltk/test/featstruct.doctest +1229 -1230
  253. {nltk-3.2 → nltk-3.3}/nltk/test/framenet.doctest +288 -239
  254. {nltk-3.2 → nltk-3.3}/nltk/test/generate.doctest +67 -67
  255. {nltk-3.2 → nltk-3.3}/nltk/test/gensim.doctest +140 -141
  256. {nltk-3.2 → nltk-3.3}/nltk/test/gensim_fixt.py +10 -9
  257. {nltk-3.2 → nltk-3.3}/nltk/test/gluesemantics.doctest +384 -386
  258. {nltk-3.2 → nltk-3.3}/nltk/test/gluesemantics_malt.doctest +68 -68
  259. {nltk-3.2 → nltk-3.3}/nltk/test/gluesemantics_malt_fixt.py +12 -11
  260. {nltk-3.2 → nltk-3.3}/nltk/test/grammar.doctest +48 -48
  261. {nltk-3.2 → nltk-3.3}/nltk/test/grammartestsuites.doctest +109 -109
  262. {nltk-3.2 → nltk-3.3}/nltk/test/index.doctest +100 -100
  263. {nltk-3.2 → nltk-3.3}/nltk/test/inference.doctest +534 -534
  264. {nltk-3.2 → nltk-3.3}/nltk/test/inference_fixt.py +12 -11
  265. {nltk-3.2 → nltk-3.3}/nltk/test/internals.doctest +140 -140
  266. {nltk-3.2 → nltk-3.3}/nltk/test/japanese.doctest +48 -48
  267. {nltk-3.2 → nltk-3.3}/nltk/test/logic.doctest +1098 -1098
  268. {nltk-3.2 → nltk-3.3}/nltk/test/metrics.doctest +270 -270
  269. {nltk-3.2 → nltk-3.3}/nltk/test/misc.doctest +118 -118
  270. {nltk-3.2 → nltk-3.3}/nltk/test/nonmonotonic.doctest +286 -286
  271. {nltk-3.2 → nltk-3.3}/nltk/test/nonmonotonic_fixt.py +12 -11
  272. {nltk-3.2 → nltk-3.3}/nltk/test/paice.doctest +35 -35
  273. {nltk-3.2 → nltk-3.3}/nltk/test/parse.doctest +884 -884
  274. {nltk-3.2 → nltk-3.3}/nltk/test/portuguese_en.doctest +565 -565
  275. {nltk-3.2 → nltk-3.3}/nltk/test/portuguese_en_fixt.py +16 -16
  276. {nltk-3.2 → nltk-3.3}/nltk/test/probability.doctest +304 -304
  277. {nltk-3.2 → nltk-3.3}/nltk/test/probability_fixt.py +13 -12
  278. {nltk-3.2 → nltk-3.3}/nltk/test/propbank.doctest +176 -176
  279. {nltk-3.2 → nltk-3.3}/nltk/test/relextract.doctest +263 -263
  280. {nltk-3.2 → nltk-3.3}/nltk/test/resolution.doctest +221 -221
  281. {nltk-3.2 → nltk-3.3}/nltk/test/runtests.py +86 -64
  282. {nltk-3.2 → nltk-3.3}/nltk/test/segmentation_fixt.py +10 -10
  283. {nltk-3.2 → nltk-3.3}/nltk/test/semantics.doctest +665 -665
  284. {nltk-3.2 → nltk-3.3}/nltk/test/semantics_fixt.py +7 -7
  285. {nltk-3.2 → nltk-3.3}/nltk/test/sentiment.doctest +233 -233
  286. {nltk-3.2 → nltk-3.3}/nltk/test/sentiwordnet.doctest +41 -41
  287. {nltk-3.2 → nltk-3.3}/nltk/test/simple.doctest +85 -85
  288. {nltk-3.2 → nltk-3.3}/nltk/test/stem.doctest +78 -78
  289. {nltk-3.2 → nltk-3.3}/nltk/test/tag.doctest +33 -33
  290. {nltk-3.2 → nltk-3.3}/nltk/test/tokenize.doctest +273 -166
  291. {nltk-3.2 → nltk-3.3}/nltk/test/toolbox.doctest +307 -307
  292. {nltk-3.2 → nltk-3.3}/nltk/test/translate.doctest +242 -242
  293. {nltk-3.2 → nltk-3.3}/nltk/test/translate_fixt.py +3 -3
  294. {nltk-3.2 → nltk-3.3}/nltk/test/tree.doctest +1101 -1101
  295. {nltk-3.2 → nltk-3.3}/nltk/test/treeprettyprinter.doctest +127 -127
  296. {nltk-3.2 → nltk-3.3}/nltk/test/treetransforms.doctest +156 -156
  297. nltk-3.3/nltk/test/unit/test_2x_compat.py +63 -0
  298. nltk-3.3/nltk/test/unit/test_aline.py +52 -0
  299. nltk-3.3/nltk/test/unit/test_chunk.py +56 -0
  300. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_classify.py +55 -53
  301. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_collocations.py +88 -79
  302. nltk-3.3/nltk/test/unit/test_concordance.py +98 -0
  303. nltk-3.3/nltk/test/unit/test_corenlp.py +1000 -0
  304. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_corpora.py +200 -183
  305. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_corpus_views.py +45 -45
  306. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_hmm.py +88 -88
  307. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_json2csv_corpus.py +188 -187
  308. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_naivebayes.py +26 -26
  309. nltk-3.3/nltk/test/unit/test_rte_classify.py +86 -0
  310. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_seekable_unicode_stream_reader.py +124 -124
  311. nltk-3.3/nltk/test/unit/test_senna.py +74 -0
  312. nltk-3.3/nltk/test/unit/test_stem.py +121 -0
  313. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_tag.py +20 -20
  314. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_tgrep.py +628 -626
  315. nltk-3.3/nltk/test/unit/test_tokenize.py +168 -0
  316. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_twitter_auth.py +185 -185
  317. nltk-3.3/nltk/test/unit/test_wordnet.py +134 -0
  318. nltk-3.3/nltk/test/unit/translate/test_bleu.py +244 -0
  319. nltk-3.3/nltk/test/unit/translate/test_gdfa.py +57 -0
  320. {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm1.py +75 -75
  321. {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm2.py +87 -87
  322. {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm3.py +105 -105
  323. {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm4.py +126 -126
  324. {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm5.py +166 -166
  325. {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm_model.py +270 -270
  326. nltk-3.3/nltk/test/unit/translate/test_nist.py +37 -0
  327. {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_stack_decoder.py +300 -300
  328. {nltk-3.2 → nltk-3.3}/nltk/test/unit/utils.py +41 -41
  329. {nltk-3.2 → nltk-3.3}/nltk/test/util.doctest +48 -48
  330. {nltk-3.2 → nltk-3.3}/nltk/test/wordnet.doctest +595 -581
  331. {nltk-3.2 → nltk-3.3}/nltk/test/wordnet_fixt.py +7 -6
  332. {nltk-3.2 → nltk-3.3}/nltk/test/wordnet_lch.doctest +53 -53
  333. {nltk-3.2 → nltk-3.3}/nltk/test/wsd.doctest +68 -68
  334. {nltk-3.2 → nltk-3.3}/nltk/text.py +663 -610
  335. {nltk-3.2 → nltk-3.3}/nltk/tgrep.py +938 -937
  336. {nltk-3.2 → nltk-3.3}/nltk/tokenize/__init__.py +130 -107
  337. {nltk-3.2 → nltk-3.3}/nltk/tokenize/api.py +77 -78
  338. {nltk-3.2 → nltk-3.3}/nltk/tokenize/casual.py +343 -342
  339. {nltk-3.2 → nltk-3.3}/nltk/tokenize/mwe.py +120 -120
  340. nltk-3.3/nltk/tokenize/nist.py +173 -0
  341. {nltk-3.2 → nltk-3.3}/nltk/tokenize/punkt.py +1620 -1601
  342. {nltk-3.2 → nltk-3.3}/nltk/tokenize/regexp.py +208 -202
  343. nltk-3.3/nltk/tokenize/repp.py +151 -0
  344. {nltk-3.2 → nltk-3.3}/nltk/tokenize/sexpr.py +140 -142
  345. {nltk-3.2 → nltk-3.3}/nltk/tokenize/simple.py +138 -136
  346. {nltk-3.2 → nltk-3.3}/nltk/tokenize/stanford.py +117 -113
  347. nltk-3.3/nltk/tokenize/stanford_segmenter.py +246 -0
  348. {nltk-3.2 → nltk-3.3}/nltk/tokenize/texttiling.py +458 -460
  349. nltk-3.3/nltk/tokenize/toktok.py +155 -0
  350. nltk-3.3/nltk/tokenize/treebank.py +363 -0
  351. nltk-3.3/nltk/tokenize/util.py +261 -0
  352. {nltk-3.2 → nltk-3.3}/nltk/toolbox.py +499 -497
  353. {nltk-3.2 → nltk-3.3}/nltk/translate/__init__.py +24 -24
  354. {nltk-3.2 → nltk-3.3}/nltk/translate/api.py +331 -321
  355. {nltk-3.2 → nltk-3.3}/nltk/translate/bleu_score.py +615 -556
  356. nltk-3.3/nltk/translate/chrf_score.py +137 -0
  357. {nltk-3.2 → nltk-3.3}/nltk/translate/gale_church.py +248 -235
  358. {nltk-3.2 → nltk-3.3}/nltk/translate/gdfa.py +135 -131
  359. nltk-3.3/nltk/translate/gleu_score.py +193 -0
  360. {nltk-3.2 → nltk-3.3}/nltk/translate/ibm1.py +250 -241
  361. {nltk-3.2 → nltk-3.3}/nltk/translate/ibm2.py +308 -308
  362. {nltk-3.2 → nltk-3.3}/nltk/translate/ibm3.py +337 -337
  363. {nltk-3.2 → nltk-3.3}/nltk/translate/ibm4.py +467 -467
  364. {nltk-3.2 → nltk-3.3}/nltk/translate/ibm5.py +639 -639
  365. {nltk-3.2 → nltk-3.3}/nltk/translate/ibm_model.py +536 -533
  366. {nltk-3.2 → nltk-3.3}/nltk/translate/metrics.py +40 -40
  367. nltk-3.3/nltk/translate/nist_score.py +178 -0
  368. {nltk-3.2 → nltk-3.3}/nltk/translate/phrase_based.py +175 -175
  369. {nltk-3.2 → nltk-3.3}/nltk/translate/ribes_score.py +325 -325
  370. {nltk-3.2 → nltk-3.3}/nltk/translate/stack_decoder.py +499 -495
  371. {nltk-3.2 → nltk-3.3}/nltk/tree.py +1605 -1603
  372. {nltk-3.2 → nltk-3.3}/nltk/treeprettyprinter.py +564 -564
  373. {nltk-3.2 → nltk-3.3}/nltk/treetransforms.py +309 -309
  374. {nltk-3.2 → nltk-3.3}/nltk/twitter/__init__.py +28 -28
  375. {nltk-3.2 → nltk-3.3}/nltk/twitter/api.py +141 -136
  376. {nltk-3.2 → nltk-3.3}/nltk/twitter/common.py +264 -258
  377. {nltk-3.2 → nltk-3.3}/nltk/twitter/twitter_demo.py +288 -288
  378. {nltk-3.2 → nltk-3.3}/nltk/twitter/twitterclient.py +530 -530
  379. {nltk-3.2 → nltk-3.3}/nltk/twitter/util.py +147 -146
  380. nltk-3.3/nltk/util.py +751 -0
  381. {nltk-3.2 → nltk-3.3}/nltk/wsd.py +53 -53
  382. {nltk-3.2 → nltk-3.3/nltk.egg-info}/PKG-INFO +13 -5
  383. {nltk-3.2 → nltk-3.3}/nltk.egg-info/SOURCES.txt +26 -3
  384. nltk-3.3/nltk.egg-info/requires.txt +31 -0
  385. {nltk-3.2 → nltk-3.3}/setup.cfg +0 -1
  386. {nltk-3.2 → nltk-3.3}/setup.py +102 -75
  387. nltk-3.2/nltk/VERSION +0 -1
  388. nltk-3.2/nltk/compat.py +0 -680
  389. nltk-3.2/nltk/corpus/reader/pl196x.py +0 -278
  390. nltk-3.2/nltk/corpus/reader/verbnet.py +0 -408
  391. nltk-3.2/nltk/corpus/reader/wordlist.py +0 -37
  392. nltk-3.2/nltk/sentiment/vader_lexicon.txt +0 -7517
  393. nltk-3.2/nltk/six.py +0 -868
  394. nltk-3.2/nltk/stem/porter.py +0 -692
  395. nltk-3.2/nltk/test/unit/test_2x_compat.py +0 -26
  396. nltk-3.2/nltk/test/unit/test_stem.py +0 -36
  397. nltk-3.2/nltk/test/unit/test_tokenize.py +0 -23
  398. nltk-3.2/nltk/test/unit/translate/test_bleu.py +0 -84
  399. nltk-3.2/nltk/tokenize/treebank.py +0 -124
  400. nltk-3.2/nltk/tokenize/util.py +0 -90
  401. nltk-3.2/nltk/util.py +0 -1364
  402. {nltk-3.2 → nltk-3.3}/nltk/test/unit/__init__.py +0 -0
  403. {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/__init__.py +0 -0
  404. {nltk-3.2 → nltk-3.3}/nltk.egg-info/dependency_links.txt +0 -0
  405. {nltk-3.2 → nltk-3.3}/nltk.egg-info/not-zip-safe +0 -0
  406. {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-2015 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
- import math as _math
16
- from functools import reduce
17
- _log2 = lambda x: _math.log(x, 2.0)
18
- _ln = _math.log
19
-
20
- _product = lambda s: reduce(lambda x, y: x * y, s)
21
-
22
- _SMALL = 1e-20
23
-
24
- try:
25
- from scipy.stats import fisher_exact
26
- except ImportError:
27
- def fisher_exact(*_args, **_kwargs):
28
- raise NotImplementedError
29
-
30
- ### Indices to marginals arguments:
31
-
32
- NGRAM = 0
33
- """Marginals index for the ngram count"""
34
-
35
- UNIGRAMS = -2
36
- """Marginals index for a tuple of each unigram count"""
37
-
38
- TOTAL = -1
39
- """Marginals index for the number of words in the data"""
40
-
41
-
42
- class NgramAssocMeasures(object):
43
- """
44
- An abstract class defining a collection of generic association measures.
45
- Each public method returns a score, taking the following arguments::
46
-
47
- score_fn(count_of_ngram,
48
- (count_of_n-1gram_1, ..., count_of_n-1gram_j),
49
- (count_of_n-2gram_1, ..., count_of_n-2gram_k),
50
- ...,
51
- (count_of_1gram_1, ..., count_of_1gram_n),
52
- count_of_total_words)
53
-
54
- See ``BigramAssocMeasures`` and ``TrigramAssocMeasures``
55
-
56
- Inheriting classes should define a property _n, and a method _contingency
57
- which calculates contingency values from marginals in order for all
58
- association measures defined here to be usable.
59
- """
60
-
61
- _n = 0
62
-
63
- @staticmethod
64
- def _contingency(*marginals):
65
- """Calculates values of a contingency table from marginal values."""
66
- raise NotImplementedError("The contingency table is not available"
67
- "in the general ngram case")
68
-
69
- @staticmethod
70
- def _marginals(*contingency):
71
- """Calculates values of contingency table marginals from its values."""
72
- raise NotImplementedError("The contingency table is not available"
73
- "in the general ngram case")
74
-
75
- @classmethod
76
- def _expected_values(cls, cont):
77
- """Calculates expected values for a contingency table."""
78
- n_all = sum(cont)
79
- bits = [1 << i for i in range(cls._n)]
80
-
81
- # For each contingency table cell
82
- for i in range(len(cont)):
83
- # Yield the expected value
84
- yield (_product(sum(cont[x] for x in range(2 ** cls._n)
85
- if (x & j) == (i & j))
86
- for j in bits) /
87
- (n_all ** (cls._n - 1)))
88
-
89
- @staticmethod
90
- def raw_freq(*marginals):
91
- """Scores ngrams by their frequency"""
92
- return marginals[NGRAM] / marginals[TOTAL]
93
-
94
- @classmethod
95
- def student_t(cls, *marginals):
96
- """Scores ngrams using Student's t test with independence hypothesis
97
- for unigrams, as in Manning and Schutze 5.3.1.
98
- """
99
- return ((marginals[NGRAM] -
100
- _product(marginals[UNIGRAMS]) /
101
- (marginals[TOTAL] ** (cls._n - 1))) /
102
- (marginals[NGRAM] + _SMALL) ** .5)
103
-
104
- @classmethod
105
- def chi_sq(cls, *marginals):
106
- """Scores ngrams using Pearson's chi-square as in Manning and Schutze
107
- 5.3.3.
108
- """
109
- cont = cls._contingency(*marginals)
110
- exps = cls._expected_values(cont)
111
- return sum((obs - exp) ** 2 / (exp + _SMALL)
112
- for obs, exp in zip(cont, exps))
113
-
114
- @staticmethod
115
- def mi_like(*marginals, **kwargs):
116
- """Scores ngrams using a variant of mutual information. The keyword
117
- argument power sets an exponent (default 3) for the numerator. No
118
- logarithm of the result is calculated.
119
- """
120
- return (marginals[NGRAM] ** kwargs.get('power', 3) /
121
- _product(marginals[UNIGRAMS]))
122
-
123
- @classmethod
124
- def pmi(cls, *marginals):
125
- """Scores ngrams by pointwise mutual information, as in Manning and
126
- Schutze 5.4.
127
- """
128
- return (_log2(marginals[NGRAM] * marginals[TOTAL] ** (cls._n - 1)) -
129
- _log2(_product(marginals[UNIGRAMS])))
130
-
131
- @classmethod
132
- def likelihood_ratio(cls, *marginals):
133
- """Scores ngrams using likelihood ratios as in Manning and Schutze 5.3.4.
134
- """
135
- cont = cls._contingency(*marginals)
136
- return (cls._n *
137
- sum(obs * _ln(obs / (exp + _SMALL) + _SMALL)
138
- for obs, exp in zip(cont, cls._expected_values(cont))))
139
-
140
- @classmethod
141
- def poisson_stirling(cls, *marginals):
142
- """Scores ngrams using the Poisson-Stirling measure."""
143
- exp = (_product(marginals[UNIGRAMS]) /
144
- (marginals[TOTAL] ** (cls._n - 1)))
145
- return marginals[NGRAM] * (_log2(marginals[NGRAM] / exp) - 1)
146
-
147
- @classmethod
148
- def jaccard(cls, *marginals):
149
- """Scores ngrams using the Jaccard index."""
150
- cont = cls._contingency(*marginals)
151
- return cont[0] / sum(cont[:-1])
152
-
153
-
154
- class BigramAssocMeasures(NgramAssocMeasures):
155
- """
156
- A collection of bigram association measures. Each association measure
157
- is provided as a function with three arguments::
158
-
159
- bigram_score_fn(n_ii, (n_ix, n_xi), n_xx)
160
-
161
- The arguments constitute the marginals of a contingency table, counting
162
- the occurrences of particular events in a corpus. The letter i in the
163
- suffix refers to the appearance of the word in question, while x indicates
164
- the appearance of any word. Thus, for example:
165
-
166
- n_ii counts (w1, w2), i.e. the bigram being scored
167
- n_ix counts (w1, *)
168
- n_xi counts (*, w2)
169
- n_xx counts (*, *), i.e. any bigram
170
-
171
- This may be shown with respect to a contingency table::
172
-
173
- w1 ~w1
174
- ------ ------
175
- w2 | n_ii | n_oi | = n_xi
176
- ------ ------
177
- ~w2 | n_io | n_oo |
178
- ------ ------
179
- = n_ix TOTAL = n_xx
180
- """
181
-
182
- _n = 2
183
-
184
- @staticmethod
185
- def _contingency(n_ii, n_ix_xi_tuple, n_xx):
186
- """Calculates values of a bigram contingency table from marginal values."""
187
- (n_ix, n_xi) = n_ix_xi_tuple
188
- n_oi = n_xi - n_ii
189
- n_io = n_ix - n_ii
190
- return (n_ii, n_oi, n_io, n_xx - n_ii - n_oi - n_io)
191
-
192
- @staticmethod
193
- def _marginals(n_ii, n_oi, n_io, n_oo):
194
- """Calculates values of contingency table marginals from its values."""
195
- return (n_ii, (n_oi + n_ii, n_io + n_ii), n_oo + n_oi + n_io + n_ii)
196
-
197
- @staticmethod
198
- def _expected_values(cont):
199
- """Calculates expected values for a contingency table."""
200
- n_xx = sum(cont)
201
- # For each contingency table cell
202
- for i in range(4):
203
- yield (cont[i] + cont[i ^ 1]) * (cont[i] + cont[i ^ 2]) / n_xx
204
-
205
- @classmethod
206
- def phi_sq(cls, *marginals):
207
- """Scores bigrams using phi-square, the square of the Pearson correlation
208
- coefficient.
209
- """
210
- n_ii, n_io, n_oi, n_oo = cls._contingency(*marginals)
211
-
212
- return ((n_ii*n_oo - n_io*n_oi)**2 /
213
- ((n_ii + n_io) * (n_ii + n_oi) * (n_io + n_oo) * (n_oi + n_oo)))
214
-
215
- @classmethod
216
- def chi_sq(cls, n_ii, n_ix_xi_tuple, n_xx):
217
- """Scores bigrams using chi-square, i.e. phi-sq multiplied by the number
218
- of bigrams, as in Manning and Schutze 5.3.3.
219
- """
220
- (n_ix, n_xi) = n_ix_xi_tuple
221
- return n_xx * cls.phi_sq(n_ii, (n_ix, n_xi), n_xx)
222
-
223
- @classmethod
224
- def fisher(cls, *marginals):
225
- """Scores bigrams using Fisher's Exact Test (Pedersen 1996). Less
226
- sensitive to small counts than PMI or Chi Sq, but also more expensive
227
- to compute. Requires scipy.
228
- """
229
-
230
- n_ii, n_io, n_oi, n_oo = cls._contingency(*marginals)
231
-
232
- (odds, pvalue) = fisher_exact([[n_ii, n_io], [n_oi, n_oo]], alternative='less')
233
- return pvalue
234
-
235
- @staticmethod
236
- def dice(n_ii, n_ix_xi_tuple, n_xx):
237
- """Scores bigrams using Dice's coefficient."""
238
- (n_ix, n_xi) = n_ix_xi_tuple
239
- return 2 * n_ii / (n_ix + n_xi)
240
-
241
-
242
- class TrigramAssocMeasures(NgramAssocMeasures):
243
- """
244
- A collection of trigram association measures. Each association measure
245
- is provided as a function with four arguments::
246
-
247
- trigram_score_fn(n_iii,
248
- (n_iix, n_ixi, n_xii),
249
- (n_ixx, n_xix, n_xxi),
250
- n_xxx)
251
-
252
- The arguments constitute the marginals of a contingency table, counting
253
- the occurrences of particular events in a corpus. The letter i in the
254
- suffix refers to the appearance of the word in question, while x indicates
255
- the appearance of any word. Thus, for example:
256
- n_iii counts (w1, w2, w3), i.e. the trigram being scored
257
- n_ixx counts (w1, *, *)
258
- n_xxx counts (*, *, *), i.e. any trigram
259
- """
260
-
261
- _n = 3
262
-
263
- @staticmethod
264
- def _contingency(n_iii, n_iix_tuple, n_ixx_tuple, n_xxx):
265
- """Calculates values of a trigram contingency table (or cube) from
266
- marginal values.
267
- >>> TrigramAssocMeasures._contingency(1, (1, 1, 1), (1, 73, 1), 2000)
268
- (1, 0, 0, 0, 0, 72, 0, 1927)
269
- """
270
- (n_iix, n_ixi, n_xii) = n_iix_tuple
271
- (n_ixx, n_xix, n_xxi) = n_ixx_tuple
272
- n_oii = n_xii - n_iii
273
- n_ioi = n_ixi - n_iii
274
- n_iio = n_iix - n_iii
275
- n_ooi = n_xxi - n_iii - n_oii - n_ioi
276
- n_oio = n_xix - n_iii - n_oii - n_iio
277
- n_ioo = n_ixx - n_iii - n_ioi - n_iio
278
- n_ooo = n_xxx - n_iii - n_oii - n_ioi - n_iio - n_ooi - n_oio - n_ioo
279
-
280
- return (n_iii, n_oii, n_ioi, n_ooi,
281
- n_iio, n_oio, n_ioo, n_ooo)
282
-
283
- @staticmethod
284
- def _marginals(*contingency):
285
- """Calculates values of contingency table marginals from its values.
286
- >>> TrigramAssocMeasures._marginals(1, 0, 0, 0, 0, 72, 0, 1927)
287
- (1, (1, 1, 1), (1, 73, 1), 2000)
288
- """
289
- n_iii, n_oii, n_ioi, n_ooi, n_iio, n_oio, n_ioo, n_ooo = contingency
290
- return (n_iii,
291
- (n_iii + n_iio, n_iii + n_ioi, n_iii + n_oii),
292
- (n_iii + n_ioi + n_iio + n_ioo,
293
- n_iii + n_oii + n_iio + n_oio,
294
- n_iii + n_oii + n_ioi + n_ooi),
295
- sum(contingency))
296
-
297
-
298
- class QuadgramAssocMeasures(NgramAssocMeasures):
299
- """
300
- A collection of quadgram association measures. Each association measure
301
- is provided as a function with five arguments::
302
-
303
- trigram_score_fn(n_iiii,
304
- (n_iiix, n_iixi, n_ixii, n_xiii),
305
- (n_iixx, n_ixix, n_ixxi, n_xixi, n_xxii, n_xiix),
306
- (n_ixxx, n_xixx, n_xxix, n_xxxi),
307
- n_all)
308
-
309
- The arguments constitute the marginals of a contingency table, counting
310
- the occurrences of particular events in a corpus. The letter i in the
311
- suffix refers to the appearance of the word in question, while x indicates
312
- the appearance of any word. Thus, for example:
313
- n_iiii counts (w1, w2, w3, w4), i.e. the quadgram being scored
314
- n_ixxi counts (w1, *, *, w4)
315
- n_xxxx counts (*, *, *, *), i.e. any quadgram
316
- """
317
-
318
- _n = 4
319
-
320
- @staticmethod
321
- def _contingency(n_iiii, n_iiix_tuple, n_iixx_tuple, n_ixxx_tuple, n_xxxx):
322
- """Calculates values of a quadgram contingency table from
323
- marginal values.
324
- """
325
- (n_iiix, n_iixi, n_ixii, n_xiii) = n_iiix_tuple
326
- (n_iixx, n_ixix, n_ixxi, n_xixi, n_xxii, n_xiix) = n_iixx_tuple
327
- (n_ixxx, n_xixx, n_xxix, n_xxxi) = n_ixxx_tuple
328
- n_oiii = n_xiii - n_iiii
329
- n_ioii = n_ixii - n_iiii
330
- n_iioi = n_iixi - n_iiii
331
- n_ooii = n_xxii - n_iiii - n_oiii - n_ioii
332
- n_oioi = n_xixi - n_iiii - n_oiii - n_iioi
333
- n_iooi = n_ixxi - n_iiii - n_ioii - n_iioi
334
- n_oooi = n_xxxi - n_iiii - n_oiii - n_ioii - n_iioi - n_ooii - n_iooi - n_oioi
335
- n_iiio = n_iiix - n_iiii
336
- n_oiio = n_xiix - n_iiii - n_oiii - n_iiio
337
- n_ioio = n_ixix - n_iiii - n_ioii - n_iiio
338
- n_ooio = n_xxix - n_iiii - n_oiii - n_ioii - n_iiio - n_ooii - n_ioio - n_oiio
339
- n_iioo = n_iixx - n_iiii - n_iioi - n_iiio
340
- n_oioo = n_xixx - n_iiii - n_oiii - n_iioi - n_iiio - n_oioi - n_oiio - n_iioo
341
- n_iooo = n_ixxx - n_iiii - n_ioii - n_iioi - n_iiio - n_iooi - n_iioo - n_ioio
342
- n_oooo = n_xxxx - n_iiii - n_oiii - n_ioii - n_iioi - n_ooii - n_oioi - n_iooi - \
343
- n_oooi - n_iiio - n_oiio - n_ioio - n_ooio - n_iioo - n_oioo - n_iooo
344
-
345
- return (n_iiii, n_oiii, n_ioii, n_ooii, n_iioi,
346
- n_oioi, n_iooi, n_oooi, n_iiio, n_oiio,
347
- n_ioio, n_ooio, n_iioo, n_oioo, n_iooo, n_oooo)
348
-
349
- @staticmethod
350
- def _marginals(*contingency):
351
- """Calculates values of contingency table marginals from its values.
352
- QuadgramAssocMeasures._marginals(1, 0, 2, 46, 552, 825, 2577, 34967, 1, 0, 2, 48, 7250, 9031, 28585, 356653)
353
- (1, (2, 553, 3, 1), (7804, 6, 3132, 1378, 49, 2), (38970, 17660, 100, 38970), 440540)
354
- """
355
- n_iiii, n_oiii, n_ioii, n_ooii, n_iioi, n_oioi, n_iooi, n_oooi, n_iiio, n_oiio, n_ioio, n_ooio, \
356
- n_iioo, n_oioo, n_iooo, n_oooo = contingency
357
-
358
- n_iiix = n_iiii + n_iiio
359
- n_iixi = n_iiii + n_iioi
360
- n_ixii = n_iiii + n_ioii
361
- n_xiii = n_iiii + n_oiii
362
-
363
- n_iixx = n_iiii + n_iioi + n_iiio + n_iioo
364
- n_ixix = n_iiii + n_ioii + n_iiio + n_ioio
365
- n_ixxi = n_iiii + n_ioii + n_iioi + n_iooi
366
- n_xixi = n_iiii + n_oiii + n_iioi + n_oioi
367
- n_xxii = n_iiii + n_oiii + n_ioii + n_ooii
368
- n_xiix = n_iiii + n_oiii + n_iiio + n_oiio
369
-
370
- n_ixxx = n_iiii + n_ioii + n_iioi + n_iiio + n_iooi + n_iioo + n_ioio + n_iooo
371
- n_xixx = n_iiii + n_oiii + n_iioi + n_iiio + n_oioi + n_oiio + n_iioo + n_oioo
372
- n_xxix = n_iiii + n_oiii + n_ioii + n_iiio + n_ooii + n_ioio + n_oiio + n_ooio
373
- n_xxxi = n_iiii + n_oiii + n_ioii + n_iioi + n_ooii + n_iooi + n_oioi + n_oooi
374
-
375
- n_all = sum(contingency)
376
-
377
- return (n_iiii,
378
- (n_iiix, n_iixi, n_ixii, n_xiii),
379
- (n_iixx, n_ixix, n_ixxi, n_xixi, n_xxii, n_xiix),
380
- (n_ixxx, n_xixx, n_xxix, n_xxxi),
381
- n_all)
382
-
383
-
384
- class ContingencyMeasures(object):
385
- """Wraps NgramAssocMeasures classes such that the arguments of association
386
- measures are contingency table values rather than marginals.
387
- """
388
-
389
- def __init__(self, measures):
390
- """Constructs a ContingencyMeasures given a NgramAssocMeasures class"""
391
- self.__class__.__name__ = 'Contingency' + measures.__class__.__name__
392
- for k in dir(measures):
393
- if k.startswith('__'):
394
- continue
395
- v = getattr(measures, k)
396
- if not k.startswith('_'):
397
- v = self._make_contingency_fn(measures, v)
398
- setattr(self, k, v)
399
-
400
- @staticmethod
401
- def _make_contingency_fn(measures, old_fn):
402
- """From an association measure function, produces a new function which
403
- accepts contingency table values as its arguments.
404
- """
405
- def res(*contingency):
406
- return old_fn(*measures._marginals(*contingency))
407
- res.__doc__ = old_fn.__doc__
408
- res.__name__ = old_fn.__name__
409
- return res
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