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,401 +1,421 @@
1
- # Natural Language Toolkit: Agreement Metrics
2
- #
3
- # Copyright (C) 2001-2015 NLTK Project
4
- # Author: Tom Lippincott <tom@cs.columbia.edu>
5
- # URL: <http://nltk.org/>
6
- # For license information, see LICENSE.TXT
7
- #
8
-
9
- """
10
- Implementations of inter-annotator agreement coefficients surveyed by Artstein
11
- and Poesio (2007), Inter-Coder Agreement for Computational Linguistics.
12
-
13
- An agreement coefficient calculates the amount that annotators agreed on label
14
- assignments beyond what is expected by chance.
15
-
16
- In defining the AnnotationTask class, we use naming conventions similar to the
17
- paper's terminology. There are three types of objects in an annotation task:
18
-
19
- the coders (variables "c" and "C")
20
- the items to be annotated (variables "i" and "I")
21
- the potential categories to be assigned (variables "k" and "K")
22
-
23
- Additionally, it is often the case that we don't want to treat two different
24
- labels as complete disagreement, and so the AnnotationTask constructor can also
25
- take a distance metric as a final argument. Distance metrics are simply
26
- functions that take two arguments, and return a value between 0.0 and 1.0
27
- indicating the distance between them. If not supplied, the default is binary
28
- comparison between the arguments.
29
-
30
- The simplest way to initialize an AnnotationTask is with a list of triples,
31
- each containing a coder's assignment for one object in the task:
32
-
33
- task = AnnotationTask(data=[('c1', '1', 'v1'),('c2', '1', 'v1'),...])
34
-
35
- Note that the data list needs to contain the same number of triples for each
36
- individual coder, containing category values for the same set of items.
37
-
38
- Alpha (Krippendorff 1980)
39
- Kappa (Cohen 1960)
40
- S (Bennet, Albert and Goldstein 1954)
41
- Pi (Scott 1955)
42
-
43
-
44
- TODO: Describe handling of multiple coders and missing data
45
-
46
- Expected results from the Artstein and Poesio survey paper:
47
-
48
- >>> from nltk.metrics.agreement import AnnotationTask
49
- >>> import os.path
50
- >>> t = AnnotationTask(data=[x.split() for x in open(os.path.join(os.path.dirname(__file__), "artstein_poesio_example.txt"))])
51
- >>> t.avg_Ao()
52
- 0.88
53
- >>> t.pi()
54
- 0.7995322418977615...
55
- >>> t.S()
56
- 0.8199999999999998...
57
-
58
- This would have returned a wrong value (0.0) in @785fb79 as coders are in
59
- the wrong order. Subsequently, all values for pi(), S(), and kappa() would
60
- have been wrong as they are computed with avg_Ao().
61
- >>> t2 = AnnotationTask(data=[('b','1','stat'),('a','1','stat')])
62
- >>> t2.avg_Ao()
63
- 1.0
64
-
65
- The following, of course, also works.
66
- >>> t3 = AnnotationTask(data=[('a','1','othr'),('b','1','othr')])
67
- >>> t3.avg_Ao()
68
- 1.0
69
-
70
- """
71
- from __future__ import print_function, unicode_literals, division
72
-
73
- import logging
74
- from itertools import groupby
75
- from operator import itemgetter
76
-
77
- from nltk.probability import FreqDist, ConditionalFreqDist
78
- from nltk.internals import deprecated
79
- from nltk.compat import python_2_unicode_compatible, iteritems
80
-
81
- from nltk.metrics.distance import binary_distance
82
-
83
- log = logging.getLogger(__file__)
84
-
85
- @python_2_unicode_compatible
86
- class AnnotationTask(object):
87
- """Represents an annotation task, i.e. people assign labels to items.
88
-
89
- Notation tries to match notation in Artstein and Poesio (2007).
90
-
91
- In general, coders and items can be represented as any hashable object.
92
- Integers, for example, are fine, though strings are more readable.
93
- Labels must support the distance functions applied to them, so e.g.
94
- a string-edit-distance makes no sense if your labels are integers,
95
- whereas interval distance needs numeric values. A notable case of this
96
- is the MASI metric, which requires Python sets.
97
- """
98
-
99
- def __init__(self, data=None, distance=binary_distance):
100
- """Initialize an empty annotation task.
101
-
102
- """
103
- self.distance = distance
104
- self.I = set()
105
- self.K = set()
106
- self.C = set()
107
- self.data = []
108
- if data is not None:
109
- self.load_array(data)
110
-
111
- def __str__(self):
112
- return "\r\n".join(map(lambda x:"%s\t%s\t%s" %
113
- (x['coder'], x['item'].replace('_', "\t"),
114
- ",".join(x['labels'])), self.data))
115
-
116
- def load_array(self, array):
117
- """Load the results of annotation.
118
-
119
- The argument is a list of 3-tuples, each representing a coder's labeling of an item:
120
- (coder,item,label)
121
- """
122
- for coder, item, labels in array:
123
- self.C.add(coder)
124
- self.K.add(labels)
125
- self.I.add(item)
126
- self.data.append({'coder':coder, 'labels':labels, 'item':item})
127
-
128
- def agr(self, cA, cB, i, data=None):
129
- """Agreement between two coders on a given item
130
-
131
- """
132
- data = data or self.data
133
- # cfedermann: we don't know what combination of coder/item will come
134
- # first in x; to avoid StopIteration problems due to assuming an order
135
- # cA,cB, we allow either for k1 and then look up the missing as k2.
136
- k1 = next((x for x in data if x['coder'] in (cA,cB) and x['item']==i))
137
- if k1['coder'] == cA:
138
- k2 = next((x for x in data if x['coder']==cB and x['item']==i))
139
- else:
140
- k2 = next((x for x in data if x['coder']==cA and x['item']==i))
141
-
142
- ret = 1.0 - float(self.distance(k1['labels'], k2['labels']))
143
- log.debug("Observed agreement between %s and %s on %s: %f",
144
- cA, cB, i, ret)
145
- log.debug("Distance between \"%r\" and \"%r\": %f",
146
- k1['labels'], k2['labels'], 1.0 - ret)
147
- return ret
148
-
149
- def Nk(self, k):
150
- return float(sum(1 for x in self.data if x['labels'] == k))
151
-
152
- def Nik(self, i, k):
153
- return float(sum(1 for x in self.data if x['item'] == i and x['labels'] == k))
154
-
155
- def Nck(self, c, k):
156
- return float(sum(1 for x in self.data if x['coder'] == c and x['labels'] == k))
157
-
158
- @deprecated('Use Nk, Nik or Nck instead')
159
- def N(self, k=None, i=None, c=None):
160
- """Implements the "n-notation" used in Artstein and Poesio (2007)
161
-
162
- """
163
- if k is not None and i is None and c is None:
164
- ret = self.Nk(k)
165
- elif k is not None and i is not None and c is None:
166
- ret = self.Nik(i, k)
167
- elif k is not None and c is not None and i is None:
168
- ret = self.Nck(c, k)
169
- else:
170
- raise ValueError("You must pass either i or c, not both! (k=%r,i=%r,c=%r)" % (k, i, c))
171
- log.debug("Count on N[%s,%s,%s]: %d", k, i, c, ret)
172
- return ret
173
-
174
- def _grouped_data(self, field, data=None):
175
- data = data or self.data
176
- return groupby(sorted(data, key=itemgetter(field)), itemgetter(field))
177
-
178
- def Ao(self, cA, cB):
179
- """Observed agreement between two coders on all items.
180
-
181
- """
182
- data = self._grouped_data('item', (x for x in self.data if x['coder'] in (cA, cB)))
183
- ret = sum(self.agr(cA, cB, item, item_data) for item, item_data in data) / len(self.I)
184
- log.debug("Observed agreement between %s and %s: %f", cA, cB, ret)
185
- return ret
186
-
187
- def _pairwise_average(self, function):
188
- """
189
- Calculates the average of function results for each coder pair
190
- """
191
- total = 0
192
- n = 0
193
- s = self.C.copy()
194
- for cA in self.C:
195
- s.remove(cA)
196
- for cB in s:
197
- total += function(cA, cB)
198
- n += 1
199
- ret = total / n
200
- return ret
201
-
202
- def avg_Ao(self):
203
- """Average observed agreement across all coders and items.
204
-
205
- """
206
- ret = self._pairwise_average(self.Ao)
207
- log.debug("Average observed agreement: %f", ret)
208
- return ret
209
-
210
- def Do_alpha(self):
211
- """The observed disagreement for the alpha coefficient.
212
-
213
- The alpha coefficient, unlike the other metrics, uses this rather than
214
- observed agreement.
215
- """
216
- total = 0.0
217
- for i, itemdata in self._grouped_data('item'):
218
- label_freqs = FreqDist(x['labels'] for x in itemdata)
219
-
220
- for j, nj in iteritems(label_freqs):
221
- for l, nl in iteritems(label_freqs):
222
- total += float(nj * nl) * self.distance(l, j)
223
- ret = (1.0 / (len(self.I) * len(self.C) * (len(self.C) - 1))) * total
224
- log.debug("Observed disagreement: %f", ret)
225
- return ret
226
-
227
- def Do_Kw_pairwise(self,cA,cB,max_distance=1.0):
228
- """The observed disagreement for the weighted kappa coefficient.
229
-
230
- """
231
- total = 0.0
232
- data = (x for x in self.data if x['coder'] in (cA, cB))
233
- for i, itemdata in self._grouped_data('item', data):
234
- # we should have two items; distance doesn't care which comes first
235
- total += self.distance(next(itemdata)['labels'],
236
- next(itemdata)['labels'])
237
-
238
- ret = total / (len(self.I) * max_distance)
239
- log.debug("Observed disagreement between %s and %s: %f", cA, cB, ret)
240
- return ret
241
-
242
- def Do_Kw(self, max_distance=1.0):
243
- """Averaged over all labelers
244
-
245
- """
246
- ret = self._pairwise_average(lambda cA, cB: self.Do_Kw_pairwise(cA, cB, max_distance))
247
- log.debug("Observed disagreement: %f", ret)
248
- return ret
249
-
250
- # Agreement Coefficients
251
- def S(self):
252
- """Bennett, Albert and Goldstein 1954
253
-
254
- """
255
- Ae = 1.0 / len(self.K)
256
- ret = (self.avg_Ao() - Ae) / (1.0 - Ae)
257
- return ret
258
-
259
- def pi(self):
260
- """Scott 1955; here, multi-pi.
261
- Equivalent to K from Siegel and Castellan (1988).
262
-
263
- """
264
- total = 0.0
265
- label_freqs = FreqDist(x['labels'] for x in self.data)
266
- for k, f in iteritems(label_freqs):
267
- total += f ** 2
268
- Ae = total / ((len(self.I) * len(self.C)) ** 2)
269
- return (self.avg_Ao() - Ae) / (1 - Ae)
270
-
271
- def Ae_kappa(self, cA, cB):
272
- Ae = 0.0
273
- nitems = float(len(self.I))
274
- label_freqs = ConditionalFreqDist((x['labels'], x['coder']) for x in self.data)
275
- for k in label_freqs.conditions():
276
- Ae += (label_freqs[k][cA] / nitems) * (label_freqs[k][cB] / nitems)
277
- return Ae
278
-
279
- def kappa_pairwise(self, cA, cB):
280
- """
281
-
282
- """
283
- Ae = self.Ae_kappa(cA, cB)
284
- ret = (self.Ao(cA, cB) - Ae) / (1.0 - Ae)
285
- log.debug("Expected agreement between %s and %s: %f", cA, cB, Ae)
286
- return ret
287
-
288
- def kappa(self):
289
- """Cohen 1960
290
- Averages naively over kappas for each coder pair.
291
-
292
- """
293
- return self._pairwise_average(self.kappa_pairwise)
294
-
295
- def multi_kappa(self):
296
- """Davies and Fleiss 1982
297
- Averages over observed and expected agreements for each coder pair.
298
-
299
- """
300
- Ae = self._pairwise_average(self.Ae_kappa)
301
- return (self.avg_Ao() - Ae) / (1.0 - Ae)
302
-
303
- def alpha(self):
304
- """Krippendorff 1980
305
-
306
- """
307
- De = 0.0
308
-
309
- label_freqs = FreqDist(x['labels'] for x in self.data)
310
- for j in self.K:
311
- nj = label_freqs[j]
312
- for l in self.K:
313
- De += float(nj * label_freqs[l]) * self.distance(j, l)
314
- De = (1.0 / (len(self.I) * len(self.C) * (len(self.I) * len(self.C) - 1))) * De
315
- log.debug("Expected disagreement: %f", De)
316
- ret = 1.0 - (self.Do_alpha() / De)
317
- return ret
318
-
319
- def weighted_kappa_pairwise(self, cA, cB, max_distance=1.0):
320
- """Cohen 1968
321
-
322
- """
323
- total = 0.0
324
- label_freqs = ConditionalFreqDist((x['coder'], x['labels'])
325
- for x in self.data
326
- if x['coder'] in (cA, cB))
327
- for j in self.K:
328
- for l in self.K:
329
- total += label_freqs[cA][j] * label_freqs[cB][l] * self.distance(j, l)
330
- De = total / (max_distance * pow(len(self.I), 2))
331
- log.debug("Expected disagreement between %s and %s: %f", cA, cB, De)
332
- Do = self.Do_Kw_pairwise(cA, cB)
333
- ret = 1.0 - (Do / De)
334
- return ret
335
-
336
- def weighted_kappa(self, max_distance=1.0):
337
- """Cohen 1968
338
-
339
- """
340
- return self._pairwise_average(lambda cA, cB: self.weighted_kappa_pairwise(cA, cB, max_distance))
341
-
342
-
343
- if __name__ == '__main__':
344
-
345
- import re
346
- import optparse
347
- from nltk.metrics import distance
348
-
349
- # process command-line arguments
350
- parser = optparse.OptionParser()
351
- parser.add_option("-d", "--distance", dest="distance", default="binary_distance",
352
- help="distance metric to use")
353
- parser.add_option("-a", "--agreement", dest="agreement", default="kappa",
354
- help="agreement coefficient to calculate")
355
- parser.add_option("-e", "--exclude", dest="exclude", action="append",
356
- default=[], help="coder names to exclude (may be specified multiple times)")
357
- parser.add_option("-i", "--include", dest="include", action="append", default=[],
358
- help="coder names to include, same format as exclude")
359
- parser.add_option("-f", "--file", dest="file",
360
- help="file to read labelings from, each line with three columns: 'labeler item labels'")
361
- parser.add_option("-v", "--verbose", dest="verbose", default='0',
362
- help="how much debugging to print on stderr (0-4)")
363
- parser.add_option("-c", "--columnsep", dest="columnsep", default="\t",
364
- help="char/string that separates the three columns in the file, defaults to tab")
365
- parser.add_option("-l", "--labelsep", dest="labelsep", default=",",
366
- help="char/string that separates labels (if labelers can assign more than one), defaults to comma")
367
- parser.add_option("-p", "--presence", dest="presence", default=None,
368
- help="convert each labeling into 1 or 0, based on presence of LABEL")
369
- parser.add_option("-T", "--thorough", dest="thorough", default=False, action="store_true",
370
- help="calculate agreement for every subset of the annotators")
371
- (options, remainder) = parser.parse_args()
372
-
373
- if not options.file:
374
- parser.print_help()
375
- exit()
376
-
377
- logging.basicConfig(level=50 - 10 * int(options.verbose))
378
-
379
- # read in data from the specified file
380
- data = []
381
- with open(options.file, 'r') as infile:
382
- for l in infile:
383
- toks = l.split(options.columnsep)
384
- coder, object_, labels = toks[0], str(toks[1:-1]), frozenset(toks[-1].strip().split(options.labelsep))
385
- if ((options.include == options.exclude) or
386
- (len(options.include) > 0 and coder in options.include) or
387
- (len(options.exclude) > 0 and coder not in options.exclude)):
388
- data.append((coder, object_, labels))
389
-
390
- if options.presence:
391
- task = AnnotationTask(data, getattr(distance, options.distance)(options.presence))
392
- else:
393
- task = AnnotationTask(data, getattr(distance, options.distance))
394
-
395
- if options.thorough:
396
- pass
397
- else:
398
- print(getattr(task, options.agreement)())
399
-
400
- logging.shutdown()
401
-
1
+ # Natural Language Toolkit: Agreement Metrics
2
+ #
3
+ # Copyright (C) 2001-2018 NLTK Project
4
+ # Author: Tom Lippincott <tom@cs.columbia.edu>
5
+ # URL: <http://nltk.org/>
6
+ # For license information, see LICENSE.TXT
7
+ #
8
+
9
+ """
10
+ Implementations of inter-annotator agreement coefficients surveyed by Artstein
11
+ and Poesio (2007), Inter-Coder Agreement for Computational Linguistics.
12
+
13
+ An agreement coefficient calculates the amount that annotators agreed on label
14
+ assignments beyond what is expected by chance.
15
+
16
+ In defining the AnnotationTask class, we use naming conventions similar to the
17
+ paper's terminology. There are three types of objects in an annotation task:
18
+
19
+ the coders (variables "c" and "C")
20
+ the items to be annotated (variables "i" and "I")
21
+ the potential categories to be assigned (variables "k" and "K")
22
+
23
+ Additionally, it is often the case that we don't want to treat two different
24
+ labels as complete disagreement, and so the AnnotationTask constructor can also
25
+ take a distance metric as a final argument. Distance metrics are simply
26
+ functions that take two arguments, and return a value between 0.0 and 1.0
27
+ indicating the distance between them. If not supplied, the default is binary
28
+ comparison between the arguments.
29
+
30
+ The simplest way to initialize an AnnotationTask is with a list of triples,
31
+ each containing a coder's assignment for one object in the task:
32
+
33
+ task = AnnotationTask(data=[('c1', '1', 'v1'),('c2', '1', 'v1'),...])
34
+
35
+ Note that the data list needs to contain the same number of triples for each
36
+ individual coder, containing category values for the same set of items.
37
+
38
+ Alpha (Krippendorff 1980)
39
+ Kappa (Cohen 1960)
40
+ S (Bennet, Albert and Goldstein 1954)
41
+ Pi (Scott 1955)
42
+
43
+
44
+ TODO: Describe handling of multiple coders and missing data
45
+
46
+ Expected results from the Artstein and Poesio survey paper:
47
+
48
+ >>> from nltk.metrics.agreement import AnnotationTask
49
+ >>> import os.path
50
+ >>> t = AnnotationTask(data=[x.split() for x in open(os.path.join(os.path.dirname(__file__), "artstein_poesio_example.txt"))])
51
+ >>> t.avg_Ao()
52
+ 0.88
53
+ >>> t.pi()
54
+ 0.7995322418977615...
55
+ >>> t.S()
56
+ 0.8199999999999998...
57
+
58
+ This would have returned a wrong value (0.0) in @785fb79 as coders are in
59
+ the wrong order. Subsequently, all values for pi(), S(), and kappa() would
60
+ have been wrong as they are computed with avg_Ao().
61
+ >>> t2 = AnnotationTask(data=[('b','1','stat'),('a','1','stat')])
62
+ >>> t2.avg_Ao()
63
+ 1.0
64
+
65
+ The following, of course, also works.
66
+ >>> t3 = AnnotationTask(data=[('a','1','othr'),('b','1','othr')])
67
+ >>> t3.avg_Ao()
68
+ 1.0
69
+
70
+ """
71
+ from __future__ import print_function, unicode_literals, division
72
+
73
+ import logging
74
+ from itertools import groupby
75
+ from operator import itemgetter
76
+
77
+ from six import iteritems
78
+
79
+ from nltk.probability import FreqDist, ConditionalFreqDist
80
+ from nltk.internals import deprecated
81
+ from nltk.compat import python_2_unicode_compatible
82
+
83
+ from nltk.metrics.distance import binary_distance
84
+
85
+ log = logging.getLogger(__file__)
86
+
87
+ @python_2_unicode_compatible
88
+ class AnnotationTask(object):
89
+ """Represents an annotation task, i.e. people assign labels to items.
90
+
91
+ Notation tries to match notation in Artstein and Poesio (2007).
92
+
93
+ In general, coders and items can be represented as any hashable object.
94
+ Integers, for example, are fine, though strings are more readable.
95
+ Labels must support the distance functions applied to them, so e.g.
96
+ a string-edit-distance makes no sense if your labels are integers,
97
+ whereas interval distance needs numeric values. A notable case of this
98
+ is the MASI metric, which requires Python sets.
99
+ """
100
+
101
+ def __init__(self, data=None, distance=binary_distance):
102
+ """Initialize an annotation task.
103
+
104
+ The data argument can be None (to create an empty annotation task) or a sequence of 3-tuples,
105
+ each representing a coder's labeling of an item:
106
+ (coder,item,label)
107
+
108
+ The distance argument is a function taking two arguments (labels) and producing a numerical distance.
109
+ The distance from a label to itself should be zero:
110
+ distance(l,l) = 0
111
+ """
112
+ self.distance = distance
113
+ self.I = set()
114
+ self.K = set()
115
+ self.C = set()
116
+ self.data = []
117
+ if data is not None:
118
+ self.load_array(data)
119
+
120
+ def __str__(self):
121
+ return "\r\n".join(map(lambda x:"%s\t%s\t%s" %
122
+ (x['coder'], x['item'].replace('_', "\t"),
123
+ ",".join(x['labels'])), self.data))
124
+
125
+ def load_array(self, array):
126
+ """Load an sequence of annotation results, appending to any data already loaded.
127
+
128
+ The argument is a sequence of 3-tuples, each representing a coder's labeling of an item:
129
+ (coder,item,label)
130
+ """
131
+ for coder, item, labels in array:
132
+ self.C.add(coder)
133
+ self.K.add(labels)
134
+ self.I.add(item)
135
+ self.data.append({'coder':coder, 'labels':labels, 'item':item})
136
+
137
+ def agr(self, cA, cB, i, data=None):
138
+ """Agreement between two coders on a given item
139
+
140
+ """
141
+ data = data or self.data
142
+ # cfedermann: we don't know what combination of coder/item will come
143
+ # first in x; to avoid StopIteration problems due to assuming an order
144
+ # cA,cB, we allow either for k1 and then look up the missing as k2.
145
+ k1 = next((x for x in data if x['coder'] in (cA,cB) and x['item']==i))
146
+ if k1['coder'] == cA:
147
+ k2 = next((x for x in data if x['coder']==cB and x['item']==i))
148
+ else:
149
+ k2 = next((x for x in data if x['coder']==cA and x['item']==i))
150
+
151
+ ret = 1.0 - float(self.distance(k1['labels'], k2['labels']))
152
+ log.debug("Observed agreement between %s and %s on %s: %f",
153
+ cA, cB, i, ret)
154
+ log.debug("Distance between \"%r\" and \"%r\": %f",
155
+ k1['labels'], k2['labels'], 1.0 - ret)
156
+ return ret
157
+
158
+ def Nk(self, k):
159
+ return float(sum(1 for x in self.data if x['labels'] == k))
160
+
161
+ def Nik(self, i, k):
162
+ return float(sum(1 for x in self.data if x['item'] == i and x['labels'] == k))
163
+
164
+ def Nck(self, c, k):
165
+ return float(sum(1 for x in self.data if x['coder'] == c and x['labels'] == k))
166
+
167
+ @deprecated('Use Nk, Nik or Nck instead')
168
+ def N(self, k=None, i=None, c=None):
169
+ """Implements the "n-notation" used in Artstein and Poesio (2007)
170
+
171
+ """
172
+ if k is not None and i is None and c is None:
173
+ ret = self.Nk(k)
174
+ elif k is not None and i is not None and c is None:
175
+ ret = self.Nik(i, k)
176
+ elif k is not None and c is not None and i is None:
177
+ ret = self.Nck(c, k)
178
+ else:
179
+ raise ValueError("You must pass either i or c, not both! (k=%r,i=%r,c=%r)" % (k, i, c))
180
+ log.debug("Count on N[%s,%s,%s]: %d", k, i, c, ret)
181
+ return ret
182
+
183
+ def _grouped_data(self, field, data=None):
184
+ data = data or self.data
185
+ return groupby(sorted(data, key=itemgetter(field)), itemgetter(field))
186
+
187
+ def Ao(self, cA, cB):
188
+ """Observed agreement between two coders on all items.
189
+
190
+ """
191
+ data = self._grouped_data('item', (x for x in self.data if x['coder'] in (cA, cB)))
192
+ ret = sum(self.agr(cA, cB, item, item_data) for item, item_data in data) / len(self.I)
193
+ log.debug("Observed agreement between %s and %s: %f", cA, cB, ret)
194
+ return ret
195
+
196
+ def _pairwise_average(self, function):
197
+ """
198
+ Calculates the average of function results for each coder pair
199
+ """
200
+ total = 0
201
+ n = 0
202
+ s = self.C.copy()
203
+ for cA in self.C:
204
+ s.remove(cA)
205
+ for cB in s:
206
+ total += function(cA, cB)
207
+ n += 1
208
+ ret = total / n
209
+ return ret
210
+
211
+ def avg_Ao(self):
212
+ """Average observed agreement across all coders and items.
213
+
214
+ """
215
+ ret = self._pairwise_average(self.Ao)
216
+ log.debug("Average observed agreement: %f", ret)
217
+ return ret
218
+
219
+ def Do_alpha(self):
220
+ """The observed disagreement for the alpha coefficient.
221
+
222
+ The alpha coefficient, unlike the other metrics, uses this rather than
223
+ observed agreement.
224
+ """
225
+ total = 0.0
226
+ for i, itemdata in self._grouped_data('item'):
227
+ label_freqs = FreqDist(x['labels'] for x in itemdata)
228
+
229
+ for j, nj in iteritems(label_freqs):
230
+ for l, nl in iteritems(label_freqs):
231
+ total += float(nj * nl) * self.distance(l, j)
232
+ ret = (1.0 / (len(self.I) * len(self.C) * (len(self.C) - 1))) * total
233
+ log.debug("Observed disagreement: %f", ret)
234
+ return ret
235
+
236
+ def Do_Kw_pairwise(self,cA,cB,max_distance=1.0):
237
+ """The observed disagreement for the weighted kappa coefficient.
238
+
239
+ """
240
+ total = 0.0
241
+ data = (x for x in self.data if x['coder'] in (cA, cB))
242
+ for i, itemdata in self._grouped_data('item', data):
243
+ # we should have two items; distance doesn't care which comes first
244
+ total += self.distance(next(itemdata)['labels'],
245
+ next(itemdata)['labels'])
246
+
247
+ ret = total / (len(self.I) * max_distance)
248
+ log.debug("Observed disagreement between %s and %s: %f", cA, cB, ret)
249
+ return ret
250
+
251
+ def Do_Kw(self, max_distance=1.0):
252
+ """Averaged over all labelers
253
+
254
+ """
255
+ ret = self._pairwise_average(lambda cA, cB: self.Do_Kw_pairwise(cA, cB, max_distance))
256
+ log.debug("Observed disagreement: %f", ret)
257
+ return ret
258
+
259
+ # Agreement Coefficients
260
+ def S(self):
261
+ """Bennett, Albert and Goldstein 1954
262
+
263
+ """
264
+ Ae = 1.0 / len(self.K)
265
+ ret = (self.avg_Ao() - Ae) / (1.0 - Ae)
266
+ return ret
267
+
268
+ def pi(self):
269
+ """Scott 1955; here, multi-pi.
270
+ Equivalent to K from Siegel and Castellan (1988).
271
+
272
+ """
273
+ total = 0.0
274
+ label_freqs = FreqDist(x['labels'] for x in self.data)
275
+ for k, f in iteritems(label_freqs):
276
+ total += f ** 2
277
+ Ae = total / ((len(self.I) * len(self.C)) ** 2)
278
+ return (self.avg_Ao() - Ae) / (1 - Ae)
279
+
280
+ def Ae_kappa(self, cA, cB):
281
+ Ae = 0.0
282
+ nitems = float(len(self.I))
283
+ label_freqs = ConditionalFreqDist((x['labels'], x['coder']) for x in self.data)
284
+ for k in label_freqs.conditions():
285
+ Ae += (label_freqs[k][cA] / nitems) * (label_freqs[k][cB] / nitems)
286
+ return Ae
287
+
288
+ def kappa_pairwise(self, cA, cB):
289
+ """
290
+
291
+ """
292
+ Ae = self.Ae_kappa(cA, cB)
293
+ ret = (self.Ao(cA, cB) - Ae) / (1.0 - Ae)
294
+ log.debug("Expected agreement between %s and %s: %f", cA, cB, Ae)
295
+ return ret
296
+
297
+ def kappa(self):
298
+ """Cohen 1960
299
+ Averages naively over kappas for each coder pair.
300
+
301
+ """
302
+ return self._pairwise_average(self.kappa_pairwise)
303
+
304
+ def multi_kappa(self):
305
+ """Davies and Fleiss 1982
306
+ Averages over observed and expected agreements for each coder pair.
307
+
308
+ """
309
+ Ae = self._pairwise_average(self.Ae_kappa)
310
+ return (self.avg_Ao() - Ae) / (1.0 - Ae)
311
+
312
+ def alpha(self):
313
+ """Krippendorff 1980
314
+
315
+ """
316
+ # check for degenerate cases
317
+ if len(self.K)==0:
318
+ raise ValueError("Cannot calculate alpha, no data present!")
319
+ if len(self.K) == 1:
320
+ log.debug("Only one annotation value, allpha returning 1.")
321
+ return 1
322
+ if len(self.C)==1 and len(self.I) == 1:
323
+ raise ValueError("Cannot calculate alpha, only one coder and item present!")
324
+
325
+ De = 0.0
326
+
327
+ label_freqs = FreqDist(x['labels'] for x in self.data)
328
+ for j in self.K:
329
+ nj = label_freqs[j]
330
+ for l in self.K:
331
+ De += float(nj * label_freqs[l]) * self.distance(j, l)
332
+ try:
333
+ De = (1.0 / (len(self.I) * len(self.C) * (len(self.I) * len(self.C) - 1))) * De
334
+ log.debug("Expected disagreement: %f", De)
335
+ ret = 1.0 - (self.Do_alpha() / De)
336
+ except ZeroDivisionError:
337
+ raise ValueError("Cannot calculate alpha, expected disagreement zero, check the distance function!")
338
+ return ret
339
+
340
+ def weighted_kappa_pairwise(self, cA, cB, max_distance=1.0):
341
+ """Cohen 1968
342
+
343
+ """
344
+ total = 0.0
345
+ label_freqs = ConditionalFreqDist((x['coder'], x['labels'])
346
+ for x in self.data
347
+ if x['coder'] in (cA, cB))
348
+ for j in self.K:
349
+ for l in self.K:
350
+ total += label_freqs[cA][j] * label_freqs[cB][l] * self.distance(j, l)
351
+ De = total / (max_distance * pow(len(self.I), 2))
352
+ log.debug("Expected disagreement between %s and %s: %f", cA, cB, De)
353
+ Do = self.Do_Kw_pairwise(cA, cB)
354
+ ret = 1.0 - (Do / De)
355
+ return ret
356
+
357
+ def weighted_kappa(self, max_distance=1.0):
358
+ """Cohen 1968
359
+
360
+ """
361
+ return self._pairwise_average(lambda cA, cB: self.weighted_kappa_pairwise(cA, cB, max_distance))
362
+
363
+
364
+ if __name__ == '__main__':
365
+
366
+ import re
367
+ import optparse
368
+ from nltk.metrics import distance
369
+
370
+ # process command-line arguments
371
+ parser = optparse.OptionParser()
372
+ parser.add_option("-d", "--distance", dest="distance", default="binary_distance",
373
+ help="distance metric to use")
374
+ parser.add_option("-a", "--agreement", dest="agreement", default="kappa",
375
+ help="agreement coefficient to calculate")
376
+ parser.add_option("-e", "--exclude", dest="exclude", action="append",
377
+ default=[], help="coder names to exclude (may be specified multiple times)")
378
+ parser.add_option("-i", "--include", dest="include", action="append", default=[],
379
+ help="coder names to include, same format as exclude")
380
+ parser.add_option("-f", "--file", dest="file",
381
+ help="file to read labelings from, each line with three columns: 'labeler item labels'")
382
+ parser.add_option("-v", "--verbose", dest="verbose", default='0',
383
+ help="how much debugging to print on stderr (0-4)")
384
+ parser.add_option("-c", "--columnsep", dest="columnsep", default="\t",
385
+ help="char/string that separates the three columns in the file, defaults to tab")
386
+ parser.add_option("-l", "--labelsep", dest="labelsep", default=",",
387
+ help="char/string that separates labels (if labelers can assign more than one), defaults to comma")
388
+ parser.add_option("-p", "--presence", dest="presence", default=None,
389
+ help="convert each labeling into 1 or 0, based on presence of LABEL")
390
+ parser.add_option("-T", "--thorough", dest="thorough", default=False, action="store_true",
391
+ help="calculate agreement for every subset of the annotators")
392
+ (options, remainder) = parser.parse_args()
393
+
394
+ if not options.file:
395
+ parser.print_help()
396
+ exit()
397
+
398
+ logging.basicConfig(level=50 - 10 * int(options.verbose))
399
+
400
+ # read in data from the specified file
401
+ data = []
402
+ with open(options.file, 'r') as infile:
403
+ for l in infile:
404
+ toks = l.split(options.columnsep)
405
+ coder, object_, labels = toks[0], str(toks[1:-1]), frozenset(toks[-1].strip().split(options.labelsep))
406
+ if ((options.include == options.exclude) or
407
+ (len(options.include) > 0 and coder in options.include) or
408
+ (len(options.exclude) > 0 and coder not in options.exclude)):
409
+ data.append((coder, object_, labels))
410
+
411
+ if options.presence:
412
+ task = AnnotationTask(data, getattr(distance, options.distance)(options.presence))
413
+ else:
414
+ task = AnnotationTask(data, getattr(distance, options.distance))
415
+
416
+ if options.thorough:
417
+ pass
418
+ else:
419
+ print(getattr(task, options.agreement)())
420
+
421
+ logging.shutdown()