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,363 @@
1
+ # Natural Language Toolkit: Tokenizers
2
+ #
3
+ # Copyright (C) 2001-2018 NLTK Project
4
+ # Author: Edward Loper <edloper@gmail.com>
5
+ # Michael Heilman <mheilman@cmu.edu> (re-port from http://www.cis.upenn.edu/~treebank/tokenizer.sed)
6
+ #
7
+ # URL: <http://nltk.sourceforge.net>
8
+ # For license information, see LICENSE.TXT
9
+
10
+ r"""
11
+
12
+ Penn Treebank Tokenizer
13
+
14
+ The Treebank tokenizer uses regular expressions to tokenize text as in Penn Treebank.
15
+ This implementation is a port of the tokenizer sed script written by Robert McIntyre
16
+ and available at http://www.cis.upenn.edu/~treebank/tokenizer.sed.
17
+ """
18
+
19
+ import re
20
+ from nltk.tokenize.api import TokenizerI
21
+ from nltk.tokenize.util import align_tokens
22
+
23
+
24
+ class MacIntyreContractions:
25
+ """
26
+ List of contractions adapted from Robert MacIntyre's tokenizer.
27
+ """
28
+ CONTRACTIONS2 = [r"(?i)\b(can)(?#X)(not)\b",
29
+ r"(?i)\b(d)(?#X)('ye)\b",
30
+ r"(?i)\b(gim)(?#X)(me)\b",
31
+ r"(?i)\b(gon)(?#X)(na)\b",
32
+ r"(?i)\b(got)(?#X)(ta)\b",
33
+ r"(?i)\b(lem)(?#X)(me)\b",
34
+ r"(?i)\b(mor)(?#X)('n)\b",
35
+ r"(?i)\b(wan)(?#X)(na)\s"]
36
+ CONTRACTIONS3 = [r"(?i) ('t)(?#X)(is)\b", r"(?i) ('t)(?#X)(was)\b"]
37
+ CONTRACTIONS4 = [r"(?i)\b(whad)(dd)(ya)\b",
38
+ r"(?i)\b(wha)(t)(cha)\b"]
39
+
40
+
41
+ class TreebankWordTokenizer(TokenizerI):
42
+ """
43
+ The Treebank tokenizer uses regular expressions to tokenize text as in Penn Treebank.
44
+ This is the method that is invoked by ``word_tokenize()``. It assumes that the
45
+ text has already been segmented into sentences, e.g. using ``sent_tokenize()``.
46
+
47
+ This tokenizer performs the following steps:
48
+
49
+ - split standard contractions, e.g. ``don't`` -> ``do n't`` and ``they'll`` -> ``they 'll``
50
+ - treat most punctuation characters as separate tokens
51
+ - split off commas and single quotes, when followed by whitespace
52
+ - separate periods that appear at the end of line
53
+
54
+ >>> from nltk.tokenize import TreebankWordTokenizer
55
+ >>> s = '''Good muffins cost $3.88\\nin New York. Please buy me\\ntwo of them.\\nThanks.'''
56
+ >>> TreebankWordTokenizer().tokenize(s)
57
+ ['Good', 'muffins', 'cost', '$', '3.88', 'in', 'New', 'York.', 'Please', 'buy', 'me', 'two', 'of', 'them.', 'Thanks', '.']
58
+ >>> s = "They'll save and invest more."
59
+ >>> TreebankWordTokenizer().tokenize(s)
60
+ ['They', "'ll", 'save', 'and', 'invest', 'more', '.']
61
+ >>> s = "hi, my name can't hello,"
62
+ >>> TreebankWordTokenizer().tokenize(s)
63
+ ['hi', ',', 'my', 'name', 'ca', "n't", 'hello', ',']
64
+ """
65
+
66
+ # starting quotes
67
+ STARTING_QUOTES = [
68
+ (re.compile(r'^\"'), r'``'),
69
+ (re.compile(r'(``)'), r' \1 '),
70
+ (re.compile(r"([ \(\[{<])(\"|\'{2})"), r'\1 `` '),
71
+ ]
72
+
73
+ # punctuation
74
+ PUNCTUATION = [
75
+ (re.compile(r'([:,])([^\d])'), r' \1 \2'),
76
+ (re.compile(r'([:,])$'), r' \1 '),
77
+ (re.compile(r'\.\.\.'), r' ... '),
78
+ (re.compile(r'[;@#$%&]'), r' \g<0> '),
79
+ (re.compile(r'([^\.])(\.)([\]\)}>"\']*)\s*$'), r'\1 \2\3 '), # Handles the final period.
80
+ (re.compile(r'[?!]'), r' \g<0> '),
81
+
82
+ (re.compile(r"([^'])' "), r"\1 ' "),
83
+ ]
84
+
85
+ # Pads parentheses
86
+ PARENS_BRACKETS = (re.compile(r'[\]\[\(\)\{\}\<\>]'), r' \g<0> ')
87
+
88
+ # Optionally: Convert parentheses, brackets and converts them to PTB symbols.
89
+ CONVERT_PARENTHESES = [
90
+ (re.compile(r'\('), '-LRB-'), (re.compile(r'\)'), '-RRB-'),
91
+ (re.compile(r'\['), '-LSB-'), (re.compile(r'\]'), '-RSB-'),
92
+ (re.compile(r'\{'), '-LCB-'), (re.compile(r'\}'), '-RCB-')
93
+ ]
94
+
95
+ DOUBLE_DASHES = (re.compile(r'--'), r' -- ')
96
+
97
+ # ending quotes
98
+ ENDING_QUOTES = [
99
+ (re.compile(r'"'), " '' "),
100
+ (re.compile(r'(\S)(\'\')'), r'\1 \2 '),
101
+ (re.compile(r"([^' ])('[sS]|'[mM]|'[dD]|') "), r"\1 \2 "),
102
+ (re.compile(r"([^' ])('ll|'LL|'re|'RE|'ve|'VE|n't|N'T) "), r"\1 \2 "),
103
+ ]
104
+
105
+ # List of contractions adapted from Robert MacIntyre's tokenizer.
106
+ _contractions = MacIntyreContractions()
107
+ CONTRACTIONS2 = list(map(re.compile, _contractions.CONTRACTIONS2))
108
+ CONTRACTIONS3 = list(map(re.compile, _contractions.CONTRACTIONS3))
109
+
110
+ def tokenize(self, text, convert_parentheses=False, return_str=False):
111
+ for regexp, substitution in self.STARTING_QUOTES:
112
+ text = regexp.sub(substitution, text)
113
+
114
+ for regexp, substitution in self.PUNCTUATION:
115
+ text = regexp.sub(substitution, text)
116
+
117
+ # Handles parentheses.
118
+ regexp, substitution = self.PARENS_BRACKETS
119
+ text = regexp.sub(substitution, text)
120
+ # Optionally convert parentheses
121
+ if convert_parentheses:
122
+ for regexp, substitution in self.CONVERT_PARENTHESES:
123
+ text = regexp.sub(substitution, text)
124
+
125
+ # Handles double dash.
126
+ regexp, substitution = self.DOUBLE_DASHES
127
+ text = regexp.sub(substitution, text)
128
+
129
+ # add extra space to make things easier
130
+ text = " " + text + " "
131
+
132
+ for regexp, substitution in self.ENDING_QUOTES:
133
+ text = regexp.sub(substitution, text)
134
+
135
+ for regexp in self.CONTRACTIONS2:
136
+ text = regexp.sub(r' \1 \2 ', text)
137
+ for regexp in self.CONTRACTIONS3:
138
+ text = regexp.sub(r' \1 \2 ', text)
139
+
140
+ # We are not using CONTRACTIONS4 since
141
+ # they are also commented out in the SED scripts
142
+ # for regexp in self._contractions.CONTRACTIONS4:
143
+ # text = regexp.sub(r' \1 \2 \3 ', text)
144
+
145
+ return text if return_str else text.split()
146
+
147
+ def span_tokenize(self, text):
148
+ """
149
+ Uses the post-hoc nltk.tokens.align_tokens to return the offset spans.
150
+
151
+ >>> from nltk.tokenize import TreebankWordTokenizer
152
+ >>> s = '''Good muffins cost $3.88\\nin New (York). Please (buy) me\\ntwo of them.\\n(Thanks).'''
153
+ >>> expected = [(0, 4), (5, 12), (13, 17), (18, 19), (19, 23),
154
+ ... (24, 26), (27, 30), (31, 32), (32, 36), (36, 37), (37, 38),
155
+ ... (40, 46), (47, 48), (48, 51), (51, 52), (53, 55), (56, 59),
156
+ ... (60, 62), (63, 68), (69, 70), (70, 76), (76, 77), (77, 78)]
157
+ >>> list(TreebankWordTokenizer().span_tokenize(s)) == expected
158
+ True
159
+ >>> expected = ['Good', 'muffins', 'cost', '$', '3.88', 'in',
160
+ ... 'New', '(', 'York', ')', '.', 'Please', '(', 'buy', ')',
161
+ ... 'me', 'two', 'of', 'them.', '(', 'Thanks', ')', '.']
162
+ >>> [s[start:end] for start, end in TreebankWordTokenizer().span_tokenize(s)] == expected
163
+ True
164
+
165
+ Additional example
166
+ >>> from nltk.tokenize import TreebankWordTokenizer
167
+ >>> s = '''I said, "I'd like to buy some ''good muffins" which cost $3.88\\n each in New (York)."'''
168
+ >>> expected = [(0, 1), (2, 6), (6, 7), (8, 9), (9, 10), (10, 12),
169
+ ... (13, 17), (18, 20), (21, 24), (25, 29), (30, 32), (32, 36),
170
+ ... (37, 44), (44, 45), (46, 51), (52, 56), (57, 58), (58, 62),
171
+ ... (64, 68), (69, 71), (72, 75), (76, 77), (77, 81), (81, 82),
172
+ ... (82, 83), (83, 84)]
173
+ >>> list(TreebankWordTokenizer().span_tokenize(s)) == expected
174
+ True
175
+ >>> expected = ['I', 'said', ',', '"', 'I', "'d", 'like', 'to',
176
+ ... 'buy', 'some', "''", "good", 'muffins', '"', 'which', 'cost',
177
+ ... '$', '3.88', 'each', 'in', 'New', '(', 'York', ')', '.', '"']
178
+ >>> [s[start:end] for start, end in TreebankWordTokenizer().span_tokenize(s)] == expected
179
+ True
180
+
181
+ """
182
+ raw_tokens = self.tokenize(text)
183
+
184
+ # Convert converted quotes back to original double quotes
185
+ # Do this only if original text contains double quote(s) or double
186
+ # single-quotes (because '' might be transformed to `` if it is
187
+ # treated as starting quotes).
188
+ if ('"' in text) or ("''" in text):
189
+ # Find double quotes and converted quotes
190
+ matched = [m.group() for m in re.finditer(r"``|'{2}|\"", text)]
191
+
192
+ # Replace converted quotes back to double quotes
193
+ tokens = [matched.pop(0) if tok in ['"', "``", "''"] else tok
194
+ for tok in raw_tokens]
195
+ else:
196
+ tokens = raw_tokens
197
+
198
+ for tok in align_tokens(tokens, text):
199
+ yield tok
200
+
201
+
202
+ class TreebankWordDetokenizer(TokenizerI):
203
+ """
204
+ The Treebank detokenizer uses the reverse regex operations corresponding to
205
+ the Treebank tokenizer's regexes.
206
+
207
+ Note:
208
+ - There're additional assumption mades when undoing the padding of [;@#$%&]
209
+ punctuation symbols that isn't presupposed in the TreebankTokenizer.
210
+ - There're additional regexes added in reversing the parentheses tokenization,
211
+ - the r'([\]\)\}\>])\s([:;,.])' removes the additional right padding added
212
+ to the closing parentheses precedding [:;,.].
213
+ - It's not possible to return the original whitespaces as they were because
214
+ there wasn't explicit records of where '\n', '\t' or '\s' were removed at
215
+ the text.split() operation.
216
+
217
+ >>> from nltk.tokenize.treebank import TreebankWordTokenizer, TreebankWordDetokenizer
218
+ >>> s = '''Good muffins cost $3.88\\nin New York. Please buy me\\ntwo of them.\\nThanks.'''
219
+ >>> d = TreebankWordDetokenizer()
220
+ >>> t = TreebankWordTokenizer()
221
+ >>> toks = t.tokenize(s)
222
+ >>> d.detokenize(toks)
223
+ 'Good muffins cost $3.88 in New York. Please buy me two of them. Thanks.'
224
+
225
+ The MXPOST parentheses substitution can be undone using the `convert_parentheses`
226
+ parameter:
227
+
228
+ >>> s = '''Good muffins cost $3.88\\nin New (York). Please (buy) me\\ntwo of them.\\n(Thanks).'''
229
+ >>> expected_tokens = ['Good', 'muffins', 'cost', '$', '3.88', 'in',
230
+ ... 'New', '-LRB-', 'York', '-RRB-', '.', 'Please', '-LRB-', 'buy',
231
+ ... '-RRB-', 'me', 'two', 'of', 'them.', '-LRB-', 'Thanks', '-RRB-', '.']
232
+ >>> expected_tokens == t.tokenize(s, convert_parentheses=True)
233
+ True
234
+ >>> expected_detoken = 'Good muffins cost $3.88 in New (York). Please (buy) me two of them. (Thanks).'
235
+ >>> expected_detoken == d.detokenize(t.tokenize(s, convert_parentheses=True), convert_parentheses=True)
236
+ True
237
+
238
+ During tokenization it's safe to add more spaces but during detokenization,
239
+ simply undoing the padding doesn't really help.
240
+
241
+ - During tokenization, left and right pad is added to [!?], when
242
+ detokenizing, only left shift the [!?] is needed.
243
+ Thus (re.compile(r'\s([?!])'), r'\g<1>')
244
+
245
+ - During tokenization [:,] are left and right padded but when detokenizing,
246
+ only left shift is necessary and we keep right pad after comma/colon
247
+ if the string after is a non-digit.
248
+ Thus (re.compile(r'\s([:,])\s([^\d])'), r'\1 \2')
249
+
250
+ >>> from nltk.tokenize.treebank import TreebankWordDetokenizer
251
+ >>> toks = ['hello', ',', 'i', 'ca', "n't", 'feel', 'my', 'feet', '!', 'Help', '!', '!']
252
+ >>> twd = TreebankWordDetokenizer()
253
+ >>> twd.detokenize(toks)
254
+ "hello, i can't feel my feet! Help!!"
255
+
256
+ >>> toks = ['hello', ',', 'i', "can't", 'feel', ';', 'my', 'feet', '!',
257
+ ... 'Help', '!', '!', 'He', 'said', ':', 'Help', ',', 'help', '?', '!']
258
+ >>> twd.detokenize(toks)
259
+ "hello, i can't feel; my feet! Help!! He said: Help, help?!"
260
+ """
261
+ _contractions = MacIntyreContractions()
262
+ CONTRACTIONS2 = [re.compile(pattern.replace('(?#X)', '\s'))
263
+ for pattern in _contractions.CONTRACTIONS2]
264
+ CONTRACTIONS3 = [re.compile(pattern.replace('(?#X)', '\s'))
265
+ for pattern in _contractions.CONTRACTIONS3]
266
+
267
+ # ending quotes
268
+ ENDING_QUOTES = [
269
+ (re.compile(r"([^' ])\s('ll|'LL|'re|'RE|'ve|'VE|n't|N'T) "), r"\1\2 "),
270
+ (re.compile(r"([^' ])\s('[sS]|'[mM]|'[dD]|') "), r"\1\2 "),
271
+ (re.compile(r'(\S)(\'\')'), r'\1\2 '),
272
+ (re.compile(r" '' "), '"')
273
+ ]
274
+
275
+ # Handles double dashes
276
+ DOUBLE_DASHES = (re.compile(r' -- '), r'--')
277
+
278
+ # Optionally: Convert parentheses, brackets and converts them from PTB symbols.
279
+ CONVERT_PARENTHESES = [
280
+ (re.compile('-LRB-'), '('), (re.compile('-RRB-'), ')'),
281
+ (re.compile('-LSB-'), '['), (re.compile('-RSB-'), ']'),
282
+ (re.compile('-LCB-'), '{'), (re.compile('-RCB-'), '}')
283
+ ]
284
+
285
+ # Undo padding on parentheses.
286
+ PARENS_BRACKETS = [(re.compile(r'\s([\[\(\{\<])\s'), r' \g<1>'),
287
+ (re.compile(r'\s([\]\)\}\>])\s'), r'\g<1> '),
288
+ (re.compile(r'([\]\)\}\>])\s([:;,.])'), r'\1\2')]
289
+
290
+ # punctuation
291
+ PUNCTUATION = [
292
+ (re.compile(r"([^'])\s'\s"), r"\1' "),
293
+ (re.compile(r'\s([?!])'), r'\g<1>'), # Strip left pad for [?!]
294
+ # (re.compile(r'\s([?!])\s'), r'\g<1>'),
295
+ (re.compile(r'([^\.])\s(\.)([\]\)}>"\']*)\s*$'), r'\1\2\3'),
296
+ # When tokenizing, [;@#$%&] are padded with whitespace regardless of
297
+ # whether there are spaces before or after them.
298
+ # But during detokenization, we need to distinguish between left/right
299
+ # pad, so we split this up.
300
+ (re.compile(r'\s([#$])\s'), r' \g<1>'), # Left pad.
301
+ (re.compile(r'\s([;%])\s'), r'\g<1> '), # Right pad.
302
+ (re.compile(r'\s([&])\s'), r' \g<1> '), # Unknown pad.
303
+ (re.compile(r'\s\.\.\.\s'), r'...'),
304
+ (re.compile(r'\s([:,])\s$'), r'\1'),
305
+ (re.compile(r'\s([:,])\s([^\d])'), r'\1 \2') # Keep right pad after comma/colon before non-digits.
306
+ # (re.compile(r'\s([:,])\s([^\d])'), r'\1\2')
307
+ ]
308
+
309
+ # starting quotes
310
+ STARTING_QUOTES = [
311
+ (re.compile(r'([ (\[{<])\s``'), r'\1"'),
312
+ (re.compile(r'\s(``)\s'), r'\1'),
313
+ (re.compile(r'^``'), r'\"'),
314
+ ]
315
+
316
+ def tokenize(self, tokens, convert_parentheses=False):
317
+ """
318
+ Python port of the Moses detokenizer.
319
+
320
+ :param tokens: A list of strings, i.e. tokenized text.
321
+ :type tokens: list(str)
322
+ :return: str
323
+ """
324
+ text = ' '.join(tokens)
325
+ # Reverse the contractions regexes.
326
+ # Note: CONTRACTIONS4 are not used in tokenization.
327
+ for regexp in self.CONTRACTIONS3:
328
+ text = regexp.sub(r'\1\2', text)
329
+ for regexp in self.CONTRACTIONS2:
330
+ text = regexp.sub(r'\1\2', text)
331
+
332
+ # Reverse the regexes applied for ending quotes.
333
+ for regexp, substitution in self.ENDING_QUOTES:
334
+ text = regexp.sub(substitution, text)
335
+
336
+ # Undo the space padding.
337
+ text = text.strip()
338
+
339
+ # Reverse the padding on double dashes.
340
+ regexp, substitution = self.DOUBLE_DASHES
341
+ text = regexp.sub(substitution, text)
342
+
343
+ if convert_parentheses:
344
+ for regexp, substitution in self.CONVERT_PARENTHESES:
345
+ text = regexp.sub(substitution, text)
346
+
347
+ # Reverse the padding regexes applied for parenthesis/brackets.
348
+ for regexp, substitution in self.PARENS_BRACKETS:
349
+ text = regexp.sub(substitution, text)
350
+
351
+ # Reverse the regexes applied for punctuations.
352
+ for regexp, substitution in self.PUNCTUATION:
353
+ text = regexp.sub(substitution, text)
354
+
355
+ # Reverse the regexes applied for starting quotes.
356
+ for regexp, substitution in self.STARTING_QUOTES:
357
+ text = regexp.sub(substitution, text)
358
+
359
+ return text.strip()
360
+
361
+ def detokenize(self, tokens, convert_parentheses=False):
362
+ """ Duck-typing the abstract *tokenize()*."""
363
+ return self.tokenize(tokens, convert_parentheses)
@@ -0,0 +1,261 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Natural Language Toolkit: Tokenizer Utilities
3
+ #
4
+ # Copyright (C) 2001-2018 NLTK Project
5
+ # Author: Steven Bird <stevenbird1@gmail.com>
6
+ # URL: <http://nltk.sourceforge.net>
7
+ # For license information, see LICENSE.TXT
8
+
9
+ from re import finditer
10
+ from xml.sax.saxutils import escape, unescape
11
+
12
+
13
+ def string_span_tokenize(s, sep):
14
+ r"""
15
+ Return the offsets of the tokens in *s*, as a sequence of ``(start, end)``
16
+ tuples, by splitting the string at each occurrence of *sep*.
17
+
18
+ >>> from nltk.tokenize.util import string_span_tokenize
19
+ >>> s = '''Good muffins cost $3.88\nin New York. Please buy me
20
+ ... two of them.\n\nThanks.'''
21
+ >>> list(string_span_tokenize(s, " "))
22
+ [(0, 4), (5, 12), (13, 17), (18, 26), (27, 30), (31, 36), (37, 37),
23
+ (38, 44), (45, 48), (49, 55), (56, 58), (59, 73)]
24
+
25
+ :param s: the string to be tokenized
26
+ :type s: str
27
+ :param sep: the token separator
28
+ :type sep: str
29
+ :rtype: iter(tuple(int, int))
30
+ """
31
+ if len(sep) == 0:
32
+ raise ValueError("Token delimiter must not be empty")
33
+ left = 0
34
+ while True:
35
+ try:
36
+ right = s.index(sep, left)
37
+ if right != 0:
38
+ yield left, right
39
+ except ValueError:
40
+ if left != len(s):
41
+ yield left, len(s)
42
+ break
43
+
44
+ left = right + len(sep)
45
+
46
+
47
+ def regexp_span_tokenize(s, regexp):
48
+ r"""
49
+ Return the offsets of the tokens in *s*, as a sequence of ``(start, end)``
50
+ tuples, by splitting the string at each successive match of *regexp*.
51
+
52
+ >>> from nltk.tokenize.util import regexp_span_tokenize
53
+ >>> s = '''Good muffins cost $3.88\nin New York. Please buy me
54
+ ... two of them.\n\nThanks.'''
55
+ >>> list(regexp_span_tokenize(s, r'\s'))
56
+ [(0, 4), (5, 12), (13, 17), (18, 23), (24, 26), (27, 30), (31, 36),
57
+ (38, 44), (45, 48), (49, 51), (52, 55), (56, 58), (59, 64), (66, 73)]
58
+
59
+ :param s: the string to be tokenized
60
+ :type s: str
61
+ :param regexp: regular expression that matches token separators (must not be empty)
62
+ :type regexp: str
63
+ :rtype: iter(tuple(int, int))
64
+ """
65
+ left = 0
66
+ for m in finditer(regexp, s):
67
+ right, next = m.span()
68
+ if right != left:
69
+ yield left, right
70
+ left = next
71
+ yield left, len(s)
72
+
73
+
74
+ def spans_to_relative(spans):
75
+ r"""
76
+ Return a sequence of relative spans, given a sequence of spans.
77
+
78
+ >>> from nltk.tokenize import WhitespaceTokenizer
79
+ >>> from nltk.tokenize.util import spans_to_relative
80
+ >>> s = '''Good muffins cost $3.88\nin New York. Please buy me
81
+ ... two of them.\n\nThanks.'''
82
+ >>> list(spans_to_relative(WhitespaceTokenizer().span_tokenize(s)))
83
+ [(0, 4), (1, 7), (1, 4), (1, 5), (1, 2), (1, 3), (1, 5), (2, 6),
84
+ (1, 3), (1, 2), (1, 3), (1, 2), (1, 5), (2, 7)]
85
+
86
+ :param spans: a sequence of (start, end) offsets of the tokens
87
+ :type spans: iter(tuple(int, int))
88
+ :rtype: iter(tuple(int, int))
89
+ """
90
+ prev = 0
91
+ for left, right in spans:
92
+ yield left - prev, right - left
93
+ prev = right
94
+
95
+
96
+ class CJKChars(object):
97
+ """
98
+ An object that enumerates the code points of the CJK characters as listed on
99
+ http://en.wikipedia.org/wiki/Basic_Multilingual_Plane#Basic_Multilingual_Plane
100
+
101
+ This is a Python port of the CJK code point enumerations of Moses tokenizer:
102
+ https://github.com/moses-smt/mosesdecoder/blob/master/scripts/tokenizer/detokenizer.perl#L309
103
+ """
104
+ # Hangul Jamo (1100–11FF)
105
+ Hangul_Jamo = (4352, 4607) # (ord(u"\u1100"), ord(u"\u11ff"))
106
+
107
+ # CJK Radicals Supplement (2E80–2EFF)
108
+ # Kangxi Radicals (2F00–2FDF)
109
+ # Ideographic Description Characters (2FF0–2FFF)
110
+ # CJK Symbols and Punctuation (3000–303F)
111
+ # Hiragana (3040–309F)
112
+ # Katakana (30A0–30FF)
113
+ # Bopomofo (3100–312F)
114
+ # Hangul Compatibility Jamo (3130–318F)
115
+ # Kanbun (3190–319F)
116
+ # Bopomofo Extended (31A0–31BF)
117
+ # CJK Strokes (31C0–31EF)
118
+ # Katakana Phonetic Extensions (31F0–31FF)
119
+ # Enclosed CJK Letters and Months (3200–32FF)
120
+ # CJK Compatibility (3300–33FF)
121
+ # CJK Unified Ideographs Extension A (3400–4DBF)
122
+ # Yijing Hexagram Symbols (4DC0–4DFF)
123
+ # CJK Unified Ideographs (4E00–9FFF)
124
+ # Yi Syllables (A000–A48F)
125
+ # Yi Radicals (A490–A4CF)
126
+ CJK_Radicals = (11904, 42191) # (ord(u"\u2e80"), ord(u"\ua4cf"))
127
+
128
+ # Phags-pa (A840–A87F)
129
+ Phags_Pa = (43072, 43135) # (ord(u"\ua840"), ord(u"\ua87f"))
130
+
131
+ # Hangul Syllables (AC00–D7AF)
132
+ Hangul_Syllables = (44032, 55215) # (ord(u"\uAC00"), ord(u"\uD7AF"))
133
+
134
+ # CJK Compatibility Ideographs (F900–FAFF)
135
+ CJK_Compatibility_Ideographs = (63744, 64255) # (ord(u"\uF900"), ord(u"\uFAFF"))
136
+
137
+ # CJK Compatibility Forms (FE30–FE4F)
138
+ CJK_Compatibility_Forms = (65072, 65103) # (ord(u"\uFE30"), ord(u"\uFE4F"))
139
+
140
+ # Range U+FF65–FFDC encodes halfwidth forms, of Katakana and Hangul characters
141
+ Katakana_Hangul_Halfwidth = (65381, 65500) # (ord(u"\uFF65"), ord(u"\uFFDC"))
142
+
143
+ # Supplementary Ideographic Plane 20000–2FFFF
144
+ Supplementary_Ideographic_Plane = (131072, 196607) # (ord(u"\U00020000"), ord(u"\U0002FFFF"))
145
+
146
+ ranges = [Hangul_Jamo, CJK_Radicals, Phags_Pa, Hangul_Syllables,
147
+ CJK_Compatibility_Ideographs, CJK_Compatibility_Forms,
148
+ Katakana_Hangul_Halfwidth, Supplementary_Ideographic_Plane]
149
+
150
+
151
+ def is_cjk(character):
152
+ """
153
+ Python port of Moses' code to check for CJK character.
154
+
155
+ >>> CJKChars().ranges
156
+ [(4352, 4607), (11904, 42191), (43072, 43135), (44032, 55215), (63744, 64255), (65072, 65103), (65381, 65500), (131072, 196607)]
157
+ >>> is_cjk(u'\u33fe')
158
+ True
159
+ >>> is_cjk(u'\uFE5F')
160
+ False
161
+
162
+ :param character: The character that needs to be checked.
163
+ :type character: char
164
+ :return: bool
165
+ """
166
+ return any([start <= ord(character) <= end for start, end in
167
+ [(4352, 4607), (11904, 42191), (43072, 43135), (44032, 55215),
168
+ (63744, 64255), (65072, 65103), (65381, 65500),
169
+ (131072, 196607)]
170
+ ])
171
+
172
+
173
+ def xml_escape(text):
174
+ """
175
+ This function transforms the input text into an "escaped" version suitable
176
+ for well-formed XML formatting.
177
+
178
+ Note that the default xml.sax.saxutils.escape() function don't escape
179
+ some characters that Moses does so we have to manually add them to the
180
+ entities dictionary.
181
+
182
+ >>> input_str = ''')| & < > ' " ] ['''
183
+ >>> expected_output = ''')| &amp; &lt; &gt; ' " ] ['''
184
+ >>> escape(input_str) == expected_output
185
+ True
186
+ >>> xml_escape(input_str)
187
+ ')&#124; &amp; &lt; &gt; &apos; &quot; &#93; &#91;'
188
+
189
+ :param text: The text that needs to be escaped.
190
+ :type text: str
191
+ :rtype: str
192
+ """
193
+ return escape(text, entities={r"'": r"&apos;", r'"': r"&quot;",
194
+ r"|": r"&#124;",
195
+ r"[": r"&#91;", r"]": r"&#93;", })
196
+
197
+
198
+ def xml_unescape(text):
199
+ """
200
+ This function transforms the "escaped" version suitable
201
+ for well-formed XML formatting into humanly-readable string.
202
+
203
+ Note that the default xml.sax.saxutils.unescape() function don't unescape
204
+ some characters that Moses does so we have to manually add them to the
205
+ entities dictionary.
206
+
207
+ >>> from xml.sax.saxutils import unescape
208
+ >>> s = ')&#124; &amp; &lt; &gt; &apos; &quot; &#93; &#91;'
209
+ >>> expected = ''')| & < > \' " ] ['''
210
+ >>> xml_unescape(s) == expected
211
+ True
212
+
213
+ :param text: The text that needs to be unescaped.
214
+ :type text: str
215
+ :rtype: str
216
+ """
217
+ return unescape(text, entities={r"&apos;": r"'", r"&quot;": r'"',
218
+ r"&#124;": r"|",
219
+ r"&#91;": r"[", r"&#93;": r"]", })
220
+
221
+
222
+ def align_tokens(tokens, sentence):
223
+ """
224
+ This module attempt to find the offsets of the tokens in *s*, as a sequence
225
+ of ``(start, end)`` tuples, given the tokens and also the source string.
226
+
227
+ >>> from nltk.tokenize import TreebankWordTokenizer
228
+ >>> from nltk.tokenize.util import align_tokens
229
+ >>> s = str("The plane, bound for St Petersburg, crashed in Egypt's "
230
+ ... "Sinai desert just 23 minutes after take-off from Sharm el-Sheikh "
231
+ ... "on Saturday.")
232
+ >>> tokens = TreebankWordTokenizer().tokenize(s)
233
+ >>> expected = [(0, 3), (4, 9), (9, 10), (11, 16), (17, 20), (21, 23),
234
+ ... (24, 34), (34, 35), (36, 43), (44, 46), (47, 52), (52, 54),
235
+ ... (55, 60), (61, 67), (68, 72), (73, 75), (76, 83), (84, 89),
236
+ ... (90, 98), (99, 103), (104, 109), (110, 119), (120, 122),
237
+ ... (123, 131), (131, 132)]
238
+ >>> output = list(align_tokens(tokens, s))
239
+ >>> len(tokens) == len(expected) == len(output) # Check that length of tokens and tuples are the same.
240
+ True
241
+ >>> expected == list(align_tokens(tokens, s)) # Check that the output is as expected.
242
+ True
243
+ >>> tokens == [s[start:end] for start, end in output] # Check that the slices of the string corresponds to the tokens.
244
+ True
245
+
246
+ :param tokens: The list of strings that are the result of tokenization
247
+ :type tokens: list(str)
248
+ :param sentence: The original string
249
+ :type sentence: str
250
+ :rtype: list(tuple(int,int))
251
+ """
252
+ point = 0
253
+ offsets = []
254
+ for token in tokens:
255
+ try:
256
+ start = sentence.index(token, point)
257
+ except ValueError:
258
+ raise ValueError('substring "{}" not found in "{}"'.format(token, sentence))
259
+ point = start + len(token)
260
+ offsets.append((start, point))
261
+ return offsets
@@ -1,7 +1,7 @@
1
1
  # coding: utf-8
