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,244 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ Tests for BLEU translation evaluation metric
4
+ """
5
+
6
+ import functools
7
+ import io
8
+ import unittest
9
+
10
+ from nltk.data import find
11
+ from nltk.translate.bleu_score import modified_precision, brevity_penalty, closest_ref_length
12
+ from nltk.translate.bleu_score import sentence_bleu, corpus_bleu, SmoothingFunction
13
+
14
+
15
+ class TestBLEU(unittest.TestCase):
16
+ def test_modified_precision(self):
17
+ """
18
+ Examples from the original BLEU paper
19
+ http://www.aclweb.org/anthology/P02-1040.pdf
20
+ """
21
+ # Example 1: the "the*" example.
22
+ # Reference sentences.
23
+ ref1 = 'the cat is on the mat'.split()
24
+ ref2 = 'there is a cat on the mat'.split()
25
+ # Hypothesis sentence(s).
26
+ hyp1 = 'the the the the the the the'.split()
27
+
28
+ references = [ref1, ref2]
29
+
30
+ # Testing modified unigram precision.
31
+ hyp1_unigram_precision = float(modified_precision(references, hyp1, n=1))
32
+ assert (round(hyp1_unigram_precision, 4) == 0.2857)
33
+ # With assertAlmostEqual at 4 place precision.
34
+ self.assertAlmostEqual(hyp1_unigram_precision, 0.28571428, places=4)
35
+
36
+ # Testing modified bigram precision.
37
+ assert(float(modified_precision(references, hyp1, n=2)) == 0.0)
38
+
39
+
40
+ # Example 2: the "of the" example.
41
+ # Reference sentences
42
+ ref1 = str('It is a guide to action that ensures that the military '
43
+ 'will forever heed Party commands').split()
44
+ ref2 = str('It is the guiding principle which guarantees the military '
45
+ 'forces always being under the command of the Party').split()
46
+ ref3 = str('It is the practical guide for the army always to heed '
47
+ 'the directions of the party').split()
48
+ # Hypothesis sentence(s).
49
+ hyp1 = 'of the'.split()
50
+
51
+ references = [ref1, ref2, ref3]
52
+ # Testing modified unigram precision.
53
+ assert (float(modified_precision(references, hyp1, n=1)) == 1.0)
54
+
55
+ # Testing modified bigram precision.
56
+ assert(float(modified_precision(references, hyp1, n=2)) == 1.0)
57
+
58
+
59
+ # Example 3: Proper MT outputs.
60
+ hyp1 = str('It is a guide to action which ensures that the military '
61
+ 'always obeys the commands of the party').split()
62
+ hyp2 = str('It is to insure the troops forever hearing the activity '
63
+ 'guidebook that party direct').split()
64
+
65
+ references = [ref1, ref2, ref3]
66
+
67
+ # Unigram precision.
68
+ hyp1_unigram_precision = float(modified_precision(references, hyp1, n=1))
69
+ hyp2_unigram_precision = float(modified_precision(references, hyp2, n=1))
70
+ # Test unigram precision with assertAlmostEqual at 4 place precision.
71
+ self.assertAlmostEqual(hyp1_unigram_precision, 0.94444444, places=4)
72
+ self.assertAlmostEqual(hyp2_unigram_precision, 0.57142857, places=4)
73
+ # Test unigram precision with rounding.
74
+ assert (round(hyp1_unigram_precision, 4) == 0.9444)
75
+ assert (round(hyp2_unigram_precision, 4) == 0.5714)
76
+
77
+ # Bigram precision
78
+ hyp1_bigram_precision = float(modified_precision(references, hyp1, n=2))
79
+ hyp2_bigram_precision = float(modified_precision(references, hyp2, n=2))
80
+ # Test bigram precision with assertAlmostEqual at 4 place precision.
81
+ self.assertAlmostEqual(hyp1_bigram_precision, 0.58823529, places=4)
82
+ self.assertAlmostEqual(hyp2_bigram_precision, 0.07692307, places=4)
83
+ # Test bigram precision with rounding.
84
+ assert (round(hyp1_bigram_precision, 4) == 0.5882)
85
+ assert (round(hyp2_bigram_precision, 4) == 0.0769)
86
+
87
+ def test_brevity_penalty(self):
88
+ # Test case from brevity_penalty_closest function in mteval-v13a.pl.
89
+ # Same test cases as in the doctest in nltk.translate.bleu_score.py
90
+ references = [['a'] * 11, ['a'] * 8]
91
+ hypothesis = ['a'] * 7
92
+ hyp_len = len(hypothesis)
93
+ closest_ref_len = closest_ref_length(references, hyp_len)
94
+ self.assertAlmostEqual(brevity_penalty(closest_ref_len, hyp_len), 0.8669, places=4)
95
+
96
+ references = [['a'] * 11, ['a'] * 8, ['a'] * 6, ['a'] * 7]
97
+ hypothesis = ['a'] * 7
98
+ hyp_len = len(hypothesis)
99
+ closest_ref_len = closest_ref_length(references, hyp_len)
100
+ assert brevity_penalty(closest_ref_len, hyp_len) == 1.0
101
+
102
+ def test_zero_matches(self):
103
+ # Test case where there's 0 matches
104
+ references = ['The candidate has no alignment to any of the references'.split()]
105
+ hypothesis = 'John loves Mary'.split()
106
+
107
+ # Test BLEU to nth order of n-grams, where n is len(hypothesis).
108
+ for n in range(1,len(hypothesis)):
109
+ weights = [1.0/n] * n # Uniform weights.
110
+ assert(sentence_bleu(references, hypothesis, weights) == 0)
111
+
112
+ def test_full_matches(self):
113
+ # Test case where there's 100% matches
114
+ references = ['John loves Mary'.split()]
115
+ hypothesis = 'John loves Mary'.split()
116
+
117
+ # Test BLEU to nth order of n-grams, where n is len(hypothesis).
118
+ for n in range(1,len(hypothesis)):
119
+ weights = [1.0/n] * n # Uniform weights.
120
+ assert(sentence_bleu(references, hypothesis, weights) == 1.0)
121
+
122
+ def test_partial_matches_hypothesis_longer_than_reference(self):
123
+ references = ['John loves Mary'.split()]
124
+ hypothesis = 'John loves Mary who loves Mike'.split()
125
+ # Since no 4-grams matches were found the result should be zero
126
+ # exp(w_1 * 1 * w_2 * 1 * w_3 * 1 * w_4 * -inf) = 0
127
+ self.assertAlmostEqual(sentence_bleu(references, hypothesis), 0.0, places=4)
128
+ # Checks that the warning has been raised because len(reference) < 4.
129
+ try:
130
+ self.assertWarns(UserWarning, sentence_bleu, references, hypothesis)
131
+ except AttributeError:
132
+ pass # unittest.TestCase.assertWarns is only supported in Python >= 3.2.
133
+
134
+
135
+ #@unittest.skip("Skipping fringe cases for BLEU.")
136
+ class TestBLEUFringeCases(unittest.TestCase):
137
+
138
+ def test_case_where_n_is_bigger_than_hypothesis_length(self):
139
+ # Test BLEU to nth order of n-grams, where n > len(hypothesis).
140
+ references = ['John loves Mary ?'.split()]
141
+ hypothesis = 'John loves Mary'.split()
142
+ n = len(hypothesis) + 1 #
143
+ weights = [1.0/n] * n # Uniform weights.
144
+ # Since no n-grams matches were found the result should be zero
145
+ # exp(w_1 * 1 * w_2 * 1 * w_3 * 1 * w_4 * -inf) = 0
146
+ self.assertAlmostEqual(sentence_bleu(references, hypothesis, weights), 0.0, places=4)
147
+ # Checks that the warning has been raised because len(hypothesis) < 4.
148
+ try:
149
+ self.assertWarns(UserWarning, sentence_bleu, references, hypothesis)
150
+ except AttributeError:
151
+ pass # unittest.TestCase.assertWarns is only supported in Python >= 3.2.
152
+
153
+ # Test case where n > len(hypothesis) but so is n > len(reference), and
154
+ # it's a special case where reference == hypothesis.
155
+ references = ['John loves Mary'.split()]
156
+ hypothesis = 'John loves Mary'.split()
157
+ # Since no 4-grams matches were found the result should be zero
158
+ # exp(w_1 * 1 * w_2 * 1 * w_3 * 1 * w_4 * -inf) = 0
159
+ self.assertAlmostEqual(sentence_bleu(references, hypothesis, weights), 0.0, places=4)
160
+
161
+ def test_empty_hypothesis(self):
162
+ # Test case where there's hypothesis is empty.
163
+ references = ['The candidate has no alignment to any of the references'.split()]
164
+ hypothesis = []
165
+ assert(sentence_bleu(references, hypothesis) == 0)
166
+
167
+ def test_empty_references(self):
168
+ # Test case where there's reference is empty.
169
+ references = [[]]
170
+ hypothesis = 'John loves Mary'.split()
171
+ assert(sentence_bleu(references, hypothesis) == 0)
172
+
173
+ def test_empty_references_and_hypothesis(self):
174
+ # Test case where both references and hypothesis is empty.
175
+ references = [[]]
176
+ hypothesis = []
177
+ assert(sentence_bleu(references, hypothesis) == 0)
178
+
179
+ def test_reference_or_hypothesis_shorter_than_fourgrams(self):
180
+ # Tese case where the length of reference or hypothesis
181
+ # is shorter than 4.
182
+ references = ['let it go'.split()]
183
+ hypothesis = 'let go it'.split()
184
+ # Checks that the value the hypothesis and reference returns is 0.0
185
+ # exp(w_1 * 1 * w_2 * 1 * w_3 * 1 * w_4 * -inf) = 0
186
+ self.assertAlmostEqual(sentence_bleu(references, hypothesis), 0.0, places=4)
187
+ # Checks that the warning has been raised.
188
+ try:
189
+ self.assertWarns(UserWarning, sentence_bleu, references, hypothesis)
190
+ except AttributeError:
191
+ pass # unittest.TestCase.assertWarns is only supported in Python >= 3.2.
192
+
193
+ class TestBLEUvsMteval13a(unittest.TestCase):
194
+
195
+ def test_corpus_bleu(self):
196
+ ref_file = find('models/wmt15_eval/ref.ru')
197
+ hyp_file = find('models/wmt15_eval/google.ru')
198
+ mteval_output_file = find('models/wmt15_eval/mteval-13a.output')
199
+
200
+ # Reads the BLEU scores from the `mteval-13a.output` file.
201
+ # The order of the list corresponds to the order of the ngrams.
202
+ with open(mteval_output_file, 'r') as mteval_fin:
203
+ # The numbers are located in the last 2nd line of the file.
204
+ # The first and 2nd item in the list are the score and system names.
205
+ mteval_bleu_scores = map(float, mteval_fin.readlines()[-2].split()[1:-1])
206
+
207
+ with io.open(ref_file, 'r', encoding='utf8') as ref_fin:
208
+ with io.open(hyp_file, 'r', encoding='utf8') as hyp_fin:
209
+ # Whitespace tokenize the file.
210
+ # Note: split() automatically strip().
211
+ hypothesis = list(map(lambda x: x.split(), hyp_fin))
212
+ # Note that the corpus_bleu input is list of list of references.
213
+ references = list(map(lambda x: [x.split()], ref_fin))
214
+ # Without smoothing.
215
+ for i, mteval_bleu in zip(range(1,10), mteval_bleu_scores):
216
+ nltk_bleu = corpus_bleu(references, hypothesis, weights=(1.0/i,)*i)
217
+ # Check that the BLEU scores difference is less than 0.005 .
218
+ # Note: This is an approximate comparison; as much as
219
+ # +/- 0.01 BLEU might be "statistically significant",
220
+ # the actual translation quality might not be.
221
+ assert abs(mteval_bleu - nltk_bleu) < 0.005
222
+
223
+ # With the same smoothing method used in mteval-v13a.pl
224
+ chencherry = SmoothingFunction()
225
+ for i, mteval_bleu in zip(range(1,10), mteval_bleu_scores):
226
+ nltk_bleu = corpus_bleu(references, hypothesis,
227
+ weights=(1.0/i,)*i,
228
+ smoothing_function=chencherry.method3)
229
+ assert abs(mteval_bleu - nltk_bleu) < 0.005
230
+
231
+ class TestBLEUWithBadSentence(unittest.TestCase):
232
+ def test_corpus_bleu_with_bad_sentence(self):
233
+ hyp = "Teo S yb , oe uNb , R , T t , , t Tue Ar saln S , , 5istsi l , 5oe R ulO sae oR R"
234
+ ref = str("Their tasks include changing a pump on the faulty stokehold ."
235
+ "Likewise , two species that are very similar in morphology "
236
+ "were distinguished using genetics .")
237
+ references = [[ref.split()]]
238
+ hypotheses = [hyp.split()]
239
+ try: # Check that the warning is raised since no. of 2-grams < 0.
240
+ with self.assertWarns(UserWarning):
241
+ # Verify that the BLEU output is undesired since no. of 2-grams < 0.
242
+ self.assertAlmostEqual(corpus_bleu(references, hypotheses), 0.0, places=4)
243
+ except AttributeError: # unittest.TestCase.assertWarns is only supported in Python >= 3.2.
244
+ self.assertAlmostEqual(corpus_bleu(references, hypotheses), 0.0, places=4)
@@ -0,0 +1,57 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ Tests GDFA alignments
4
+ """
5
+
6
+ import functools
7
+ import io
8
+ import unittest
9
+
10
+ from nltk.translate.gdfa import grow_diag_final_and
11
+
12
+ class TestGDFA(unittest.TestCase):
13
+ def test_from_eflomal_outputs(self):
14
+ """
15
+ Testing GDFA with first 10 eflomal outputs from issue #1829
16
+ https://github.com/nltk/nltk/issues/1829
17
+ """
18
+ # Input.
19
+ forwards = ['0-0 1-2',
20
+ '0-0 1-1',
21
+ '0-0 2-1 3-2 4-3 5-4 6-5 7-6 8-7 7-8 9-9 10-10 9-11 11-12 12-13 13-14',
22
+ '0-0 1-1 1-2 2-3 3-4 4-5 4-6 5-7 6-8 8-9 9-10',
23
+ '0-0 14-1 15-2 16-3 20-5 21-6 22-7 5-8 6-9 7-10 8-11 9-12 10-13 11-14 12-15 13-16 14-17 17-18 18-19 19-20 20-21 23-22 24-23 25-24 26-25 27-27 28-28 29-29 30-30 31-31',
24
+ '0-0 1-1 0-2 2-3',
25
+ '0-0 2-2 4-4',
26
+ '0-0 1-1 2-3 3-4 5-5 7-6 8-7 9-8 10-9 11-10 12-11 13-12 14-13 15-14 16-16 17-17 18-18 19-19 20-20',
27
+ '3-0 4-1 6-2 5-3 6-4 7-5 8-6 9-7 10-8 11-9 16-10 9-12 10-13 12-14',
28
+ '1-0']
29
+ backwards = ['0-0 1-2',
30
+ '0-0 1-1',
31
+ '0-0 2-1 3-2 4-3 5-4 6-5 7-6 8-7 9-8 10-10 11-12 12-11 13-13',
32
+ '0-0 1-2 2-3 3-4 4-6 6-8 7-5 8-7 9-8',
33
+ '0-0 1-8 2-9 3-10 4-11 5-12 6-11 8-13 9-14 10-15 11-16 12-17 13-18 14-19 15-20 16-21 17-22 18-23 19-24 20-29 21-30 22-31 23-2 24-3 25-4 26-5 27-5 28-6 29-7 30-28 31-31',
34
+ '0-0 1-1 2-3',
35
+ '0-0 1-1 2-3 4-4',
36
+ '0-0 1-1 2-3 3-4 5-5 7-6 8-7 9-8 10-9 11-10 12-11 13-12 14-13 15-14 16-16 17-17 18-18 19-19 20-16 21-18',
37
+ '0-0 1-1 3-2 4-1 5-3 6-4 7-5 8-6 9-7 10-8 11-9 12-8 13-9 14-8 15-9 16-10',
38
+ '1-0']
39
+ source_lens = [2, 3, 3, 15, 11, 33, 4, 6, 23, 18]
40
+ target_lens = [2, 4, 3, 16, 12, 33, 5, 6, 22, 16]
41
+ # Expected Output.
42
+ expected = [ [(0, 0), (1, 2)],
43
+ [(0, 0), (1, 1)],
44
+ [(0, 0), (2, 1), (3, 2), (4, 3), (5, 4), (6, 5), (7, 6), (8, 7), (10, 10), (11, 12)],
45
+ [(0, 0), (1, 1), (1, 2), (2, 3), (3, 4), (4, 5), (4, 6), (5, 7), (6, 8), (7, 5), (8, 7), (8, 9), (9, 8), (9, 10)],
46
+ [(0, 0), (1, 8), (2, 9), (3, 10), (4, 11), (5, 8), (6, 9), (6, 11), (7, 10), (8, 11), (31, 31)],
47
+ [(0, 0), (0, 2), (1, 1), (2, 3)],
48
+ [(0, 0), (1, 1), (2, 2), (2, 3), (4, 4)],
49
+ [(0, 0), (1, 1), (2, 3), (3, 4), (5, 5), (7, 6), (8, 7), (9, 8), (10, 9), (11, 10), (12, 11), (13, 12), (14, 13), (15, 14), (16, 16), (17, 17), (18, 18), (19, 19)],
50
+ [(0, 0), (1, 1), (3, 0), (3, 2), (4, 1), (5, 3), (6, 2), (6, 4), (7, 5), (8, 6), (9, 7), (9, 12), (10, 8), (10, 13), (11, 9), (12, 8), (12, 14), (13, 9), (14, 8), (15, 9), (16, 10)],
51
+ [(1, 0)],
52
+ [(0, 0), (1, 1), (3, 2), (4, 3), (5, 4), (6, 5), (7, 6), (9, 10), (10, 12), (11, 13), (12, 14), (13, 15)],
53
+ ]
54
+
55
+ # Iterate through all 10 examples and check for expected outputs.
56
+ for fw, bw, src_len, trg_len, expect in zip(forwards, backwards, source_lens, target_lens, expected):
57
+ self.assertListEqual(expect, grow_diag_final_and(src_len, trg_len, fw, bw))
@@ -0,0 +1,37 @@
1
+ # -*- coding: utf-8 -*-
2
+ """
3
+ Tests for NIST translation evaluation metric
4
+ """
5
+
6
+ import io
7
+ import unittest
8
+
9
+ from nltk.data import find
10
+ from nltk.translate.nist_score import sentence_nist, corpus_nist
11
+
12
+
13
+ class TestNIST(unittest.TestCase):
14
+ def test_sentence_nist(self):
15
+ ref_file = find('models/wmt15_eval/ref.ru')
16
+ hyp_file = find('models/wmt15_eval/google.ru')
17
+ mteval_output_file = find('models/wmt15_eval/mteval-13a.output')
18
+
19
+ # Reads the NIST scores from the `mteval-13a.output` file.
20
+ # The order of the list corresponds to the order of the ngrams.
21
+ with open(mteval_output_file, 'r') as mteval_fin:
22
+ # The numbers are located in the last 4th line of the file.
23
+ # The first and 2nd item in the list are the score and system names.
24
+ mteval_nist_scores = map(float, mteval_fin.readlines()[-4].split()[1:-1])
25
+
26
+ with io.open(ref_file, 'r', encoding='utf8') as ref_fin:
27
+ with io.open(hyp_file, 'r', encoding='utf8') as hyp_fin:
28
+ # Whitespace tokenize the file.
29
+ # Note: split() automatically strip().
30
+ hypotheses = list(map(lambda x: x.split(), hyp_fin))
31
+ # Note that the corpus_bleu input is list of list of references.
32
+ references = list(map(lambda x: [x.split()], ref_fin))
33
+ # Without smoothing.
34
+ for i, mteval_nist in zip(range(1,10), mteval_nist_scores):
35
+ nltk_nist = corpus_nist(references, hypotheses, i)
36
+ # Check that the NIST scores difference is less than 0.5
37
+ assert abs(mteval_nist - nltk_nist) < 0.05
@@ -1,7 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # Natural Language Toolkit: Stack decoder
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,4 +1,4 @@
1
- .. Copyright (C) 2001-2016 NLTK Project
1
+ .. Copyright (C) 2001-2018 NLTK Project
2
2
  .. For license information, see LICENSE.TXT
