nltk 3.2.1__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 (404) hide show
  1. {nltk-3.2.1 → nltk-3.3}/LICENSE.txt +1 -1
  2. {nltk-3.2.1/nltk.egg-info → nltk-3.3}/PKG-INFO +13 -5
  3. nltk-3.3/README.md +49 -0
  4. nltk-3.3/nltk/VERSION +1 -0
  5. {nltk-3.2.1 → nltk-3.3}/nltk/__init__.py +3 -3
  6. {nltk-3.2.1 → nltk-3.3}/nltk/app/__init__.py +2 -3
  7. {nltk-3.2.1 → nltk-3.3}/nltk/app/chartparser_app.py +92 -92
  8. {nltk-3.2.1 → nltk-3.3}/nltk/app/chunkparser_app.py +11 -13
  9. {nltk-3.2.1 → nltk-3.3}/nltk/app/collocations_app.py +8 -11
  10. {nltk-3.2.1 → nltk-3.3}/nltk/app/concordance_app.py +9 -11
  11. {nltk-3.2.1 → nltk-3.3}/nltk/app/nemo_app.py +18 -17
  12. {nltk-3.2.1 → nltk-3.3}/nltk/app/rdparser_app.py +10 -12
  13. {nltk-3.2.1 → nltk-3.3}/nltk/app/srparser_app.py +16 -16
  14. {nltk-3.2.1 → nltk-3.3}/nltk/app/wordfreq_app.py +1 -1
  15. {nltk-3.2.1 → nltk-3.3}/nltk/app/wordnet_app.py +11 -11
  16. {nltk-3.2.1 → nltk-3.3}/nltk/book.py +2 -1
  17. {nltk-3.2.1 → nltk-3.3}/nltk/ccg/__init__.py +1 -1
  18. {nltk-3.2.1 → nltk-3.3}/nltk/ccg/api.py +67 -47
  19. {nltk-3.2.1 → nltk-3.3}/nltk/ccg/chart.py +7 -5
  20. {nltk-3.2.1 → nltk-3.3}/nltk/ccg/combinator.py +42 -11
  21. {nltk-3.2.1 → nltk-3.3}/nltk/ccg/lexicon.py +1 -1
  22. {nltk-3.2.1 → nltk-3.3}/nltk/ccg/logic.py +1 -1
  23. {nltk-3.2.1 → nltk-3.3}/nltk/chat/__init__.py +1 -1
  24. {nltk-3.2.1 → nltk-3.3}/nltk/chat/eliza.py +1 -1
  25. {nltk-3.2.1 → nltk-3.3}/nltk/chat/iesha.py +1 -1
  26. {nltk-3.2.1 → nltk-3.3}/nltk/chat/rude.py +1 -1
  27. {nltk-3.2.1 → nltk-3.3}/nltk/chat/suntsu.py +1 -1
  28. {nltk-3.2.1 → nltk-3.3}/nltk/chat/util.py +12 -10
  29. {nltk-3.2.1 → nltk-3.3}/nltk/chat/zen.py +1 -1
  30. {nltk-3.2.1 → nltk-3.3}/nltk/chunk/__init__.py +1 -1
  31. {nltk-3.2.1 → nltk-3.3}/nltk/chunk/api.py +1 -1
  32. {nltk-3.2.1 → nltk-3.3}/nltk/chunk/named_entity.py +13 -13
  33. {nltk-3.2.1 → nltk-3.3}/nltk/chunk/regexp.py +9 -3
  34. {nltk-3.2.1 → nltk-3.3}/nltk/chunk/util.py +12 -12
  35. {nltk-3.2.1 → nltk-3.3}/nltk/classify/__init__.py +1 -1
  36. {nltk-3.2.1 → nltk-3.3}/nltk/classify/api.py +1 -1
  37. {nltk-3.2.1 → nltk-3.3}/nltk/classify/decisiontree.py +18 -18
  38. {nltk-3.2.1 → nltk-3.3}/nltk/classify/maxent.py +26 -8
  39. {nltk-3.2.1 → nltk-3.3}/nltk/classify/megam.py +5 -4
  40. {nltk-3.2.1 → nltk-3.3}/nltk/classify/naivebayes.py +29 -26
  41. {nltk-3.2.1 → nltk-3.3}/nltk/classify/rte_classify.py +58 -89
  42. {nltk-3.2.1 → nltk-3.3}/nltk/classify/scikitlearn.py +4 -2
  43. {nltk-3.2.1 → nltk-3.3}/nltk/classify/senna.py +24 -22
  44. {nltk-3.2.1 → nltk-3.3}/nltk/classify/svm.py +1 -1
  45. {nltk-3.2.1 → nltk-3.3}/nltk/classify/tadm.py +4 -3
  46. {nltk-3.2.1 → nltk-3.3}/nltk/classify/textcat.py +1 -1
  47. {nltk-3.2.1 → nltk-3.3}/nltk/classify/util.py +13 -1
  48. {nltk-3.2.1 → nltk-3.3}/nltk/classify/weka.py +7 -6
  49. {nltk-3.2.1 → nltk-3.3}/nltk/cluster/__init__.py +1 -1
  50. {nltk-3.2.1 → nltk-3.3}/nltk/cluster/api.py +9 -5
  51. {nltk-3.2.1 → nltk-3.3}/nltk/cluster/em.py +1 -1
  52. {nltk-3.2.1 → nltk-3.3}/nltk/cluster/gaac.py +3 -3
  53. {nltk-3.2.1 → nltk-3.3}/nltk/cluster/kmeans.py +1 -1
  54. {nltk-3.2.1 → nltk-3.3}/nltk/cluster/util.py +35 -20
  55. nltk-3.3/nltk/collections.py +640 -0
  56. {nltk-3.2.1 → nltk-3.3}/nltk/collocations.py +2 -2
  57. nltk-3.3/nltk/compat.py +365 -0
  58. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/__init__.py +37 -16
  59. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/europarl_raw.py +1 -1
  60. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/__init__.py +4 -2
  61. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/aligned.py +4 -3
  62. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/api.py +12 -10
  63. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/bnc.py +1 -1
  64. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/bracket_parse.py +1 -1
  65. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/categorized_sents.py +4 -3
  66. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/chasen.py +5 -4
  67. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/childes.py +8 -9
  68. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/chunked.py +4 -4
  69. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/cmudict.py +4 -2
  70. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/comparative_sents.py +4 -2
  71. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/conll.py +19 -12
  72. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/crubadan.py +2 -2
  73. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/dependency.py +1 -1
  74. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/framenet.py +1085 -119
  75. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/ieer.py +4 -3
  76. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/indian.py +4 -5
  77. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/ipipan.py +6 -5
  78. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/knbc.py +2 -2
  79. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/lin.py +1 -1
  80. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/mte.py +5 -4
  81. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/nkjp.py +4 -3
  82. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/nombank.py +8 -8
  83. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/nps_chat.py +1 -1
  84. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/opinion_lexicon.py +3 -3
  85. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/panlex_lite.py +1 -1
  86. nltk-3.3/nltk/corpus/reader/pl196x.py +292 -0
  87. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/plaintext.py +3 -4
  88. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/ppattach.py +4 -3
  89. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/propbank.py +8 -10
  90. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/pros_cons.py +5 -3
  91. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/reviews.py +3 -1
  92. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/rte.py +5 -7
  93. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/semcor.py +1 -1
  94. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/senseval.py +4 -2
  95. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/sentiwordnet.py +3 -3
  96. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/sinica_treebank.py +1 -1
  97. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/string_category.py +4 -3
  98. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/switchboard.py +1 -1
  99. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/tagged.py +4 -3
  100. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/timit.py +10 -8
  101. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/toolbox.py +4 -4
  102. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/twitter.py +4 -6
  103. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/util.py +7 -3
  104. nltk-3.3/nltk/corpus/reader/verbnet.py +595 -0
  105. nltk-3.3/nltk/corpus/reader/wordlist.py +134 -0
  106. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/wordnet.py +357 -285
  107. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/xmldocs.py +10 -5
  108. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/ycoe.py +25 -24
  109. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/util.py +22 -5
  110. {nltk-3.2.1 → nltk-3.3}/nltk/data.py +65 -29
  111. {nltk-3.2.1 → nltk-3.3}/nltk/decorators.py +5 -1
  112. {nltk-3.2.1 → nltk-3.3}/nltk/downloader.py +59 -55
  113. {nltk-3.2.1 → nltk-3.3}/nltk/draw/__init__.py +4 -4
  114. {nltk-3.2.1 → nltk-3.3}/nltk/draw/cfg.py +5 -8
  115. {nltk-3.2.1 → nltk-3.3}/nltk/draw/dispersion.py +1 -1
  116. {nltk-3.2.1 → nltk-3.3}/nltk/draw/table.py +4 -4
  117. {nltk-3.2.1 → nltk-3.3}/nltk/draw/tree.py +2 -5
  118. {nltk-3.2.1 → nltk-3.3}/nltk/draw/util.py +17 -17
  119. {nltk-3.2.1 → nltk-3.3}/nltk/featstruct.py +290 -173
  120. {nltk-3.2.1 → nltk-3.3}/nltk/grammar.py +87 -44
  121. {nltk-3.2.1 → nltk-3.3}/nltk/help.py +1 -1
  122. {nltk-3.2.1 → nltk-3.3}/nltk/inference/__init__.py +1 -1
  123. {nltk-3.2.1 → nltk-3.3}/nltk/inference/api.py +27 -19
  124. {nltk-3.2.1 → nltk-3.3}/nltk/inference/discourse.py +20 -16
  125. {nltk-3.2.1 → nltk-3.3}/nltk/inference/nonmonotonic.py +1 -1
  126. {nltk-3.2.1 → nltk-3.3}/nltk/inference/prover9.py +1 -1
  127. {nltk-3.2.1 → nltk-3.3}/nltk/inference/resolution.py +1 -1
  128. {nltk-3.2.1 → nltk-3.3}/nltk/inference/tableau.py +1 -1
  129. {nltk-3.2.1 → nltk-3.3}/nltk/internals.py +44 -44
  130. {nltk-3.2.1 → nltk-3.3}/nltk/jsontags.py +1 -1
  131. {nltk-3.2.1 → nltk-3.3}/nltk/metrics/__init__.py +2 -1
  132. {nltk-3.2.1 → nltk-3.3}/nltk/metrics/agreement.py +29 -9
  133. nltk-3.3/nltk/metrics/aline.py +607 -0
  134. {nltk-3.2.1 → nltk-3.3}/nltk/metrics/association.py +8 -4
  135. {nltk-3.2.1 → nltk-3.3}/nltk/metrics/confusionmatrix.py +1 -1
  136. {nltk-3.2.1 → nltk-3.3}/nltk/metrics/distance.py +12 -7
  137. {nltk-3.2.1 → nltk-3.3}/nltk/metrics/paice.py +1 -1
  138. {nltk-3.2.1 → nltk-3.3}/nltk/metrics/scores.py +7 -7
  139. {nltk-3.2.1 → nltk-3.3}/nltk/metrics/segmentation.py +4 -5
  140. {nltk-3.2.1 → nltk-3.3}/nltk/metrics/spearman.py +1 -1
  141. {nltk-3.2.1 → nltk-3.3}/nltk/misc/__init__.py +1 -1
  142. {nltk-3.2.1 → nltk-3.3}/nltk/misc/chomsky.py +4 -2
  143. {nltk-3.2.1 → nltk-3.3}/nltk/misc/minimalset.py +1 -1
  144. {nltk-3.2.1 → nltk-3.3}/nltk/misc/sort.py +1 -1
  145. {nltk-3.2.1 → nltk-3.3}/nltk/misc/wordfinder.py +1 -1
  146. {nltk-3.2.1 → nltk-3.3}/nltk/parse/__init__.py +2 -1
  147. {nltk-3.2.1 → nltk-3.3}/nltk/parse/api.py +1 -1
  148. {nltk-3.2.1 → nltk-3.3}/nltk/parse/bllip.py +1 -1
  149. {nltk-3.2.1 → nltk-3.3}/nltk/parse/chart.py +8 -7
  150. nltk-3.3/nltk/parse/corenlp.py +780 -0
  151. {nltk-3.2.1 → nltk-3.3}/nltk/parse/dependencygraph.py +4 -2
  152. {nltk-3.2.1 → nltk-3.3}/nltk/parse/earleychart.py +4 -3
  153. {nltk-3.2.1 → nltk-3.3}/nltk/parse/evaluate.py +1 -1
  154. {nltk-3.2.1 → nltk-3.3}/nltk/parse/featurechart.py +6 -4
  155. {nltk-3.2.1 → nltk-3.3}/nltk/parse/generate.py +15 -4
  156. {nltk-3.2.1 → nltk-3.3}/nltk/parse/malt.py +2 -2
  157. {nltk-3.2.1 → nltk-3.3}/nltk/parse/nonprojectivedependencyparser.py +3 -3
  158. {nltk-3.2.1 → nltk-3.3}/nltk/parse/pchart.py +1 -1
  159. {nltk-3.2.1 → nltk-3.3}/nltk/parse/projectivedependencyparser.py +6 -5
  160. {nltk-3.2.1 → nltk-3.3}/nltk/parse/recursivedescent.py +2 -3
  161. {nltk-3.2.1 → nltk-3.3}/nltk/parse/shiftreduce.py +2 -3
  162. {nltk-3.2.1 → nltk-3.3}/nltk/parse/stanford.py +53 -28
  163. {nltk-3.2.1 → nltk-3.3}/nltk/parse/transitionparser.py +11 -9
  164. {nltk-3.2.1 → nltk-3.3}/nltk/parse/util.py +1 -1
  165. {nltk-3.2.1 → nltk-3.3}/nltk/parse/viterbi.py +1 -1
  166. {nltk-3.2.1 → nltk-3.3}/nltk/probability.py +75 -20
  167. {nltk-3.2.1 → nltk-3.3}/nltk/sem/__init__.py +1 -1
  168. {nltk-3.2.1 → nltk-3.3}/nltk/sem/boxer.py +15 -15
  169. {nltk-3.2.1 → nltk-3.3}/nltk/sem/chat80.py +6 -6
  170. {nltk-3.2.1 → nltk-3.3}/nltk/sem/cooper_storage.py +1 -1
  171. {nltk-3.2.1 → nltk-3.3}/nltk/sem/drt.py +9 -8
  172. {nltk-3.2.1 → nltk-3.3}/nltk/sem/drt_glue_demo.py +5 -9
  173. {nltk-3.2.1 → nltk-3.3}/nltk/sem/evaluate.py +9 -3
  174. {nltk-3.2.1 → nltk-3.3}/nltk/sem/glue.py +8 -6
  175. {nltk-3.2.1 → nltk-3.3}/nltk/sem/hole.py +4 -2
  176. {nltk-3.2.1 → nltk-3.3}/nltk/sem/lfg.py +4 -2
  177. {nltk-3.2.1 → nltk-3.3}/nltk/sem/linearlogic.py +4 -2
  178. {nltk-3.2.1 → nltk-3.3}/nltk/sem/logic.py +14 -14
  179. {nltk-3.2.1 → nltk-3.3}/nltk/sem/relextract.py +11 -18
  180. {nltk-3.2.1 → nltk-3.3}/nltk/sem/skolemize.py +1 -1
  181. {nltk-3.2.1 → nltk-3.3}/nltk/sem/util.py +1 -1
  182. {nltk-3.2.1 → nltk-3.3}/nltk/sentiment/__init__.py +1 -1
  183. {nltk-3.2.1 → nltk-3.3}/nltk/sentiment/sentiment_analyzer.py +1 -1
  184. {nltk-3.2.1 → nltk-3.3}/nltk/sentiment/util.py +14 -4
  185. {nltk-3.2.1 → nltk-3.3}/nltk/sentiment/vader.py +41 -42
  186. {nltk-3.2.1 → nltk-3.3}/nltk/stem/__init__.py +1 -3
  187. {nltk-3.2.1 → nltk-3.3}/nltk/stem/api.py +7 -4
  188. nltk-3.3/nltk/stem/arlstem.py +369 -0
  189. {nltk-3.2.1 → nltk-3.3}/nltk/stem/isri.py +1 -1
  190. {nltk-3.2.1 → nltk-3.3}/nltk/stem/lancaster.py +39 -12
  191. nltk-3.3/nltk/stem/porter.py +710 -0
  192. {nltk-3.2.1 → nltk-3.3}/nltk/stem/regexp.py +2 -2
  193. {nltk-3.2.1 → nltk-3.3}/nltk/stem/rslp.py +1 -1
  194. {nltk-3.2.1 → nltk-3.3}/nltk/stem/snowball.py +537 -13
  195. {nltk-3.2.1 → nltk-3.3}/nltk/stem/util.py +11 -1
  196. {nltk-3.2.1 → nltk-3.3}/nltk/stem/wordnet.py +1 -1
  197. {nltk-3.2.1 → nltk-3.3}/nltk/tag/__init__.py +32 -7
  198. {nltk-3.2.1 → nltk-3.3}/nltk/tag/api.py +13 -8
  199. {nltk-3.2.1 → nltk-3.3}/nltk/tag/brill.py +4 -6
  200. {nltk-3.2.1 → nltk-3.3}/nltk/tag/crf.py +1 -1
  201. {nltk-3.2.1 → nltk-3.3}/nltk/tag/hmm.py +11 -11
  202. {nltk-3.2.1 → nltk-3.3}/nltk/tag/hunpos.py +4 -4
  203. {nltk-3.2.1 → nltk-3.3}/nltk/tag/mapping.py +1 -1
  204. {nltk-3.2.1 → nltk-3.3}/nltk/tag/perceptron.py +25 -10
  205. {nltk-3.2.1 → nltk-3.3}/nltk/tag/senna.py +25 -23
  206. {nltk-3.2.1 → nltk-3.3}/nltk/tag/sequential.py +19 -15
  207. {nltk-3.2.1 → nltk-3.3}/nltk/tag/stanford.py +59 -36
  208. {nltk-3.2.1 → nltk-3.3}/nltk/tag/tnt.py +11 -20
  209. {nltk-3.2.1 → nltk-3.3}/nltk/tag/util.py +1 -1
  210. {nltk-3.2.1 → nltk-3.3}/nltk/tbl/__init__.py +1 -1
  211. {nltk-3.2.1 → nltk-3.3}/nltk/tbl/demo.py +1 -1
  212. {nltk-3.2.1 → nltk-3.3}/nltk/tbl/erroranalysis.py +1 -1
  213. {nltk-3.2.1 → nltk-3.3}/nltk/tbl/feature.py +5 -7
  214. {nltk-3.2.1 → nltk-3.3}/nltk/tbl/rule.py +6 -6
  215. {nltk-3.2.1 → nltk-3.3}/nltk/tbl/template.py +18 -23
  216. {nltk-3.2.1 → nltk-3.3}/nltk/test/__init__.py +1 -1
  217. {nltk-3.2.1 → nltk-3.3}/nltk/test/all.py +7 -6
  218. {nltk-3.2.1 → nltk-3.3}/nltk/test/bnc.doctest +1 -1
  219. {nltk-3.2.1 → nltk-3.3}/nltk/test/ccg.doctest +1 -1
  220. {nltk-3.2.1 → nltk-3.3}/nltk/test/ccg_semantics.doctest +1 -1
  221. {nltk-3.2.1 → nltk-3.3}/nltk/test/chat80.doctest +1 -1
  222. {nltk-3.2.1 → nltk-3.3}/nltk/test/childes_fixt.py +1 -0
  223. {nltk-3.2.1 → nltk-3.3}/nltk/test/chunk.doctest +1 -1
  224. {nltk-3.2.1 → nltk-3.3}/nltk/test/classify.doctest +1 -1
  225. {nltk-3.2.1 → nltk-3.3}/nltk/test/classify_fixt.py +2 -1
  226. nltk-3.3/nltk/test/collections.doctest +20 -0
  227. {nltk-3.2.1 → nltk-3.3}/nltk/test/collocations.doctest +1 -1
  228. {nltk-3.2.1 → nltk-3.3}/nltk/test/compat.doctest +0 -4
  229. {nltk-3.2.1 → nltk-3.3}/nltk/test/compat_fixt.py +1 -0
  230. nltk-3.3/nltk/test/concordance.doctest +55 -0
  231. {nltk-3.2.1 → nltk-3.3}/nltk/test/corpus.doctest +38 -49
  232. {nltk-3.2.1 → nltk-3.3}/nltk/test/crubadan.doctest +1 -1
  233. {nltk-3.2.1 → nltk-3.3}/nltk/test/data.doctest +1 -1
  234. {nltk-3.2.1 → nltk-3.3}/nltk/test/dependency.doctest +1 -1
  235. {nltk-3.2.1 → nltk-3.3}/nltk/test/discourse.doctest +1 -1
  236. {nltk-3.2.1 → nltk-3.3}/nltk/test/discourse_fixt.py +1 -0
  237. {nltk-3.2.1 → nltk-3.3}/nltk/test/doctest_nose_plugin.py +8 -5
  238. {nltk-3.2.1 → nltk-3.3}/nltk/test/drt.doctest +1 -1
  239. {nltk-3.2.1 → nltk-3.3}/nltk/test/featgram.doctest +1 -1
  240. {nltk-3.2.1 → nltk-3.3}/nltk/test/featstruct.doctest +2 -3
  241. {nltk-3.2.1 → nltk-3.3}/nltk/test/framenet.doctest +82 -33
  242. {nltk-3.2.1 → nltk-3.3}/nltk/test/generate.doctest +1 -1
  243. {nltk-3.2.1 → nltk-3.3}/nltk/test/gensim.doctest +6 -7
  244. {nltk-3.2.1 → nltk-3.3}/nltk/test/gensim_fixt.py +1 -0
  245. {nltk-3.2.1 → nltk-3.3}/nltk/test/gluesemantics.doctest +13 -15
  246. {nltk-3.2.1 → nltk-3.3}/nltk/test/gluesemantics_malt.doctest +1 -1
  247. {nltk-3.2.1 → nltk-3.3}/nltk/test/gluesemantics_malt_fixt.py +1 -0
  248. {nltk-3.2.1 → nltk-3.3}/nltk/test/grammar.doctest +1 -1
  249. {nltk-3.2.1 → nltk-3.3}/nltk/test/grammartestsuites.doctest +1 -1
  250. {nltk-3.2.1 → nltk-3.3}/nltk/test/index.doctest +1 -1
  251. {nltk-3.2.1 → nltk-3.3}/nltk/test/inference.doctest +1 -1
  252. {nltk-3.2.1 → nltk-3.3}/nltk/test/inference_fixt.py +1 -0
  253. {nltk-3.2.1 → nltk-3.3}/nltk/test/internals.doctest +1 -1
  254. {nltk-3.2.1 → nltk-3.3}/nltk/test/japanese.doctest +1 -1
  255. {nltk-3.2.1 → nltk-3.3}/nltk/test/logic.doctest +1 -1
  256. {nltk-3.2.1 → nltk-3.3}/nltk/test/metrics.doctest +3 -3
  257. {nltk-3.2.1 → nltk-3.3}/nltk/test/misc.doctest +1 -1
  258. {nltk-3.2.1 → nltk-3.3}/nltk/test/nonmonotonic.doctest +1 -1
  259. {nltk-3.2.1 → nltk-3.3}/nltk/test/nonmonotonic_fixt.py +1 -0
  260. {nltk-3.2.1 → nltk-3.3}/nltk/test/parse.doctest +1 -1
  261. {nltk-3.2.1 → nltk-3.3}/nltk/test/portuguese_en.doctest +1 -1
  262. {nltk-3.2.1 → nltk-3.3}/nltk/test/probability.doctest +1 -1
  263. {nltk-3.2.1 → nltk-3.3}/nltk/test/probability_fixt.py +2 -1
  264. {nltk-3.2.1 → nltk-3.3}/nltk/test/propbank.doctest +1 -1
  265. {nltk-3.2.1 → nltk-3.3}/nltk/test/relextract.doctest +1 -1
  266. {nltk-3.2.1 → nltk-3.3}/nltk/test/resolution.doctest +1 -1
  267. {nltk-3.2.1 → nltk-3.3}/nltk/test/runtests.py +35 -13
  268. {nltk-3.2.1 → nltk-3.3}/nltk/test/semantics.doctest +1 -1
  269. {nltk-3.2.1 → nltk-3.3}/nltk/test/sentiment.doctest +3 -3
  270. {nltk-3.2.1 → nltk-3.3}/nltk/test/sentiwordnet.doctest +1 -1
  271. {nltk-3.2.1 → nltk-3.3}/nltk/test/simple.doctest +1 -1
  272. {nltk-3.2.1 → nltk-3.3}/nltk/test/stem.doctest +2 -2
  273. {nltk-3.2.1 → nltk-3.3}/nltk/test/tag.doctest +1 -1
  274. {nltk-3.2.1 → nltk-3.3}/nltk/test/tokenize.doctest +109 -2
  275. {nltk-3.2.1 → nltk-3.3}/nltk/test/toolbox.doctest +1 -1
  276. {nltk-3.2.1 → nltk-3.3}/nltk/test/translate.doctest +1 -1
  277. {nltk-3.2.1 → nltk-3.3}/nltk/test/tree.doctest +1 -1
  278. {nltk-3.2.1 → nltk-3.3}/nltk/test/treeprettyprinter.doctest +1 -1
  279. {nltk-3.2.1 → nltk-3.3}/nltk/test/treetransforms.doctest +1 -1
  280. nltk-3.3/nltk/test/unit/test_aline.py +52 -0
  281. nltk-3.3/nltk/test/unit/test_chunk.py +56 -0
  282. {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_classify.py +20 -18
  283. {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_collocations.py +16 -7
  284. nltk-3.3/nltk/test/unit/test_concordance.py +98 -0
  285. nltk-3.3/nltk/test/unit/test_corenlp.py +1000 -0
  286. {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_corpora.py +18 -1
  287. {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_json2csv_corpus.py +4 -3
  288. nltk-3.3/nltk/test/unit/test_rte_classify.py +86 -0
  289. nltk-3.3/nltk/test/unit/test_senna.py +74 -0
  290. nltk-3.3/nltk/test/unit/test_stem.py +121 -0
  291. {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_tgrep.py +4 -2
  292. nltk-3.3/nltk/test/unit/test_tokenize.py +168 -0
  293. nltk-3.3/nltk/test/unit/test_wordnet.py +134 -0
  294. nltk-3.3/nltk/test/unit/translate/test_bleu.py +244 -0
  295. nltk-3.3/nltk/test/unit/translate/test_gdfa.py +57 -0
  296. nltk-3.3/nltk/test/unit/translate/test_nist.py +37 -0
  297. {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/translate/test_stack_decoder.py +1 -1
  298. {nltk-3.2.1 → nltk-3.3}/nltk/test/util.doctest +1 -1
  299. {nltk-3.2.1 → nltk-3.3}/nltk/test/wordnet.doctest +17 -3
  300. {nltk-3.2.1 → nltk-3.3}/nltk/test/wordnet_fixt.py +1 -0
  301. {nltk-3.2.1 → nltk-3.3}/nltk/test/wordnet_lch.doctest +1 -1
  302. {nltk-3.2.1 → nltk-3.3}/nltk/test/wsd.doctest +1 -1
  303. {nltk-3.2.1 → nltk-3.3}/nltk/text.py +92 -39
  304. {nltk-3.2.1 → nltk-3.3}/nltk/tgrep.py +8 -7
  305. {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/__init__.py +37 -15
  306. {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/api.py +3 -4
  307. {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/casual.py +10 -9
  308. {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/mwe.py +2 -2
  309. nltk-3.3/nltk/tokenize/nist.py +173 -0
  310. {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/punkt.py +186 -167
  311. {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/regexp.py +13 -7
  312. nltk-3.3/nltk/tokenize/repp.py +151 -0
  313. {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/sexpr.py +4 -6
  314. {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/simple.py +7 -5
  315. {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/stanford.py +18 -14
  316. nltk-3.3/nltk/tokenize/stanford_segmenter.py +246 -0
  317. {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/texttiling.py +43 -45
  318. nltk-3.3/nltk/tokenize/toktok.py +155 -0
  319. nltk-3.3/nltk/tokenize/treebank.py +363 -0
  320. nltk-3.3/nltk/tokenize/util.py +261 -0
  321. {nltk-3.2.1 → nltk-3.3}/nltk/toolbox.py +4 -2
  322. {nltk-3.2.1 → nltk-3.3}/nltk/translate/__init__.py +1 -1
  323. {nltk-3.2.1 → nltk-3.3}/nltk/translate/api.py +50 -40
  324. {nltk-3.2.1 → nltk-3.3}/nltk/translate/bleu_score.py +221 -156
  325. nltk-3.3/nltk/translate/chrf_score.py +137 -0
  326. {nltk-3.2.1 → nltk-3.3}/nltk/translate/gale_church.py +32 -19
  327. {nltk-3.2.1 → nltk-3.3}/nltk/translate/gdfa.py +14 -10
  328. nltk-3.3/nltk/translate/gleu_score.py +193 -0
  329. {nltk-3.2.1 → nltk-3.3}/nltk/translate/ibm1.py +17 -8
  330. {nltk-3.2.1 → nltk-3.3}/nltk/translate/ibm2.py +4 -4
  331. {nltk-3.2.1 → nltk-3.3}/nltk/translate/ibm4.py +1 -1
  332. {nltk-3.2.1 → nltk-3.3}/nltk/translate/ibm5.py +1 -1
  333. {nltk-3.2.1 → nltk-3.3}/nltk/translate/ibm_model.py +4 -1
  334. {nltk-3.2.1 → nltk-3.3}/nltk/translate/metrics.py +1 -1
  335. nltk-3.3/nltk/translate/nist_score.py +178 -0
  336. {nltk-3.2.1 → nltk-3.3}/nltk/translate/phrase_based.py +1 -1
  337. {nltk-3.2.1 → nltk-3.3}/nltk/translate/ribes_score.py +1 -1
  338. {nltk-3.2.1 → nltk-3.3}/nltk/translate/stack_decoder.py +5 -1
  339. {nltk-3.2.1 → nltk-3.3}/nltk/tree.py +10 -8
  340. {nltk-3.2.1 → nltk-3.3}/nltk/treeprettyprinter.py +6 -6
  341. {nltk-3.2.1 → nltk-3.3}/nltk/twitter/__init__.py +1 -1
  342. {nltk-3.2.1 → nltk-3.3}/nltk/twitter/api.py +8 -3
  343. {nltk-3.2.1 → nltk-3.3}/nltk/twitter/common.py +9 -3
  344. {nltk-3.2.1 → nltk-3.3}/nltk/twitter/twitter_demo.py +1 -1
  345. {nltk-3.2.1 → nltk-3.3}/nltk/twitter/twitterclient.py +1 -1
  346. {nltk-3.2.1 → nltk-3.3}/nltk/twitter/util.py +5 -4
  347. {nltk-3.2.1 → nltk-3.3}/nltk/util.py +41 -654
  348. {nltk-3.2.1 → nltk-3.3}/nltk/wsd.py +2 -2
  349. {nltk-3.2.1 → nltk-3.3/nltk.egg-info}/PKG-INFO +13 -5
  350. {nltk-3.2.1 → nltk-3.3}/nltk.egg-info/SOURCES.txt +23 -1
  351. nltk-3.3/nltk.egg-info/requires.txt +31 -0
  352. {nltk-3.2.1 → nltk-3.3}/setup.cfg +0 -1
  353. {nltk-3.2.1 → nltk-3.3}/setup.py +32 -5
  354. nltk-3.2.1/nltk/VERSION +0 -1
  355. nltk-3.2.1/nltk/compat.py +0 -706
  356. nltk-3.2.1/nltk/corpus/reader/pl196x.py +0 -278
  357. nltk-3.2.1/nltk/corpus/reader/verbnet.py +0 -408
  358. nltk-3.2.1/nltk/corpus/reader/wordlist.py +0 -37
  359. nltk-3.2.1/nltk/six.py +0 -868
  360. nltk-3.2.1/nltk/stem/porter.py +0 -692
  361. nltk-3.2.1/nltk/test/unit/test_stem.py +0 -36
  362. nltk-3.2.1/nltk/test/unit/test_tokenize.py +0 -23
  363. nltk-3.2.1/nltk/test/unit/translate/test_bleu.py +0 -138
  364. nltk-3.2.1/nltk/tokenize/stanford_segmenter.py +0 -157
  365. nltk-3.2.1/nltk/tokenize/treebank.py +0 -124
  366. nltk-3.2.1/nltk/tokenize/util.py +0 -90
  367. {nltk-3.2.1 → nltk-3.3}/INSTALL.txt +0 -0
  368. {nltk-3.2.1 → nltk-3.3}/MANIFEST.in +0 -0
  369. {nltk-3.2.1 → nltk-3.3}/nltk/classify/positivenaivebayes.py +0 -0
  370. {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/udhr.py +0 -0
  371. {nltk-3.2.1 → nltk-3.3}/nltk/inference/mace.py +0 -0
  372. {nltk-3.2.1 → nltk-3.3}/nltk/lazyimport.py +0 -0
  373. {nltk-3.2.1 → nltk-3.3}/nltk/misc/babelfish.py +0 -0
  374. {nltk-3.2.1 → nltk-3.3}/nltk/tag/brill_trainer.py +0 -0
  375. {nltk-3.2.1 → nltk-3.3}/nltk/tbl/api.py +0 -0
  376. {nltk-3.2.1 → nltk-3.3}/nltk/test/bleu.doctest +0 -0
  377. {nltk-3.2.1 → nltk-3.3}/nltk/test/childes.doctest +0 -0
  378. {nltk-3.2.1 → nltk-3.3}/nltk/test/corpus_fixt.py +0 -0
  379. {nltk-3.2.1 → nltk-3.3}/nltk/test/paice.doctest +0 -0
  380. {nltk-3.2.1 → nltk-3.3}/nltk/test/portuguese_en_fixt.py +0 -0
  381. {nltk-3.2.1 → nltk-3.3}/nltk/test/segmentation_fixt.py +0 -0
  382. {nltk-3.2.1 → nltk-3.3}/nltk/test/semantics_fixt.py +0 -0
  383. {nltk-3.2.1 → nltk-3.3}/nltk/test/translate_fixt.py +0 -0
  384. {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/__init__.py +0 -0
  385. {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_2x_compat.py +0 -0
  386. {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_corpus_views.py +0 -0
  387. {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_hmm.py +0 -0
  388. {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_naivebayes.py +0 -0
  389. {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_seekable_unicode_stream_reader.py +0 -0
  390. {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_tag.py +0 -0
  391. {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_twitter_auth.py +0 -0
  392. {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/translate/__init__.py +0 -0
  393. {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/translate/test_ibm1.py +0 -0
  394. {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/translate/test_ibm2.py +0 -0
  395. {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/translate/test_ibm3.py +0 -0
  396. {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/translate/test_ibm4.py +0 -0
  397. {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/translate/test_ibm5.py +0 -0
  398. {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/translate/test_ibm_model.py +0 -0
  399. {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/utils.py +0 -0
  400. {nltk-3.2.1 → nltk-3.3}/nltk/translate/ibm3.py +0 -0
  401. {nltk-3.2.1 → nltk-3.3}/nltk/treetransforms.py +0 -0
  402. {nltk-3.2.1 → nltk-3.3}/nltk.egg-info/dependency_links.txt +0 -0
  403. {nltk-3.2.1 → nltk-3.3}/nltk.egg-info/not-zip-safe +0 -0
  404. {nltk-3.2.1 → nltk-3.3}/nltk.egg-info/top_level.txt +0 -0
@@ -0,0 +1,137 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Natural Language Toolkit: ChrF score
3
+ #
4
+ # Copyright (C) 2001-2018 NLTK Project
5
+ # Authors: Maja Popovic
6
+ # Contributors: Liling Tan
7
+ # URL: <http://nltk.org/>
8
+ # For license information, see LICENSE.TXT
9
+
10
+ """ ChrF score implementation """
11
+ from __future__ import division
12
+ from collections import Counter
13
+
14
+ from nltk.util import ngrams, everygrams
15
+
16
+ def sentence_chrf(reference, hypothesis, min_len=1, max_len=6, beta=3.0):
17
+ """
18
+ Calculates the sentence level CHRF (Character n-gram F-score) described in
19
+ - Maja Popovic. 2015. CHRF: Character n-gram F-score for Automatic MT Evaluation.
20
+ In Proceedings of the 10th Workshop on Machine Translation.
21
+ http://www.statmt.org/wmt15/pdf/WMT49.pdf
22
+ - Maja Popovic. 2016. CHRF Deconstructed: β Parameters and n-gram Weights.
23
+ In Proceedings of the 1st Conference on Machine Translation.
24
+ http://www.statmt.org/wmt16/pdf/W16-2341.pdf
25
+
26
+ Unlike multi-reference BLEU, CHRF only supports a single reference.
27
+
28
+ An example from the original BLEU paper
29
+ http://www.aclweb.org/anthology/P02-1040.pdf
30
+
31
+ >>> ref1 = str('It is a guide to action that ensures that the military '
32
+ ... 'will forever heed Party commands').split()
33
+ >>> hyp1 = str('It is a guide to action which ensures that the military '
34
+ ... 'always obeys the commands of the party').split()
35
+ >>> hyp2 = str('It is to insure the troops forever hearing the activity '
36
+ ... 'guidebook that party direct').split()
37
+ >>> sentence_chrf(ref1, hyp1) # doctest: +ELLIPSIS
38
+ 0.6768...
39
+ >>> sentence_chrf(ref1, hyp2) # doctest: +ELLIPSIS
40
+ 0.4201...
41
+
42
+ The infamous "the the the ... " example
43
+
44
+ >>> ref = 'the cat is on the mat'.split()
45
+ >>> hyp = 'the the the the the the the'.split()
46
+ >>> sentence_chrf(ref, hyp) # doctest: +ELLIPSIS
47
+ 0.2530...
48
+
49
+ An example to show that this function allows users to use strings instead of
50
+ tokens, i.e. list(str) as inputs.
51
+
52
+ >>> ref1 = str('It is a guide to action that ensures that the military '
53
+ ... 'will forever heed Party commands')
54
+ >>> hyp1 = str('It is a guide to action which ensures that the military '
55
+ ... 'always obeys the commands of the party')
56
+ >>> sentence_chrf(ref1, hyp1) # doctest: +ELLIPSIS
57
+ 0.6768...
58
+ >>> type(ref1) == type(hyp1) == str
59
+ True
60
+ >>> sentence_chrf(ref1.split(), hyp1.split()) # doctest: +ELLIPSIS
61
+ 0.6768...
62
+
63
+ To skip the unigrams and only use 2- to 3-grams:
64
+
65
+ >>> sentence_chrf(ref1, hyp1, min_len=2, max_len=3) # doctest: +ELLIPSIS
66
+ 0.7018...
67
+
68
+ :param references: reference sentence
69
+ :type references: list(str) / str
70
+ :param hypothesis: a hypothesis sentence
71
+ :type hypothesis: list(str) / str
72
+ :param min_len: The minimum order of n-gram this function should extract.
73
+ :type min_len: int
74
+ :param max_len: The maximum order of n-gram this function should extract.
75
+ :type max_len: int
76
+ :param beta: the parameter to assign more importance to recall over precision
77
+ :type beta: float
78
+ :return: the sentence level CHRF score.
79
+ :rtype: float
80
+ """
81
+ return corpus_chrf([reference], [hypothesis], min_len, max_len, beta=beta)
82
+
83
+
84
+ def corpus_chrf(list_of_references, hypotheses, min_len=1, max_len=6, beta=3.0):
85
+ """
86
+ Calculates the corpus level CHRF (Character n-gram F-score), it is the
87
+ micro-averaged value of the sentence/segment level CHRF score.
88
+
89
+ CHRF only supports a single reference.
90
+
91
+ >>> ref1 = str('It is a guide to action that ensures that the military '
92
+ ... 'will forever heed Party commands').split()
93
+ >>> ref2 = str('It is the guiding principle which guarantees the military '
94
+ ... 'forces always being under the command of the Party').split()
95
+ >>>
96
+ >>> hyp1 = str('It is a guide to action which ensures that the military '
97
+ ... 'always obeys the commands of the party').split()
98
+ >>> hyp2 = str('It is to insure the troops forever hearing the activity '
99
+ ... 'guidebook that party direct')
100
+ >>> corpus_chrf([ref1, ref2, ref1, ref2], [hyp1, hyp2, hyp2, hyp1]) # doctest: +ELLIPSIS
101
+ 0.4915...
102
+
103
+ :param references: a corpus of list of reference sentences, w.r.t. hypotheses
104
+ :type references: list(list(str)) / list(str)
105
+ :param hypotheses: a list of hypothesis sentences
106
+ :type hypotheses: list(list(str)) / list(str)
107
+ :param min_len: The minimum order of n-gram this function should extract.
108
+ :type min_len: int
109
+ :param max_len: The maximum order of n-gram this function should extract.
110
+ :type max_len: int
111
+ :param beta: the parameter to assign more importance to recall over precision
112
+ :type beta: float
113
+ :return: the sentence level CHRF score.
114
+ :rtype: float
115
+ """
116
+
117
+ assert len(list_of_references) == len(hypotheses), "The number of hypotheses and their references should be the same"
118
+
119
+ # Iterate through each hypothesis and their corresponding references.
120
+ for reference, hypothesis in zip(list_of_references, hypotheses):
121
+ # Cheating condition to allow users to input strings instead of tokens.
122
+ if type(reference) and type(hypothesis) != str:
123
+ reference, hypothesis = ' '.join(reference), ' '.join(hypothesis)
124
+ # For each order of ngram, calculate the no. of ngram matches and
125
+ # keep track of no. of ngram in references.
126
+ ref_ngrams = Counter(everygrams(reference, min_len, max_len))
127
+ hyp_ngrams = Counter(everygrams(hypothesis, min_len, max_len))
128
+ overlap_ngrams = ref_ngrams & hyp_ngrams
129
+ tp = sum(overlap_ngrams.values()) # True positives.
130
+ tpfp = sum(hyp_ngrams.values()) # True positives + False positives.
131
+ tffn = sum(ref_ngrams.values()) # True posities + False negatives.
132
+
133
+ precision = tp / tpfp
134
+ recall = tp / tffn
135
+ factor = beta**2
136
+ score = (1+ factor ) * (precision * recall) / ( factor * precision + recall)
137
+ return score
@@ -2,8 +2,9 @@
2
2
 
3
3
  # Natural Language Toolkit: Gale-Church Aligner
4
4
  #
5
- # Copyright (C) 2001-2013 NLTK Project
5
+ # Copyright (C) 2001-2018 NLTK Project
6
6
  # Author: Torsten Marek <marek@ifi.uzh.ch>
7
+ # Contributor: Cassidy Laidlaw, Liling Tan
7
8
  # URL: <http://nltk.org/>
8
9
  # For license information, see LICENSE.TXT
9
10
 
@@ -76,16 +77,30 @@ class LanguageIndependent(object):
76
77
  VARIANCE_CHARACTERS = 6.8
77
78
 
78
79
 
79
- def trace(backlinks, source, target):
80
+ def trace(backlinks, source_sents_lens, target_sents_lens):
81
+ """
82
+ Traverse the alignment cost from the tracebacks and retrieves
83
+ appropriate sentence pairs.
84
+
85
+ :param backlinks: A dictionary where the key is the alignment points and value is the cost (referencing the LanguageIndependent.PRIORS)
86
+ :type backlinks: dict
87
+ :param source_sents_lens: A list of target sentences' lengths
88
+ :type source_sents_lens: list(int)
89
+ :param target_sents_lens: A list of target sentences' lengths
90
+ :type target_sents_lens: list(int)
91
+ """
80
92
  links = []
81
- pos = (len(source), len(target))
82
-
83
- while pos != (0, 0):
84
- s, t = backlinks[pos]
93
+ position = (len(source_sents_lens), len(target_sents_lens))
94
+ while position != (0, 0) and all(p >=0 for p in position):
95
+ try:
96
+ s, t = backlinks[position]
97
+ except TypeError:
98
+ position = (position[0]-1 , position[1]-1)
99
+ continue
85
100
  for i in range(s):
86
101
  for j in range(t):
87
- links.append((pos[0] - i - 1, pos[1] - j - 1))
88
- pos = (pos[0] - s, pos[1] - t)
102
+ links.append((position[0] - i - 1, position[1] - j - 1))
103
+ position = (position[0] - s, position[1] - t)
89
104
 
90
105
  return links[::-1]
91
106
 
@@ -116,7 +131,7 @@ def align_log_prob(i, j, source_sents, target_sents, alignment, params):
116
131
  return - (LOG2 + norm_logsf(abs(delta)) + math.log(params.PRIORS[alignment]))
117
132
 
118
133
 
119
- def align_blocks(source_sents, target_sents, params = LanguageIndependent):
134
+ def align_blocks(source_sents_lens, target_sents_lens, params = LanguageIndependent):
120
135
  """Return the sentence alignment of two text blocks (usually paragraphs).
121
136
 
122
137
  >>> align_blocks([5,5,5], [7,7,7])
@@ -128,8 +143,8 @@ def align_blocks(source_sents, target_sents, params = LanguageIndependent):
128
143
  >>> align_blocks([10,2,10,10,2,10], [12,3,20,3,12])
129
144
  [(0, 0), (1, 1), (2, 2), (3, 2), (4, 3), (5, 4)]
130
145
 
131
- @param source_sents: The list of source sentence lengths.
132
- @param target_sents: The list of target sentence lengths.
146
+ @param source_sents_lens: The list of source sentence lengths.
147
+ @param target_sents_lens: The list of target sentence lengths.
133
148
  @param params: the sentence alignment parameters.
134
149
  @return: The sentence alignments, a list of index pairs.
135
150
  """
@@ -141,8 +156,8 @@ def align_blocks(source_sents, target_sents, params = LanguageIndependent):
141
156
 
142
157
  backlinks = {}
143
158
 
144
- for i in range(len(source_sents) + 1):
145
- for j in range(len(target_sents) + 1):
159
+ for i in range(len(source_sents_lens) + 1):
160
+ for j in range(len(target_sents_lens) + 1):
146
161
  min_dist = float('inf')
147
162
  min_align = None
148
163
  for a in alignment_types:
@@ -150,7 +165,8 @@ def align_blocks(source_sents, target_sents, params = LanguageIndependent):
150
165
  prev_j = j - a[1]
151
166
  if prev_i < -len(D) or prev_j < 0:
152
167
  continue
153
- p = D[prev_i][prev_j] + align_log_prob(i, j, source_sents, target_sents, a, params)
168
+ p = D[prev_i][prev_j] + align_log_prob(i, j, source_sents_lens,
169
+ target_sents_lens, a, params)
154
170
  if p < min_dist:
155
171
  min_dist = p
156
172
  min_align = a
@@ -164,8 +180,8 @@ def align_blocks(source_sents, target_sents, params = LanguageIndependent):
164
180
  if len(D) > 2:
165
181
  D.pop(0)
166
182
  D.append([])
167
-
168
- return trace(backlinks, source_sents, target_sents)
183
+
184
+ return trace(backlinks, source_sents_lens, target_sents_lens)
169
185
 
170
186
 
171
187
  def align_texts(source_blocks, target_blocks, params = LanguageIndependent):
@@ -230,6 +246,3 @@ def parse_token_stream(stream, soft_delimiter, hard_delimiter):
230
246
  # print align_texts(source, target)
231
247
 
232
248
 
233
-
234
-
235
-
@@ -1,12 +1,11 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # Natural Language Toolkit: GDFA word alignment symmetrization
3
3
  #
4
- # Copyright (C) 2001-2016 NLTK Project
4
+ # Copyright (C) 2001-2018 NLTK Project
5
5
  # Authors: Liling Tan
6
6
  # URL: <http://nltk.org/>
7
7
  # For license information, see LICENSE.TXT
8
8
 
9
- import codecs
10
9
  from collections import defaultdict
11
10
 
12
11
  def grow_diag_final_and(srclen, trglen, e2f, f2e):
@@ -39,12 +38,12 @@ def grow_diag_final_and(srclen, trglen, e2f, f2e):
39
38
  >>> trglen = len(trgtext.split())
40
39
  >>>
41
40
  >>> gdfa = grow_diag_final_and(srclen, trglen, forw, back)
42
- >>> gdfa == set([(28, 18), (6, 6), (24, 17), (2, 1), (15, 12), (13, 12),
41
+ >>> gdfa == sorted(set([(28, 18), (6, 6), (24, 17), (2, 1), (15, 12), (13, 12),
43
42
  ... (2, 9), (3, 10), (26, 17), (25, 15), (8, 6), (9, 7), (20,
44
43
  ... 13), (18, 13), (0, 0), (10, 4), (13, 15), (23, 14), (7, 5),
45
44
  ... (25, 14), (1, 9), (17, 13), (4, 11), (11, 17), (9, 2), (22,
46
45
  ... 12), (27, 18), (24, 16), (21, 3), (19, 12), (17, 12), (5,
47
- ... 12), (11, 6), (12, 8)])
46
+ ... 12), (11, 6), (12, 8)]))
48
47
  True
49
48
 
50
49
  References:
@@ -73,12 +72,12 @@ def grow_diag_final_and(srclen, trglen, e2f, f2e):
73
72
  neighbors = [(-1,0),(0,-1),(1,0),(0,1),(-1,-1),(-1,1),(1,-1),(1,1)]
74
73
  alignment = set(e2f).intersection(set(f2e)) # Find the intersection.
75
74
  union = set(e2f).union(set(f2e))
76
-
75
+
77
76
  # *aligned* is used to check if neighbors are aligned in grow_diag()
78
77
  aligned = defaultdict(set)
79
78
  for i,j in alignment:
80
79
  aligned['e'].add(i)
81
- aligned['j'].add(j)
80
+ aligned['f'].add(j)
82
81
 
83
82
  def grow_diag():
84
83
  """
@@ -88,6 +87,7 @@ def grow_diag_final_and(srclen, trglen, e2f, f2e):
88
87
  prev_len = len(alignment) - 1
89
88
  # iterate until no new points added
90
89
  while prev_len < len(alignment):
90
+ no_new_points = True
91
91
  # for english word e = 0 ... en
92
92
  for e in range(srclen):
93
93
  # for foreign word f = 0 ... fn
@@ -105,6 +105,11 @@ def grow_diag_final_and(srclen, trglen, e2f, f2e):
105
105
  alignment.add(neighbor)
106
106
  aligned['e'].add(e_new); aligned['f'].add(f_new)
107
107
  prev_len+=1
108
+ no_new_points = False
109
+ # iterate until no new points added
110
+ if no_new_points:
111
+ break
112
+
108
113
 
109
114
  def final_and(a):
110
115
  """
@@ -119,13 +124,12 @@ def grow_diag_final_and(srclen, trglen, e2f, f2e):
119
124
  # and (e-new, f-new in union(e2f, f2e) )
120
125
  if (e_new not in aligned
121
126
  and f_new not in aligned
122
- and (e_new, f_new) in a):
123
-
127
+ and (e_new, f_new) in union):
124
128
  alignment.add((e_new, f_new))
125
129
  aligned['e'].add(e_new); aligned['f'].add(f_new)
126
130
 
131
+
127
132
  grow_diag()
128
133
  final_and(e2f)
129
134
  final_and(f2e)
130
- return alignment
131
-
135
+ return sorted(alignment)
@@ -0,0 +1,193 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Natural Language Toolkit: GLEU Score
3
+ #
4
+ # Copyright (C) 2001-2018 NLTK Project
5
+ # Authors:
6
+ # Contributors: Mike Schuster, Michael Wayne Goodman, Liling Tan
7
+ # URL: <http://nltk.org/>
8
+ # For license information, see LICENSE.TXT
9
+
10
+ """ GLEU score implementation. """
11
+ from __future__ import division
12
+ from collections import Counter
13
+
14
+ from nltk.util import ngrams, everygrams
15
+
16
+
17
+ def sentence_gleu(references, hypothesis, min_len=1, max_len=4):
18
+ """
19
+ Calculates the sentence level GLEU (Google-BLEU) score described in
20
+
21
+ Yonghui Wu, Mike Schuster, Zhifeng Chen, Quoc V. Le, Mohammad Norouzi,
22
+ Wolfgang Macherey, Maxim Krikun, Yuan Cao, Qin Gao, Klaus Macherey,
23
+ Jeff Klingner, Apurva Shah, Melvin Johnson, Xiaobing Liu, Lukasz Kaiser,
24
+ Stephan Gouws, Yoshikiyo Kato, Taku Kudo, Hideto Kazawa, Keith Stevens,
25
+ George Kurian, Nishant Patil, Wei Wang, Cliff Young, Jason Smith,
26
+ Jason Riesa, Alex Rudnick, Oriol Vinyals, Greg Corrado, Macduff Hughes,
27
+ Jeffrey Dean. (2016) Google’s Neural Machine Translation System:
28
+ Bridging the Gap between Human and Machine Translation.
29
+ eprint arXiv:1609.08144. https://arxiv.org/pdf/1609.08144v2.pdf
30
+ Retrieved on 27 Oct 2016.
31
+
32
+ From Wu et al. (2016):
33
+ "The BLEU score has some undesirable properties when used for single
34
+ sentences, as it was designed to be a corpus measure. We therefore
35
+ use a slightly different score for our RL experiments which we call
36
+ the 'GLEU score'. For the GLEU score, we record all sub-sequences of
37
+ 1, 2, 3 or 4 tokens in output and target sequence (n-grams). We then
38
+ compute a recall, which is the ratio of the number of matching n-grams
39
+ to the number of total n-grams in the target (ground truth) sequence,
40
+ and a precision, which is the ratio of the number of matching n-grams
41
+ to the number of total n-grams in the generated output sequence. Then
42
+ GLEU score is simply the minimum of recall and precision. This GLEU
43
+ score's range is always between 0 (no matches) and 1 (all match) and
44
+ it is symmetrical when switching output and target. According to
45
+ our experiments, GLEU score correlates quite well with the BLEU
46
+ metric on a corpus level but does not have its drawbacks for our per
47
+ sentence reward objective."
48
+
49
+ Note: The initial implementation only allowed a single reference, but now
50
+ a list of references is required (which is consistent with
51
+ bleu_score.sentence_bleu()).
52
+
53
+ The infamous "the the the ... " example
54
+
55
+ >>> ref = 'the cat is on the mat'.split()
56
+ >>> hyp = 'the the the the the the the'.split()
57
+ >>> sentence_gleu([ref], hyp) # doctest: +ELLIPSIS
58
+ 0.0909...
59
+
60
+ An example to evaluate normal machine translation outputs
61
+
62
+ >>> ref1 = str('It is a guide to action that ensures that the military '
63
+ ... 'will forever heed Party commands').split()
64
+ >>> hyp1 = str('It is a guide to action which ensures that the military '
65
+ ... 'always obeys the commands of the party').split()
66
+ >>> hyp2 = str('It is to insure the troops forever hearing the activity '
67
+ ... 'guidebook that party direct').split()
68
+ >>> sentence_gleu([ref1], hyp1) # doctest: +ELLIPSIS
69
+ 0.4393...
70
+ >>> sentence_gleu([ref1], hyp2) # doctest: +ELLIPSIS
71
+ 0.1206...
72
+
73
+ :param references: a list of reference sentences
74
+ :type references: list(list(str))
75
+ :param hypothesis: a hypothesis sentence
76
+ :type hypothesis: list(str)
77
+ :param min_len: The minimum order of n-gram this function should extract.
78
+ :type min_len: int
79
+ :param max_len: The maximum order of n-gram this function should extract.
80
+ :type max_len: int
81
+ :return: the sentence level GLEU score.
82
+ :rtype: float
83
+ """
84
+ return corpus_gleu(
85
+ [references],
86
+ [hypothesis],
87
+ min_len=min_len,
88
+ max_len=max_len
89
+ )
90
+
91
+ def corpus_gleu(list_of_references, hypotheses, min_len=1, max_len=4):
92
+ """
93
+ Calculate a single corpus-level GLEU score (aka. system-level GLEU) for all
94
+ the hypotheses and their respective references.
95
+
96
+ Instead of averaging the sentence level GLEU scores (i.e. macro-average
97
+ precision), Wu et al. (2016) sum up the matching tokens and the max of
98
+ hypothesis and reference tokens for each sentence, then compute using the
99
+ aggregate values.
100
+
101
+ From Mike Schuster (via email):
102
+ "For the corpus, we just add up the two statistics n_match and
103
+ n_all = max(n_all_output, n_all_target) for all sentences, then
104
+ calculate gleu_score = n_match / n_all, so it is not just a mean of
105
+ the sentence gleu scores (in our case, longer sentences count more,
106
+ which I think makes sense as they are more difficult to translate)."
107
+
108
+ >>> hyp1 = ['It', 'is', 'a', 'guide', 'to', 'action', 'which',
109
+ ... 'ensures', 'that', 'the', 'military', 'always',
110
+ ... 'obeys', 'the', 'commands', 'of', 'the', 'party']
111
+ >>> ref1a = ['It', 'is', 'a', 'guide', 'to', 'action', 'that',
112
+ ... 'ensures', 'that', 'the', 'military', 'will', 'forever',
113
+ ... 'heed', 'Party', 'commands']
114
+ >>> ref1b = ['It', 'is', 'the', 'guiding', 'principle', 'which',
115
+ ... 'guarantees', 'the', 'military', 'forces', 'always',
116
+ ... 'being', 'under', 'the', 'command', 'of', 'the', 'Party']
117
+ >>> ref1c = ['It', 'is', 'the', 'practical', 'guide', 'for', 'the',
118
+ ... 'army', 'always', 'to', 'heed', 'the', 'directions',
119
+ ... 'of', 'the', 'party']
120
+
121
+ >>> hyp2 = ['he', 'read', 'the', 'book', 'because', 'he', 'was',
122
+ ... 'interested', 'in', 'world', 'history']
123
+ >>> ref2a = ['he', 'was', 'interested', 'in', 'world', 'history',
124
+ ... 'because', 'he', 'read', 'the', 'book']
125
+
126
+ >>> list_of_references = [[ref1a, ref1b, ref1c], [ref2a]]
127
+ >>> hypotheses = [hyp1, hyp2]
128
+ >>> corpus_gleu(list_of_references, hypotheses) # doctest: +ELLIPSIS
129
+ 0.5673...
130
+
131
+ The example below show that corpus_gleu() is different from averaging
132
+ sentence_gleu() for hypotheses
133
+
134
+ >>> score1 = sentence_gleu([ref1a], hyp1)
135
+ >>> score2 = sentence_gleu([ref2a], hyp2)
136
+ >>> (score1 + score2) / 2 # doctest: +ELLIPSIS
137
+ 0.6144...
138
+
139
+ :param list_of_references: a list of reference sentences, w.r.t. hypotheses
140
+ :type list_of_references: list(list(list(str)))
141
+ :param hypotheses: a list of hypothesis sentences
142
+ :type hypotheses: list(list(str))
143
+ :param min_len: The minimum order of n-gram this function should extract.
144
+ :type min_len: int
145
+ :param max_len: The maximum order of n-gram this function should extract.
146
+ :type max_len: int
147
+ :return: The corpus-level GLEU score.
148
+ :rtype: float
149
+ """
150
+ # sanity check
151
+ assert len(list_of_references) == len(hypotheses), "The number of hypotheses and their reference(s) should be the same"
152
+
153
+ # sum matches and max-token-lengths over all sentences
154
+ corpus_n_match = 0
155
+ corpus_n_all = 0
156
+
157
+ for references, hypothesis in zip(list_of_references, hypotheses):
158
+ hyp_ngrams = Counter(everygrams(hypothesis, min_len, max_len))
159
+ tpfp = sum(hyp_ngrams.values()) # True positives + False positives.
160
+
161
+ hyp_counts = []
162
+ for reference in references:
163
+ ref_ngrams = Counter(everygrams(reference, min_len, max_len))
164
+ tpfn = sum(ref_ngrams.values()) # True positives + False negatives.
165
+
166
+ overlap_ngrams = ref_ngrams & hyp_ngrams
167
+ tp = sum(overlap_ngrams.values()) # True positives.
168
+
169
+ # While GLEU is defined as the minimum of precision and
170
+ # recall, we can reduce the number of division operations by one by
171
+ # instead finding the maximum of the denominators for the precision
172
+ # and recall formulae, since the numerators are the same:
173
+ # precision = tp / tpfp
174
+ # recall = tp / tpfn
175
+ # gleu_score = min(precision, recall) == tp / max(tpfp, tpfn)
176
+ n_all = max(tpfp, tpfn)
177
+
178
+ if n_all > 0:
179
+ hyp_counts.append((tp, n_all))
180
+
181
+ # use the reference yielding the highest score
182
+ if hyp_counts:
183
+ n_match, n_all = max(hyp_counts, key=lambda hc: hc[0]/hc[1])
184
+ corpus_n_match += n_match
185
+ corpus_n_all += n_all
186
+
187
+ # corner case: empty corpus or empty references---don't divide by zero!
188
+ if corpus_n_all == 0:
189
+ gleu_score = 0.0
190
+ else:
191
+ gleu_score = corpus_n_match / corpus_n_all
192
+
193
+ return gleu_score
@@ -15,16 +15,25 @@
15
15
  """
16
16
  Lexical translation model that ignores word order.
17
17
 
18
- In IBM Model 1, word order is ignored for simplicity. Thus, the
19
- following two alignments are equally likely.
18
+ In IBM Model 1, word order is ignored for simplicity. As long as the
19
+ word alignments are equivalent, it doesn't matter where the word occurs
20
+ in the source or target sentence. Thus, the following three alignments
21
+ are equally likely.
20
22
 
21
23
  Source: je mange du jambon
22
24
  Target: i eat some ham
23
- Alignment: (1,1) (2,2) (3,3) (4,4)
25
+ Alignment: (0,0) (1,1) (2,2) (3,3)
24
26
 
25
27
  Source: je mange du jambon
26
28
  Target: some ham eat i
27
- Alignment: (1,4) (2,3) (3,2) (4,1)
29
+ Alignment: (0,2) (1,3) (2,1) (3,1)
30
+
31
+ Source: du jambon je mange
32
+ Target: eat i some ham
33
+ Alignment: (0,3) (1,2) (2,0) (3,1)
34
+
35
+ Note that an alignment is represented here as
36
+ (word_index_in_target, word_index_in_source).
28
37
 
29
38
  The EM algorithm used in Model 1 is:
30
39
  E step - In the training data, count how many times a source language
@@ -130,7 +139,7 @@ class IBMModel1(IBMModel):
130
139
  for n in range(0, iterations):
131
140
  self.train(sentence_aligned_corpus)
132
141
 
133
- self.__align_all(sentence_aligned_corpus)
142
+ self.align_all(sentence_aligned_corpus)
134
143
 
135
144
  def set_uniform_probabilities(self, sentence_aligned_corpus):
136
145
  initial_prob = 1 / len(self.trg_vocab)
@@ -205,11 +214,11 @@ class IBMModel1(IBMModel):
205
214
 
206
215
  return max(prob, IBMModel.MIN_PROB)
207
216
 
208
- def __align_all(self, parallel_corpus):
217
+ def align_all(self, parallel_corpus):
209
218
  for sentence_pair in parallel_corpus:
210
- self.__align(sentence_pair)
219
+ self.align(sentence_pair)
211
220
 
212
- def __align(self, sentence_pair):
221
+ def align(self, sentence_pair):
213
222
  """
214
223
  Determines the best word alignment for one sentence pair from
215
224
  the corpus that the model was trained on.
@@ -136,7 +136,7 @@ class IBMModel2(IBMModel):
136
136
  for n in range(0, iterations):
137
137
  self.train(sentence_aligned_corpus)
138
138
 
139
- self.__align_all(sentence_aligned_corpus)
139
+ self.align_all(sentence_aligned_corpus)
140
140
 
141
141
  def set_uniform_probabilities(self, sentence_aligned_corpus):
142
142
  # a(i | j,l,m) = 1 / (l+1) for all i, j, l, m
@@ -245,11 +245,11 @@ class IBMModel2(IBMModel):
245
245
 
246
246
  return max(prob, IBMModel.MIN_PROB)
247
247
 
248
- def __align_all(self, parallel_corpus):
248
+ def align_all(self, parallel_corpus):
249
249
  for sentence_pair in parallel_corpus:
250
- self.__align(sentence_pair)
250
+ self.align(sentence_pair)
251
251
 
252
- def __align(self, sentence_pair):
252
+ def align(self, sentence_pair):
253
253
  """
254
254
  Determines the best word alignment for one sentence pair from
255
255
  the corpus that the model was trained on.
@@ -1,7 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # Natural Language Toolkit: IBM Model 4
3
3
  #
4
- # Copyright (C) 2001-2016 NLTK Project
4
+ # Copyright (C) 2001-2018 NLTK Project
5
5
  # Author: Tah Wei Hoon <hoon.tw@gmail.com>
6
6
  # URL: <http://nltk.org/>
7
7
  # For license information, see LICENSE.TXT
@@ -1,7 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # Natural Language Toolkit: IBM Model 5
3
3
  #
4
- # Copyright (C) 2001-2016 NLTK Project
4
+ # Copyright (C) 2001-2018 NLTK Project
5
5
  # Author: Tah Wei Hoon <hoon.tw@gmail.com>
6
6
  # URL: <http://nltk.org/>
7
7
  # For license information, see LICENSE.TXT
@@ -1,7 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # Natural Language Toolkit: IBM Model Core
3
3
  #
4
- # Copyright (C) 2001-2016 NLTK Project
4
+ # Copyright (C) 2001-2018 NLTK Project
5
5
  # Author: Tah Wei Hoon <hoon.tw@gmail.com>
6
6
  # URL: <http://nltk.org/>
7
7
  # For license information, see LICENSE.TXT
@@ -496,6 +496,9 @@ class AlignmentInfo(object):
496
496
  def __eq__(self, other):
497
497
  return self.alignment == other.alignment
498
498
 
499
+ def __ne__(self, other):
500
+ return not self == other
501
+
499
502
  def __hash__(self):
500
503
  return hash(self.alignment)
501
504
 
@@ -1,6 +1,6 @@
1
1
  # Natural Language Toolkit: Translation metrics
2
2
  #
3
- # Copyright (C) 2001-2016 NLTK Project
3
+ # Copyright (C) 2001-2018 NLTK Project
4
4
  # Author: Will Zhang <wilzzha@gmail.com>
5
5
  # Guan Gui <ggui@student.unimelb.edu.au>
6
6
  # Steven Bird <stevenbird1@gmail.com>