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
@@ -1,6 +1,6 @@
1
1
  # Natural Language Toolkit: Stemmers
2
2
  #
3
- # Copyright (C) 2001-2016 NLTK Project
3
+ # Copyright (C) 2001-2018 NLTK Project
4
4
  # Author: Trevor Cohn <tacohn@cs.mu.oz.au>
5
5
  # Edward Loper <edloper@gmail.com>
6
6
  # Steven Bird <stevenbird1@gmail.com>
@@ -54,7 +54,7 @@ class RegexpStemmer(StemmerI):
54
54
  return self._regexp.sub('', word)
55
55
 
56
56
  def __repr__(self):
57
- return '<RegexpStemmer: %r>' % self._regexp.pattern
57
+ return '<RegexpStemmer: {!r}>'.format(self._regexp.pattern)
58
58
 
59
59
 
60
60
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  # Natural Language Toolkit: RSLP Stemmer
4
4
  #
5
- # Copyright (C) 2001-2016 NLTK Project
5
+ # Copyright (C) 2001-2018 NLTK Project
6
6
  # Author: Tiago Tresoldi <tresoldi@gmail.com>
7
7
  # URL: <http://nltk.org/>
8
8
  # For license information, see LICENSE.TXT
@@ -2,10 +2,15 @@
2
2
  #
3
3
  # Natural Language Toolkit: Snowball Stemmer
4
4
  #
5
- # Copyright (C) 2001-2016 NLTK Project
5
+ # Copyright (C) 2001-2018 NLTK Project
6
6
  # Author: Peter Michael Stahl <pemistahl@gmail.com>
7
7
  # Peter Ljunglof <peter.ljunglof@heatherleaf.se> (revisions)
8
+ # Lakhdar Benzahia <lakhdar.benzahia@gmail.com> (co-writer)
9
+ # Assem Chelli <assem.ch@gmail.com> (reviewer arabicstemmer)
10
+ # Abdelkrim Aries <ab_aries@esi.dz> (reviewer arabicstemmer)
8
11
  # Algorithms: Dr Martin Porter <martin@tartarus.org>
12
+ # Assem Chelli <assem.ch@gmail.com> arabic stemming algorithm
13
+ # Benzahia Lakhdar <lakhdar.benzahia@gmail.com>
9
14
  # URL: <http://nltk.org/>
10
15
  # For license information, see LICENSE.TXT
11
16
 
@@ -20,10 +25,13 @@ There is also a demo function: `snowball.demo()`.
20
25
  """
21
26
  from __future__ import unicode_literals, print_function
22
27
 
28
+ from six.moves import input
29
+ import re
30
+
23
31
  from nltk import compat
24
32
  from nltk.corpus import stopwords
25
33
  from nltk.stem import porter
26
- from nltk.stem.util import suffix_replace
34
+ from nltk.stem.util import suffix_replace, prefix_replace
27
35
 
28
36
  from nltk.stem.api import StemmerI
29
37
 
@@ -34,7 +42,7 @@ class SnowballStemmer(StemmerI):
34
42
  Snowball Stemmer
35
43
 
36
44
  The following languages are supported:
37
- Danish, Dutch, English, Finnish, French, German,
45
+ Arabic, Danish, Dutch, English, Finnish, French, German,
38
46
  Hungarian, Italian, Norwegian, Portuguese, Romanian, Russian,
39
47
  Spanish and Swedish.
40
48
 
@@ -53,7 +61,7 @@ class SnowballStemmer(StemmerI):
53
61
 
54
62
  >>> from nltk.stem import SnowballStemmer
55
63
  >>> print(" ".join(SnowballStemmer.languages)) # See which languages are supported
56
- danish dutch english finnish french german hungarian
64
+ arabic danish dutch english finnish french german hungarian
57
65
  italian norwegian porter portuguese romanian russian
58
66
  spanish swedish
59
67
  >>> stemmer = SnowballStemmer("german") # Choose a language
@@ -79,17 +87,20 @@ class SnowballStemmer(StemmerI):
79
87
  language, a ValueError is raised.
80
88
  """