3
3
 
4
4
  =================
@@ -1,4 +1,4 @@
1
- .. Copyright (C) 2001-2016 NLTK Project
1
+ .. Copyright (C) 2001-2018 NLTK Project
2
2
  .. For license information, see LICENSE.TXT
3
3
 
4
4
  =================
@@ -48,8 +48,9 @@ The WordNet corpus reader gives access to the Open Multilingual
48
48
  WordNet, using ISO-639 language codes.
49
49
 
50
50
  >>> sorted(wn.langs()) # doctest: +NORMALIZE_WHITESPACE
51
- ['als', 'arb', 'bul', 'cat', 'cmn', 'dan', 'ell', 'eng', 'eus', 'fas', 'fin', 'fra', 'glg', 'heb', 'hrv', 'ind',
52
- 'ita', 'jpn', 'nno', 'nob', 'pol', 'por', 'qcn', 'slv', 'spa', 'swe', 'tha', 'zsm']
51
+ ['als', 'arb', 'bul', 'cat', 'cmn', 'dan', 'ell', 'eng', 'eus', 'fas',
52
+ 'fin', 'fra', 'glg', 'heb', 'hrv', 'ind', 'ita', 'jpn', 'nld', 'nno',
53
+ 'nob', 'pol', 'por', 'qcn', 'slv', 'spa', 'swe', 'tha', 'zsm']
53
54
  >>> wn.synsets(b'\xe7\x8a\xac'.decode('utf-8'), lang='jpn')