2
2
  # Natural Language Toolkit: Toolbox Reader
3
3
  #
4
- # Copyright (C) 2001-2016 NLTK Project
4
+ # Copyright (C) 2001-2018 NLTK Project
5
5
  # Author: Greg Aumann <greg_aumann@sil.org>
6
6
  # URL: <http://nltk.org>
7
7
  # For license information, see LICENSE.TXT
@@ -15,7 +15,9 @@ from __future__ import print_function
15
15
  import os, re, codecs
16
16
  from xml.etree.ElementTree import ElementTree, TreeBuilder, Element, SubElement
17
17
 
18
- from nltk.compat import StringIO, u, PY3
18
+ from six import u
19
+
20
+ from nltk.compat import StringIO, PY3
19
21
  from nltk.data import PathPointer, ZipFilePathPointer, find
20
22
 
21
23
 
@@ -1,7 +1,7 @@
1
1
  # -*- coding: utf-8 -*-
2
2
  # Natural Language Toolkit: Machine Translation
3
3
  #
4
- # Copyright (C) 2001-2016 NLTK Project
4
+ # Copyright (C) 2001-2018 NLTK Project
5
5
  # Author: Steven Bird <stevenbird1@gmail.com>, Tah Wei Hoon <hoon.tw@gmail.com>
6
6
  # URL: <http://nltk.org/>
7
7
  # For license information, see LICENSE.TXT