81
89
 
82
- languages = ("danish", "dutch", "english", "finnish", "french", "german",
90
+ languages = ("arabic", "danish", "dutch", "english", "finnish", "french", "german",
83
91
  "hungarian", "italian", "norwegian", "porter", "portuguese",
84
92
  "romanian", "russian", "spanish", "swedish")
85
93
 
86
94
  def __init__(self, language, ignore_stopwords=False):
87
95
  if language not in self.languages:
88
- raise ValueError("The language '%s' is not supported." % language)
96
+ raise ValueError("The language '{0}' is not supported.".format(language))
89
97
  stemmerclass = globals()[language.capitalize() + "Stemmer"]
90
98
  self.stemmer = stemmerclass(ignore_stopwords)
91
99
  self.stem = self.stemmer.stem
92
100
  self.stopwords = self.stemmer.stopwords
101
+
102
+ def stem(self, token):
103
+ return self.stemmer.stem(self, token)
93
104
 
94
105
 
95
106
  @compat.python_2_unicode_compatible
@@ -120,15 +131,15 @@ class _LanguageSpecificStemmer(StemmerI):
120
131
  for word in stopwords.words(language):
121
132
  self.stopwords.add(word)
122
133
  except IOError:
123
- raise ValueError("%r has no list of stopwords. Please set"
124
- " 'ignore_stopwords' to 'False'." % self)
134
+ raise ValueError("{!r} has no list of stopwords. Please set"
135
+ " 'ignore_stopwords' to 'False'.".format(self))
125
136
 
126
137
  def __repr__(self):
127
138
  """
128
139
  Print out the string representation of the respective class.
129
140
 
130
141
  """
131
- return "<%s>" % type(self).__name__
142
+ return "<{0}>".format(type(self).__name__)
132
143
 
133
144
 
134
145
  class PorterStemmer(_LanguageSpecificStemmer, porter.PorterStemmer):
@@ -283,6 +294,520 @@ class _StandardStemmer(_LanguageSpecificStemmer):
283
294
 
284
295
  return rv
285
296
 
297
+ class ArabicStemmer(_LanguageSpecificStemmer):
298
+ """
299
+ https://github.com/snowballstem/snowball/blob/master/algorithms/arabic/stem_Unicode.sbl (Original Algorithm)
300
+ The Snowball Arabic light Stemmer
301
+ Algorithm : Assem Chelli
302
+ Abdelkrim Aries
303
+ Lakhdar Benzahia
304
+ Nltk Version Author : Lakhdar Benzahia
305
+ """
306
+ # Normalize_pre stes
307
+ __vocalization = re.compile(r'[\u064b-\u064c-\u064d-\u064e-\u064f-\u0650-\u0651-\u0652]') # ً، ٌ، ٍ، َ، ُ، ِ، ّ، ْ
308
+
309
+ __kasheeda = re.compile(r'[\u0640]') # ـ tatweel/kasheeda
310
+
311
+ __arabic_punctuation_marks = re.compile(r'[\u060C-\u061B-\u061F]') # ؛ ، ؟
312
+
313
+ # Normalize_post
314
+ __last_hamzat = ('\u0623', '\u0625', '\u0622', '\u0624', '\u0626') # أ، إ، آ، ؤ، ئ
315
+
316
+ # normalize other hamza's
317
+ __initial_hamzat = re.compile(r'^[\u0622\u0623\u0625]') # أ، إ، آ
318
+
319
+ __waw_hamza = re.compile(r'[\u0624]') # ؤ
320
+
321
+ __yeh_hamza = re.compile(r'[\u0626]') # ئ
322
+
323
+ __alefat = re.compile(r'[\u0623\u0622\u0625]') # أ، إ، آ
324
+
325
+ # Checks
326
+ __checks1 = ('\u0643\u0627\u0644', '\u0628\u0627\u0644', # بال، كال
327
+ '\u0627\u0644', '\u0644\u0644' # لل، ال
328
+ )
329
+
330
+ __checks2 = ('\u0629', # ة
331
+ '\u0627\u062a' # female plural ات
332
+ )
333
+
334
+ # Suffixes
335
+ __suffix_noun_step1a = ('\u064a', '\u0643', '\u0647', # ي، ك، ه
336
+ '\u0646\u0627', '\u0643\u0645', '\u0647\u0627', '\u0647\u0646', '\u0647\u0645', # نا، كم، ها، هن، هم
337
+ '\u0643\u0645\u0627', '\u0647\u0645\u0627' # كما، هما
338
+ )
339
+
340
+ __suffix_noun_step1b = ('\u0646') # ن
341
+
342
+ __suffix_noun_step2a = ('\u0627', '\u064a', '\u0648') # ا، ي، و
343
+
344
+ __suffix_noun_step2b = ('\u0627\u062a') # ات
345
+
346
+ __suffix_noun_step2c1 = ('\u062a') # ت
347
+
348
+ __suffix_noun_step2c2 = ('\u0629') # ة
349
+
350
+ __suffix_noun_step3 = ('\u064a') # ي
351
+
352
+ __suffix_verb_step1 = ('\u0647', '\u0643', # ه، ك
353
+ '\u0646\u064a', '\u0646\u0627', '\u0647\u0627', '\u0647\u0645', # ني، نا، ها، هم
354
+ '\u0647\u0646', '\u0643\u0645', '\u0643\u0646', # هن، كم، كن
355
+ '\u0647\u0645\u0627', '\u0643\u0645\u0627', '\u0643\u0645\u0648' # هما، كما، كمو
356
+ )
357
+
358
+ __suffix_verb_step2a = ( '\u062a', '\u0627', '\u0646' , '\u064a', # ت، ا، ن، ي
359
+ '\u0646\u0627', '\u062a\u0627', '\u062a\u0646', # نا، تا، تن Past
360
+ '\u0627\u0646', '\u0648\u0646', '\u064a\u0646', # ان، هن، ين Present
361
+ '\u062a\u0645\u0627' # تما
362
+ )
363
+
364
+ __suffix_verb_step2b = ('\u0648\u0627','\u062a\u0645') # وا، تم
365
+
366
+ __suffix_verb_step2c = ('\u0648', # و
367
+ '\u062a\u0645\u0648' # تمو
368
+ )
369
+
370
+ __suffix_all_alef_maqsura = ('\u0649') # ى
371
+
372
+ # Prefixes
373
+ __prefix_step1 = ('\u0623', # أ
374
+ '\u0623\u0623', '\u0623\u0622', '\u0623\u0624', '\u0623\u0627', '\u0623\u0625', # أأ، أآ، أؤ، أا، أإ
375
+ )
376
+
377
+ __prefix_step2a = ('\u0641\u0627\u0644', '\u0648\u0627\u0644') # فال، وال
378
+
379
+ __prefix_step2b = ('\u0641', '\u0648') # ف، و
380
+
381
+ __prefix_step3a_noun = ('\u0627\u0644', '\u0644\u0644', # لل، ال
382
+ '\u0643\u0627\u0644', '\u0628\u0627\u0644', # بال، كال
383
+ )
384
+
385
+ __prefix_step3b_noun = ('\u0628', '\u0643', '\u0644', # ب، ك، ل
386
+ '\u0628\u0628', '\u0643\u0643' # بب، كك
387
+ )
388
+
389
+ __prefix_step3_verb = ('\u0633\u064a', '\u0633\u062a', '\u0633\u0646', '\u0633\u0623') # سي، ست، سن، سأ
390
+
391
+ __prefix_step4_verb = ('\u064a\u0633\u062a', '\u0646\u0633\u062a', '\u062a\u0633\u062a') # يست، نست، تست
392
+
393
+ # Suffixes added due to Conjugation Verbs
394
+ __conjugation_suffix_verb_1 = ('\u0647', '\u0643') # ه، ك
395
+
396
+ __conjugation_suffix_verb_2 = ('\u0646\u064a', '\u0646\u0627','\u0647\u0627', # ني، نا، ها
397
+ '\u0647\u0645', '\u0647\u0646', '\u0643\u0645', # هم، هن، كم
398
+ '\u0643\u0646' # كن
399
+ )
400
+ __conjugation_suffix_verb_3 = ('\u0647\u0645\u0627', '\u0643\u0645\u0627', '\u0643\u0645\u0648') # هما، كما، كمو
401
+
402
+ __conjugation_suffix_verb_4 = ('\u0627', '\u0646', '\u064a') # ا، ن، ي
403
+
404
+ __conjugation_suffix_verb_past = ('\u0646\u0627', '\u062a\u0627', '\u062a\u0646') # نا، تا، تن
405
+
406
+ __conjugation_suffix_verb_present = ('\u0627\u0646', '\u0648\u0646', '\u064a\u0646') # ان، ون، ين
407
+
408
+ # Suffixes added due to derivation Names
409
+ __conjugation_suffix_noun_1 = ('\u064a', '\u0643', '\u0647') # ي، ك، ه
410
+
411
+ __conjugation_suffix_noun_2 = ('\u0646\u0627', '\u0643\u0645', # نا، كم
412
+ '\u0647\u0627', '\u0647\u0646', '\u0647\u0645' # ها، هن، هم
413
+ )
414
+
415
+ __conjugation_suffix_noun_3 = ('\u0643\u0645\u0627', '\u0647\u0645\u0627') # كما، هما
416
+
417
+ # Prefixes added due to derivation Names
418
+ __prefixes1 = ('\u0648\u0627', '\u0641\u0627') # فا، وا
419
+
420
+ __articles_3len = ('\u0643\u0627\u0644', '\u0628\u0627\u0644') # بال كال
421
+
422
+ __articles_2len = ('\u0627\u0644', '\u0644\u0644') # ال لل
423
+
424
+ # Prepositions letters
425
+ __prepositions1 = ('\u0643', '\u0644') # ك، ل
426
+ __prepositions2 = ('\u0628\u0628', '\u0643\u0643') # بب، كك
427
+
428
+ is_verb = True
429
+ is_noun = True
430
+ is_defined = False
431
+
432
+ suffixes_verb_step1_success = False
433
+ suffix_verb_step2a_success = False
434
+ suffix_verb_step2b_success = False
435
+ suffix_noun_step2c2_success = False
436
+ suffix_noun_step1a_success = False
437
+ suffix_noun_step2a_success = False
438
+ suffix_noun_step2b_success = False
439
+ suffixe_noun_step1b_success = False
440
+ prefix_step2a_success = False
441
+ prefix_step3a_noun_success = False
442
+ prefix_step3b_noun_success = False
443
+
444
+ def __normalize_pre(self, token):
445
+ """
446
+ :param token: string
447
+ :return: normalized token type string
448
+ """
449
+ # strip diacritics
450
+ token = self.__vocalization.sub('', token)
451
+ #strip kasheeda
452
+ token = self.__kasheeda.sub('', token)
453
+ # strip punctuation marks
454
+ token = self.__arabic_punctuation_marks.sub('', token)
455
+ return token
456
+
457
+ def __normalize_post(self, token):
458
+ # normalize last hamza
459
+ for hamza in self.__last_hamzat:
460
+ if token.endswith(hamza):
461
+ token = suffix_replace(token, hamza, '\u0621')
462
+ break
463
+ # normalize other hamzat
464
+ token = self.__initial_hamzat.sub('\u0627', token)
465
+ token = self.__waw_hamza.sub('\u0648', token)
466
+ token = self.__yeh_hamza.sub('\u064a', token)
467
+ token = self.__alefat.sub('\u0627', token)
468
+ return token
469
+
470
+ def __checks_1(self, token):
471
+ for prefix in self.__checks1 :
472
+ if token.startswith(prefix):
473
+ if prefix in self.__articles_3len and len(token) > 4 :
474
+ self.is_noun = True
475
+ self.is_verb = False
476
+ self.is_defined = True
477
+ break
478
+
479
+ if prefix in self.__articles_2len and len(token) > 3 :
480
+ self.is_noun = True
481
+ self.is_verb = False
482
+ self.is_defined = True
483
+ break
484
+
485
+ def __checks_2(self, token):
486
+ for suffix in self.__checks2:
487
+ if token.endswith(suffix):
488
+ if suffix == '\u0629' and len(token) > 2:
489
+ self.is_noun = True
490
+ self.is_verb = False
491
+ break
492
+
493
+ if suffix == '\u0627\u062a' and len(token) > 3:
494
+ self.is_noun = True
495
+ self.is_verb = False
496
+ break
497
+
498
+ def __Suffix_Verb_Step1(self, token):
499
+ for suffix in self.__suffix_verb_step1:
500
+ if token.endswith(suffix):
501
+ if suffix in self.__conjugation_suffix_verb_1 and len(token) >= 4:
502
+ token = token[:-1]
503
+ self.suffixes_verb_step1_success = True
504
+ break
505
+
506
+ if suffix in self.__conjugation_suffix_verb_2 and len(token) >= 5:
507
+ token = token[:-2]
508
+ self.suffixes_verb_step1_success = True
509
+ break
510
+
511
+ if suffix in self.__conjugation_suffix_verb_3 and len(token) >= 6:
512
+ token = token[:-3]
513
+ self.suffixes_verb_step1_success = True
514
+ break
515
+ return token
516
+
517
+ def __Suffix_Verb_Step2a(self, token):
518
+ for suffix in self.__suffix_verb_step2a:
519
+ if token.endswith(suffix):
520
+ if suffix == '\u062a' and len(token) >= 4:
521
+ token = token[:-1]
522
+ self.suffix_verb_step2a_success = True
523
+ break
524
+
525
+ if suffix in self.__conjugation_suffix_verb_4 and len(token) >= 4:
526
+ token = token[:-1]
527
+ self.suffix_verb_step2a_success = True
528
+ break
529
+
530
+ if suffix in self.__conjugation_suffix_verb_past and len(token) >= 5:
531
+ token = token[:-2] # past
532
+ self.suffix_verb_step2a_success = True
533
+ break
534
+
535
+ if suffix in self.__conjugation_suffix_verb_present and len(token) > 5:
536
+ token = token[:-2] # present
537
+ self.suffix_verb_step2a_success = True
538
+ break
539
+
540
+ if suffix == '\u062a\u0645\u0627' and len(token) >= 6:
541
+ token = token[:-3]
542
+ self.suffix_verb_step2a_success = True
543
+ break
544
+ return token
545
+
546
+ def __Suffix_Verb_Step2c(self, token):
547
+ for suffix in self.__suffix_verb_step2c:
548
+ if token.endswith(suffix):
549
+ if suffix == '\u062a\u0645\u0648' and len(token) >= 6:
550
+ token = token[:-3]
551
+ break
552
+
553
+ if suffix == '\u0648' and len(token) >= 4:
554
+ token = token[:-1]
555
+ break
556
+ return token
557
+
558
+ def __Suffix_Verb_Step2b(self, token):
559
+ for suffix in self.__suffix_verb_step2b:
560
+ if token.endswith(suffix) and len(token) >= 5:
561
+ token = token[:-2]
562
+ self.suffix_verb_step2b_success = True
563
+ break
564
+ return token
565
+
566
+ def __Suffix_Noun_Step2c2(self, token):
567
+ for suffix in self.__suffix_noun_step2c2:
568
+ if token.endswith(suffix) and len(token) >= 3:
569
+ token = token[:-1]
570
+ self.suffix_noun_step2c2_success = True
571
+ break
572
+ return token
573
+
574
+ def __Suffix_Noun_Step1a(self, token):
575
+ for suffix in self.__suffix_noun_step1a:
576
+ if token.endswith(suffix):
577
+ if suffix in self.__conjugation_suffix_noun_1 and len(token) >= 4:
578
+ token = token[:-1]
579
+ self.suffix_noun_step1a_success = True
580
+ break
581
+
582
+ if suffix in self.__conjugation_suffix_noun_2 and len(token) >= 5:
583
+ token = token[:-2]
584
+ self.suffix_noun_step1a_success = True
585
+ break
586
+
587
+ if suffix in self.__conjugation_suffix_noun_3 and len(token) >= 6:
588
+ token = token[:-3]
589
+ self.suffix_noun_step1a_success = True
590
+ break
591
+ return token
592
+
593
+ def __Suffix_Noun_Step2a(self, token):
594
+ for suffix in self.__suffix_noun_step2a:
595
+ if token.endswith(suffix) and len(token) > 4:
596
+ token = token[:-1]
597
+ self.suffix_noun_step2a_success = True
598
+ break
599
+ return token
600
+
601
+ def __Suffix_Noun_Step2b(self, token):
602
+ for suffix in self.__suffix_noun_step2b:
603
+ if token.endswith(suffix) and len(token) >= 5:
604
+ token = token[:-2]
605
+ self.suffix_noun_step2b_success = True
606
+ break
607
+ return token
608
+
609
+ def __Suffix_Noun_Step2c1(self, token):
610
+ for suffix in self.__suffix_noun_step2c1:
611
+ if token.endswith(suffix) and len(token) >= 4:
612
+ token = token[:-1]
613
+ break
614
+ return token
615
+
616
+ def __Suffix_Noun_Step1b(self, token):
617
+ for suffix in self.__suffix_noun_step1b:
618
+ if token.endswith(suffix) and len(token) > 5:
619
+ token = token[:-1]
620
+ self.suffixe_noun_step1b_success = True
621
+ break
622
+ return token
623
+
624
+ def __Suffix_Noun_Step3(self, token):
625
+ for suffix in self.__suffix_noun_step3:
626
+ if token.endswith(suffix) and len(token) >= 3:
627
+ token = token[:-1] # ya' nisbiya
628
+ break
629
+ return token
630
+
631
+ def __Suffix_All_alef_maqsura(self, token):
632
+ for suffix in self.__suffix_all_alef_maqsura:
633
+ if token.endswith(suffix):
634
+ token = suffix_replace(token, suffix, '\u064a')
635
+ return token
636
+
637
+ def __Prefix_Step1(self, token):
638
+ for prefix in self.__prefix_step1:
639
+ if token.startswith(prefix) and len(token) > 3:
640
+ if prefix == '\u0623\u0623':
641
+ token = prefix_replace(token, prefix, '\u0623')
642
+ break
643
+
644
+ elif prefix == '\u0623\u0622':
645
+ token = prefix_replace(token, prefix, '\u0622')
646
+ break
647
+
648
+ elif prefix == '\u0623\u0624':
649
+ token = prefix_replace(token, prefix, '\u0624')
650
+ break
651
+
652
+ elif prefix == '\u0623\u0627' :
653
+ token = prefix_replace(token, prefix, '\u0627')
654
+ break
655
+
656
+ elif prefix == '\u0623\u0625' :
657
+ token = prefix_replace(token, prefix, '\u0625')
658
+ break
659
+ return token
660
+
661
+ def __Prefix_Step2a(self, token):
662
+ for prefix in self.__prefix_step2a:
663
+ if token.startswith(prefix) and len(token) > 5:
664
+ token = token[len(prefix):]
665
+ self.prefix_step2a_success = True
666
+ break
667
+ return token
668
+
669
+ def __Prefix_Step2b(self, token):
670
+ for prefix in self.__prefix_step2b:
671
+ if token.startswith(prefix) and len(token) > 3 :
672
+ if token[:2] not in self.__prefixes1:
673
+ token = token[len(prefix):]
674
+ break
675
+ return token
676
+
677
+ def __Prefix_Step3a_Noun(self, token):
678
+ for prefix in self.__prefix_step3a_noun:
679
+ if token.startswith(prefix):
680
+ if prefix in self.__articles_2len and len(token) > 4:
681
+ token = token[len(prefix):]
682
+ self.prefix_step3a_noun_success = True
683
+ break
684
+ if prefix in self.__articles_3len and len(token) > 5:
685
+ token = token[len(prefix):]
686
+ break
687
+ return token
688
+
689
+ def __Prefix_Step3b_Noun(self, token):
690
+ for prefix in self.__prefix_step3b_noun:
691
+ if token.startswith(prefix):
692
+ if len(token) > 3:
693
+ if prefix == '\u0628':
694
+ token = token[len(prefix):]
695
+ self.prefix_step3b_noun_success = True
696
+ break
697
+
698
+ if prefix in self.__prepositions2:
699
+ token = prefix_replace(token, prefix, prefix[1])
700
+ self.prefix_step3b_noun_success = True
701
+ break
702
+
703
+ if prefix in self.__prepositions1 and len(token) > 4:
704
+ token = token[len(prefix):] # BUG: cause confusion
705
+ self.prefix_step3b_noun_success = True
706
+ break
707
+ return token
708
+
709
+ def __Prefix_Step3_Verb(self, token):
710
+ for prefix in self.__prefix_step3_verb:
711
+ if token.startswith(prefix) and len(token) > 4:
712
+ token = prefix_replace(token, prefix, prefix[1])
713
+ break
714
+ return token
715
+
716
+ def __Prefix_Step4_Verb(self, token):
717
+ for prefix in self.__prefix_step4_verb:
718
+ if token.startswith(prefix) and len(token) > 4:
719
+ token = prefix_replace(token, prefix, '\u0627\u0633\u062a')
720
+ self.is_verb = True
721
+ self.is_noun = False
722
+ break
723
+ return token
724
+
725
+ def stem(self, word):
726
+ """
727
+ Stem an Arabic word and return the stemmed form.
728
+ :param word: string
729
+ :return: string
730
+ """
731
+ # set initial values
732
+ self.is_verb = True
733
+ self.is_noun = True
734
+ self.is_defined = False
735
+
736
+ self.suffix_verb_step2a_success = False
737
+ self.suffix_verb_step2b_success = False
738
+ self.suffix_noun_step2c2_success = False
739
+ self.suffix_noun_step1a_success = False
740
+ self.suffix_noun_step2a_success = False
741
+ self.suffix_noun_step2b_success = False
742
+ self.suffixe_noun_step1b_success = False
743
+ self.prefix_step2a_success = False
744
+ self.prefix_step3a_noun_success = False
745
+ self.prefix_step3b_noun_success = False
746
+
747
+ modified_word = word
748
+ # guess type and properties
749
+ # checks1
750
+ self.__checks_1(modified_word)
751
+ # checks2
752
+ self.__checks_2(modified_word)
753
+ modified_word = self.__normalize_pre(modified_word)
754
+ if self.is_verb:
755
+ modified_word = self.__Suffix_Verb_Step1(modified_word)
756
+ if self.suffixes_verb_step1_success:
757
+ modified_word = self.__Suffix_Verb_Step2a(modified_word)
758
+ if not self.suffix_verb_step2a_success :
759
+ modified_word = self.__Suffix_Verb_Step2c(modified_word)
760
+ #or next
761
+ else:
762
+ modified_word = self.__Suffix_Verb_Step2b(modified_word)
763
+ if not self.suffix_verb_step2b_success:
764
+ modified_word = self.__Suffix_Verb_Step2a(modified_word)
765
+ if self.is_noun:
766
+ modified_word = self.__Suffix_Noun_Step2c2(modified_word)
767
+ if not self.suffix_noun_step2c2_success:
768
+ if not self.is_defined:
769
+ modified_word = self.__Suffix_Noun_Step1a(modified_word)
770
+ #if self.suffix_noun_step1a_success:
771
+ modified_word = self.__Suffix_Noun_Step2a(modified_word)
772
+ if not self.suffix_noun_step2a_success:
773
+ modified_word = self.__Suffix_Noun_Step2b(modified_word)
774
+ if not self.suffix_noun_step2b_success and not self.suffix_noun_step2a_success:
775
+ modified_word = self.__Suffix_Noun_Step2c1(modified_word)
776
+ # or next ? todo : how to deal with or next
777
+ else:
778
+ modified_word = self.__Suffix_Noun_Step1b(modified_word)
779
+ if self.suffixe_noun_step1b_success:
780
+ modified_word = self.__Suffix_Noun_Step2a(modified_word)
781
+ if not self.suffix_noun_step2a_success:
782
+ modified_word = self.__Suffix_Noun_Step2b(modified_word)
783
+ if not self.suffix_noun_step2b_success and not self.suffix_noun_step2a_success:
784
+ modified_word = self.__Suffix_Noun_Step2c1(modified_word)
785
+ else:
786
+ if not self.is_defined:
787
+ modified_word = self.__Suffix_Noun_Step2a(modified_word)
788
+ modified_word = self.__Suffix_Noun_Step2b(modified_word)
789
+ modified_word = self.__Suffix_Noun_Step3(modified_word)
790
+ if not self.is_noun and self.is_verb:
791
+ modified_word = self.__Suffix_All_alef_maqsura(modified_word)
792
+
793
+ # prefixes
794
+ modified_word = self.__Prefix_Step1(modified_word)
795
+ modified_word = self.__Prefix_Step2a(modified_word)
796
+ if not self.prefix_step2a_success:
797
+ modified_word = self.__Prefix_Step2b(modified_word)
798
+ modified_word = self.__Prefix_Step3a_Noun(modified_word)
799
+ if not self.prefix_step3a_noun_success and self.is_noun:
800
+ modified_word = self.__Prefix_Step3b_Noun(modified_word)
801
+ else:
802
+ if not self.prefix_step3b_noun_success and self.is_verb:
803
+ modified_word = self.__Prefix_Step3_Verb(modified_word)
804
+ modified_word = self.__Prefix_Step4_Verb(modified_word)
805
+
806
+ # post normalization stemming
807
+ modified_word = self.__normalize_post(modified_word)
808
+ stemmed_word = modified_word
809
+ return stemmed_word
810
+
286
811
  class DanishStemmer(_ScandinavianStemmer):
287
812
 
288
813
  """
@@ -3653,7 +4178,8 @@ def demo():
3653
4178
  import re
3654
4179
  from nltk.corpus import udhr
3655
4180
 
3656
- udhr_corpus = {"danish": "Danish_Dansk-Latin1",
4181
+ udhr_corpus = {"arabic": "Arabic_Alarabia-Arabic",
4182
+ "danish": "Danish_Dansk-Latin1",
3657
4183
  "dutch": "Dutch_Nederlands-Latin1",
3658
4184
  "english": "English-Latin1",
3659
4185
  "finnish": "Finnish_Suomi-Latin1",
@@ -3677,7 +4203,7 @@ def demo():
3677
4203
 
3678
4204
  while True:
3679
4205
 
3680
- language = compat.raw_input("Please enter the name of the language " +
4206
+ language = input("Please enter the name of the language " +
3681
4207
  "to be demonstrated\n" +
3682
4208
  "/".join(SnowballStemmer.languages) +
3683
4209
  "\n" +
@@ -3708,5 +4234,3 @@ def demo():
3708
4234
  print(stemmed)
3709
4235
  print('-' * 70)
3710
4236
  print("\n")
3711
-
3712
-
@@ -1,6 +1,6 @@
1
1
  # Natural Language Toolkit: Stemmer Utilities
2
2
  #
3
- # Copyright (C) 2001-2016 NLTK Project
3
+ # Copyright (C) 2001-2018 NLTK Project
4
4
  # Author: Helder <he7d3r@gmail.com>
5
5
  # URL: <http://nltk.org/>
6
6
  # For license information, see LICENSE.TXT
@@ -10,3 +10,13 @@ def suffix_replace(original, old, new):
10
10
  Replaces the old suffix of the original string by a new suffix
11
11
  """
12
12
  return original[:-len(old)] + new
13
+
14
+ def prefix_replace(original, old, new):
15
+ """
16
+ Replaces the old prefix of the original string by a new suffix
17
+ :param original: string
18
+ :param old: string
19
+ :param new: string
20
+ :return: string
21
+ """
22
+ return new + original[len(old):]
@@ -1,6 +1,6 @@
1
1
  # Natural Language Toolkit: WordNet stemmer interface
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/>