54
55
  [Synset('dog.n.01'), Synset('spy.n.01')]
55
56
 
@@ -113,6 +114,12 @@ Note that some relations are defined by WordNet only over Lemmas:
113
114
  The relations that are currently defined in this way are `antonyms`,
114
115
  `derivationally_related_forms` and `pertainyms`.
115
116
 
117
+ If you know the byte offset used to identify a synset in the original
118
+ Princeton WordNet data file, you can use that to instantiate the synset
119
+ in NLTK:
120
+
121
+ >>> wn.synset_from_pos_and_offset('n', 4543158)
122
+ Synset('wagon.n.01')
116
123
 
117
124
  ------
118
125
  Lemmas
@@ -579,3 +586,10 @@ Issue 395: wordnet returns incorrect result for lowest_common_hypernyms of chef
579
586
 
580
587
  >>> wn.synset('policeman.n.01').lowest_common_hypernyms(wn.synset('chef.n.01'))
581
588
  [Synset('person.n.01')]
589
+
590
+ Bug https://github.com/nltk/nltk/issues/1641: Non-English lemmas containing capital letters cannot be looked up using wordnet.lemmas() or wordnet.synsets()
591
+
592
+ >>> wn.lemmas('Londres', lang='fra')
593
+ [Lemma('united_kingdom.n.01.Londres'), Lemma('london.n.01.Londres'), Lemma('london.n.02.Londres')]
594
+ >>> wn.lemmas('londres', lang='fra')
595
+ [Lemma('united_kingdom.n.01.Londres'), Lemma('london.n.01.Londres'), Lemma('london.n.02.Londres')]
@@ -1,6 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  from __future__ import absolute_import
3
3
 
4
+
4
5
  def teardown_module(module=None):
5
6
  from nltk.corpus import wordnet
6
7
  wordnet._unload()
@@ -1,4 +1,4 @@
1
- .. Copyright (C) 2001-2016 NLTK Project
1
+ .. Copyright (C) 2001-2018 NLTK Project
2
2
  .. For license information, see LICENSE.TXT
3
3
 
4
4
  ===============================
@@ -1,4 +1,4 @@
1
- .. Copyright (C) 2001-2016 NLTK Project
1
+ .. Copyright (C) 2001-2018 NLTK Project
2
2
  .. For license information, see LICENSE.TXT
3
3
 
4
4
  .. -*- coding: utf-8 -*-
@@ -1,6 +1,6 @@
1
1
  # Natural Language Toolkit: Texts
2
2
  #
3
- # Copyright (C) 2001-2016 NLTK Project
3
+ # Copyright (C) 2001-2018 NLTK Project
4
4
  # Author: Steven Bird <stevenbird1@gmail.com>
5
5
  # Edward Loper <edloper@gmail.com>
6
6
  # URL: <http://nltk.org/>
@@ -13,21 +13,26 @@ Functionality includes: concordancing, collocation discovery,
13
13
  regular expression search over tokenized strings, and
14
14
  distributional similarity.
15
15
  """
16
- from __future__ import print_function, division, unicode_literals
16
+ from __future__ import print_function, division, unicode_literals, absolute_import
17
17
 
18
18
  from math import log
19
- from collections import defaultdict
19
+ from collections import defaultdict, Counter, namedtuple
20
20
  from functools import reduce
21
21
  from itertools import islice
22
22
  import re
23
23
 
24
+ from six import text_type
25
+
24
26
  from nltk.probability import FreqDist, LidstoneProbDist
25
27
  from nltk.probability import ConditionalFreqDist as CFD
26
28
  from nltk.util import tokenwrap, LazyConcatenation
27
29
  from nltk.metrics import f_measure, BigramAssocMeasures
28
30
  from nltk.collocations import BigramCollocationFinder
29
- from nltk.compat import python_2_unicode_compatible, text_type, Counter
31
+ from nltk.compat import python_2_unicode_compatible
30
32
 
33
+ ConcordanceLine = namedtuple('ConcordanceLine',
34
+ ['left', 'query', 'right', 'offset',
35
+ 'left_print', 'right_print', 'line'])
31
36
 
32
37
  class ContextIndex(object):
33
38
  """
@@ -115,6 +120,7 @@ class ContextIndex(object):
115
120
  if c in common)
116
121
  return fd
117
122
 
123
+
118
124
  @python_2_unicode_compatible
119
125
  class ConcordanceIndex(object):
120
126
  """
@@ -141,9 +147,7 @@ class ConcordanceIndex(object):
141
147
  """Function mapping each token to an index key (or None)."""
142
148
 
143
149
  self._offsets = defaultdict(list)
144
- """Dictionary mapping words (or keys) to lists of offset
145
- indices."""
146
-
150
+ """Dictionary mapping words (or keys) to lists of offset indices."""
147
151
  # Initialize the index (self._offsets)
148
152
  for index, word in enumerate(tokens):
149
153
  word = self._key(word)
@@ -171,36 +175,56 @@ class ConcordanceIndex(object):
171
175
  return '<ConcordanceIndex for %d tokens (%d types)>' % (
172
176
  len(self._tokens), len(self._offsets))
173
177
 
174
- def print_concordance(self, word, width=75, lines=25):
178
+ def find_concordance(self, word, width=80, lines=25):
175
179
  """
176
- Print a concordance for ``word`` with the specified context window.
180
+ Find the concordance lines given the query word.
181
+ """
182
+ half_width = (width - len(word) - 2) // 2
183
+ context = width // 4 # approx number of words of context
177
184
 
185
+ # Find the instances of the word to create the ConcordanceLine
186
+ concordance_list = []
187
+ offsets = self.offsets(word)
188
+ if offsets:
189
+ for i in offsets:
190
+ query_word = self._tokens[i]
191
+ # Find the context of query word.
192
+ left_context = self._tokens[i-context:i]
193
+ right_context = self._tokens[i+1:i+context]
194
+ # Create the pretty lines with the query_word in the middle.
195
+ left_print= ' '.join(left_context)[-half_width:]
196
+ right_print = ' '.join(right_context)[:half_width]
197
+ # The WYSIWYG line of the concordance.
198
+ line_print = ' '.join([left_print, query_word, right_print])
199
+ # Create the ConcordanceLine
200
+ concordance_line = ConcordanceLine(left_context, query_word,
201
+ right_context, i,
202
+ left_print, right_print, line_print)
203
+ concordance_list.append(concordance_line)
204
+ return concordance_list[:lines]
205
+
206
+ def print_concordance(self, word, width=80, lines=25):
207
+ """
208
+ Print concordance lines given the query word.
178
209
  :param word: The target word
179
210
  :type word: str
180
- :param width: The width of each line, in characters (default=80)
181
- :type width: int
182
211
  :param lines: The number of lines to display (default=25)
183
212
  :type lines: int
213
+ :param width: The width of each line, in characters (default=80)
214
+ :type width: int
215
+ :param save: The option to save the concordance.
216
+ :type save: bool
184
217
  """
185
- half_width = (width - len(word) - 2) // 2
186
- context = width // 4 # approx number of words of context
218
+ concordance_list = self.find_concordance(word, width=80, lines=25)
187
219
 
188
- offsets = self.offsets(word)
189
- if offsets:
190
- lines = min(lines, len(offsets))
191
- print("Displaying %s of %s matches:" % (lines, len(offsets)))
192
- for i in offsets:
193
- if lines <= 0:
194
- break
195
- left = (' ' * half_width +
196
- ' '.join(self._tokens[i-context:i]))
197
- right = ' '.join(self._tokens[i+1:i+context])
198
- left = left[-half_width:]
199
- right = right[:half_width]
200
- print(left, self._tokens[i], right)
201
- lines -= 1
220
+ if not concordance_list:
221
+ print("no matches")
202
222
  else:
203
- print("No matches")
223
+ lines = min(lines, len(concordance_list))
224
+ print("Displaying {} of {} matches:".format(lines,len(concordance_list)))
225
+ for i, concordance_line in enumerate(concordance_list[:lines]):
226
+ print(concordance_line.line)
227
+
204
228
 
205
229
  class TokenSearcher(object):
206
230
  """
@@ -308,10 +332,7 @@ class Text(object):
308
332
  #////////////////////////////////////////////////////////////
309
333
 
310
334
  def __getitem__(self, i):
311
- if isinstance(i, slice):
312
- return self.tokens[i.start:i.stop]
313
- else:
314
- return self.tokens[i]
335
+ return self.tokens[i]
315
336
 
316
337
  def __len__(self):
317
338
  return len(self.tokens)
@@ -322,16 +343,40 @@ class Text(object):
322
343
 
323
344
  def concordance(self, word, width=79, lines=25):
324
345
  """
325
- Print a concordance for ``word`` with the specified context window.
346
+ Prints a concordance for ``word`` with the specified context window.
326
347
  Word matching is not case-sensitive.
348
+
349
+ :param word: The target word
350
+ :type word: str
351
+ :param width: The width of each line, in characters (default=80)
352
+ :type width: int
353
+ :param lines: The number of lines to display (default=25)
354
+ :type lines: int
355
+
327
356
  :seealso: ``ConcordanceIndex``
328
357
  """
329
358
  if '_concordance_index' not in self.__dict__:
330
- #print("Building index...")
331
- self._concordance_index = ConcordanceIndex(self.tokens,
332
- key=lambda s:s.lower())
359
+ self._concordance_index = ConcordanceIndex(self.tokens, key=lambda s:s.lower())
360
+
361
+ return self._concordance_index.print_concordance(word, width, lines)
362
+
363
+ def concordance_list(self, word, width=79, lines=25):
364
+ """
365
+ Generate a concordance for ``word`` with the specified context window.
366
+ Word matching is not case-sensitive.
367
+
368
+ :param word: The target word
369
+ :type word: str
370
+ :param width: The width of each line, in characters (default=80)
371
+ :type width: int
372
+ :param lines: The number of lines to display (default=25)
373
+ :type lines: int
333
374
 
334
- self._concordance_index.print_concordance(word, width, lines)
375
+ :seealso: ``ConcordanceIndex``
376
+ """
377
+ if '_concordance_index' not in self.__dict__:
378
+ self._concordance_index = ConcordanceIndex(self.tokens, key=lambda s:s.lower())
379
+ return self._concordance_index.find_concordance(word, width, lines)
335
380
 
336
381
  def collocations(self, num=20, window_size=2):
337
382
  """
@@ -391,7 +436,7 @@ class Text(object):
391
436
  filter=lambda x:x.isalpha(),
392
437
  key=lambda s:s.lower())
393
438
 
394
- # words = self._word_context_index.similar_words(word, num)
439
+ # words = self._word_context_index.similar_words(word, num)
395
440
 
396
441
  word = word.lower()
397
442
  wci = self._word_context_index._word_to_contexts
@@ -444,6 +489,13 @@ class Text(object):
444
489
  from nltk.draw import dispersion_plot
445
490
  dispersion_plot(self, words)
446
491
 
492
+ def generate(self, words):
493
+ """
494
+ Issues a reminder to users following the book online
495
+ """
496
+ import warnings
497
+ warnings.warn('The generate() method is no longer available.', DeprecationWarning)
498
+
447
499
  def plot(self, *args):
448
500
  """
449
501
  See documentation for FreqDist.plot()
@@ -564,7 +616,8 @@ class TextCollection(Text):
564
616
  idf = self._idf_cache.get(term)
565
617
  if idf is None:
566
618
  matches = len([True for text in self._texts if term in text])
567
- # FIXME Should this raise some kind of error instead?
619
+ if len(self._texts) == 0:
620
+ raise ValueError('IDF undefined for empty document collection')
568
621
  idf = (log(len(self._texts) / matches) if matches else 0.0)
569
622
  self._idf_cache[term] = idf
570
623
  return idf