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,369 @@
1
+ # -*- coding: utf-8 -*-
2
+ #
3
+ # Natural Language Toolkit: ARLSTem Stemmer
4
+ #
5
+ # Copyright (C) 2001-2018 NLTK Project
6
+ #
7
+ # Author: Kheireddine Abainia (x-programer) <k.abainia@gmail.com>
8
+ # Algorithms: Kheireddine Abainia <k.abainia@gmail.com>
9
+ # Siham Ouamour
10
+ # Halim Sayoud
11
+ # URL: <http://nltk.org/>
12
+ # For license information, see LICENSE.TXT
13
+
14
+
15
+ """
16
+ ARLSTem Arabic Stemmer
17
+ The details about the implementation of this algorithm are described in:
18
+ K. Abainia, S. Ouamour and H. Sayoud, A Novel Robust Arabic Light Stemmer ,
19
+ Journal of Experimental & Theoretical Artificial Intelligence (JETAI'17),
20
+ Vol. 29, No. 3, 2017, pp. 557-573.
21
+ The ARLSTem is a light Arabic stemmer that is based on removing the affixes
22
+ from the word (i.e. prefixes, suffixes and infixes). It was evaluated and
23
+ compared to several other stemmers using Paice's parameters (under-stemming
24
+ index, over-stemming index and stemming weight), and the results showed that
25
+ ARLSTem is promising and producing high performances. This stemmer is not
26
+ based on any dictionary and can be used on-line effectively.
27
+ """
28
+ from __future__ import unicode_literals
29
+ import re
30
+
31
+ from nltk.stem.api import StemmerI
32
+
33
+
34
+ class ARLSTem(StemmerI):
35
+ '''
36
+ ARLSTem stemmer : a light Arabic Stemming algorithm without any dictionary.
37
+ Department of Telecommunication & Information Processing. USTHB University,
38
+ Algiers, Algeria.
39
+ ARLSTem.stem(token) returns the Arabic stem for the input token.
40
+ The ARLSTem Stemmer requires that all tokens are encoded using Unicode
41
+ encoding.
42
+ '''
43
+
44
+ def __init__(self):
45
+ # different Alif with hamza
46
+ self.re_hamzated_alif = re.compile(r'[\u0622\u0623\u0625]')
47
+ self.re_alifMaqsura = re.compile(r'[\u0649]')
48
+ self.re_diacritics = re.compile(r'[\u064B-\u065F]')
49
+
50
+ # Alif Laam, Laam Laam, Fa Laam, Fa Ba
51
+ self.pr2 = [
52
+ '\u0627\u0644', '\u0644\u0644',
53
+ '\u0641\u0644', '\u0641\u0628'
54
+ ]
55
+ # Ba Alif Laam, Kaaf Alif Laam, Waaw Alif Laam
56
+ self.pr3 = [
57
+ '\u0628\u0627\u0644',
58
+ '\u0643\u0627\u0644',
59
+ '\u0648\u0627\u0644'
60
+ ]
61
+ # Fa Laam Laam, Waaw Laam Laam
62
+ self.pr32 = ['\u0641\u0644\u0644', '\u0648\u0644\u0644']
63
+ # Fa Ba Alif Laam, Waaw Ba Alif Laam, Fa Kaaf Alif Laam
64
+ self.pr4 = [
65
+ '\u0641\u0628\u0627\u0644',
66
+ '\u0648\u0628\u0627\u0644',
67
+ '\u0641\u0643\u0627\u0644'
68
+ ]
69
+
70
+ # Kaf Yaa, Kaf Miim
71
+ self.su2 = [
72
+ '\u0643\u064A',
73
+ '\u0643\u0645'
74
+ ]
75
+ # Ha Alif, Ha Miim
76
+ self.su22 = ['\u0647\u0627', '\u0647\u0645']
77
+ # Kaf Miim Alif, Kaf Noon Shadda
78
+ self.su3 = ['\u0643\u0645\u0627', '\u0643\u0646\u0651']
79
+ # Ha Miim Alif, Ha Noon Shadda
80
+ self.su32 = ['\u0647\u0645\u0627', '\u0647\u0646\u0651']
81
+
82
+ # Alif Noon, Ya Noon, Waaw Noon
83
+ self.pl_si2 = ['\u0627\u0646', '\u064A\u0646', '\u0648\u0646']
84
+ # Taa Alif Noon, Taa Ya Noon
85
+ self.pl_si3 = ['\u062A\u0627\u0646', '\u062A\u064A\u0646']
86
+
87
+ # Alif Noon, Waaw Noon
88
+ self.verb_su2 = ['\u0627\u0646', '\u0648\u0646']
89
+ # Siin Taa, Siin Yaa
90
+ self.verb_pr2 = ['\u0633\u062A', '\u0633\u064A']
91
+ # Siin Alif, Siin Noon
92
+ self.verb_pr22 = ['\u0633\u0627', '\u0633\u0646']
93
+ # Lam Noon, Lam Taa, Lam Yaa, Lam Hamza
94
+ self.verb_pr33 = ['\u0644\u0646', '\u0644\u062A', '\u0644\u064A', '\u0644\u0623']
95
+ # Taa Miim Alif, Taa Noon Shadda
96
+ self.verb_suf3 = ['\u062A\u0645\u0627', '\u062A\u0646\u0651']
97
+ # Noon Alif, Taa Miim, Taa Alif, Waaw Alif
98
+ self.verb_suf2 = [
99
+ '\u0646\u0627', '\u062A\u0645',
100
+ '\u062A\u0627', '\u0648\u0627'
101
+ ]
102
+ # Taa, Alif, Noon
103
+ self.verb_suf1 = ['\u062A', '\u0627', '\u0646']
104
+
105
+ def stem(self, token):
106
+ """
107
+ call this function to get the word's stem based on ARLSTem .
108
+ """
109
+ try:
110
+ if token is None:
111
+ raise ValueError("The word could not be stemmed, because \
112
+ it is empty !")
113
+ # remove Arabic diacritics and replace some letters with others
114
+ token = self.norm(token)
115
+ # strip common prefixes of the nouns
116
+ pre = self.pref(token)
117
+ if pre is not None:
118
+ token = pre
119
+ # strip the suffixes which are common to nouns and verbs
120
+ token = self.suff(token)
121
+ # transform a plural noun to a singular noun
122
+ ps = self.plur2sing(token)
123
+ if ps is None:
124
+ # transform from the feminine form to the masculine form
125
+ fm = self.fem2masc(token)
126
+ if fm is not None:
127
+ return fm
128
+ else:
129
+ if pre is None: # if the prefixes are not stripped
130
+ # strip the verb prefixes and suffixes
131
+ return self.verb(token)
132
+ else:
133
+ return ps
134
+ return token
135
+ except ValueError as e:
136
+ print(e)
137
+
138
+ def norm(self, token):
139
+ """
140
+ normalize the word by removing diacritics, replacing hamzated Alif
141
+ with Alif replacing AlifMaqsura with Yaa and removing Waaw at the
142
+ beginning.
143
+ """
144
+ # strip Arabic diacritics
145
+ token = self.re_diacritics.sub('', token)
146
+ # replace Hamzated Alif with Alif bare
147
+ token = self.re_hamzated_alif.sub('\u0627', token)
148
+ # replace alifMaqsura with Yaa
149
+ token = self.re_alifMaqsura.sub('\u064A', token)
150
+ # strip the Waaw from the word beginning if the remaining is 3 letters
151
+ # at least
152
+ if token.startswith('\u0648') and len(token) > 3:
153
+ token = token[1:]
154
+ return token
155
+
156
+ def pref(self, token):
157
+ """
158
+ remove prefixes from the words' beginning.
159
+ """
160
+ if len(token) > 5:
161
+ for p3 in self.pr3:
162
+ if token.startswith(p3):
163
+ return token[3:]
164
+ if len(token) > 6:
165
+ for p4 in self.pr4:
166
+ if token.startswith(p4):
167
+ return token[4:]
168
+ if len(token) > 5:
169
+ for p3 in self.pr32:
170
+ if token.startswith(p3):
171
+ return token[3:]
172
+ if len(token) > 4:
173
+ for p2 in self.pr2:
174
+ if token.startswith(p2):
175
+ return token[2:]
176
+
177
+ def suff(self, token):
178
+ """
179
+ remove suffixes from the word's end.
180
+ """
181
+ if token.endswith('\u0643') and len(token) > 3:
182
+ return token[:-1]
183
+ if len(token) > 4:
184
+ for s2 in self.su2:
185
+ if token.endswith(s2):
186
+ return token[:-2]
187
+ if len(token) > 5:
188
+ for s3 in self.su3:
189
+ if token.endswith(s3):
190
+ return token[:-3]
191
+ if token.endswith('\u0647') and len(token) > 3:
192
+ token = token[:-1]
193
+ return token
194
+ if len(token) > 4:
195
+ for s2 in self.su22:
196
+ if token.endswith(s2):
197
+ return token[:-2]
198
+ if len(token) > 5:
199
+ for s3 in self.su32:
200
+ if token.endswith(s3):
201
+ return token[:-3]
202
+ if token.endswith('\u0646\u0627') and len(token) > 4:
203
+ return token[:-2]
204
+ return token
205
+
206
+ def fem2masc(self, token):
207
+ """
208
+ transform the word from the feminine form to the masculine form.
209
+ """
210
+ if token.endswith('\u0629') and len(token) > 3:
211
+ return token[:-1]
212
+
213
+ def plur2sing(self, token):
214
+ """
215
+ transform the word from the plural form to the singular form.
216
+ """
217
+ if len(token) > 4:
218
+ for ps2 in self.pl_si2:
219
+ if token.endswith(ps2):
220
+ return token[:-2]
221
+ if len(token) > 5:
222
+ for ps3 in self.pl_si3:
223
+ if token.endswith(ps3):
224
+ return token[:-3]
225
+ if len(token) > 3 and token.endswith('\u0627\u062A'):
226
+ return token[:-2]
227
+ if (len(token) > 3 and token.startswith('\u0627')
228
+ and token[2] == '\u0627'):
229
+ return token[:2] + token[3:]
230
+ if (len(token) > 4 and token.startswith('\u0627')
231
+ and token[-2] == '\u0627'):
232
+ return token[1:-2] + token[-1]
233
+
234
+ def verb(self, token):
235
+ """
236
+ stem the verb prefixes and suffixes or both
237
+ """
238
+ vb = self.verb_t1(token)
239
+ if vb is not None:
240
+ return vb
241
+ vb = self.verb_t2(token)
242
+ if vb is not None:
243
+ return vb
244
+ vb = self.verb_t3(token)
245
+ if vb is not None:
246
+ return vb
247
+ vb = self.verb_t4(token)
248
+ if vb is not None:
249
+ return vb
250
+ vb = self.verb_t5(token)
251
+ if vb is not None:
252
+ return vb
253
+ return self.verb_t6(token)
254
+
255
+ def verb_t1(self, token):
256
+ """
257
+ stem the present prefixes and suffixes
258
+ """
259
+ if len(token) > 5 and token.startswith('\u062A'): # Taa
260
+ for s2 in self.pl_si2:
261
+ if token.endswith(s2):
262
+ return token[1:-2]
263
+ if len(token) > 5 and token.startswith('\u064A'): # Yaa
264
+ for s2 in self.verb_su2:
265
+ if token.endswith(s2):
266
+ return token[1:-2]
267
+ if len(token) > 4 and token.startswith('\u0627'): # Alif
268
+ # Waaw Alif
269
+ if len(token) > 5 and token.endswith('\u0648\u0627'):
270
+ return token[1:-2]
271
+ # Yaa
272
+ if token.endswith('\u064A'):
273
+ return token[1:-1]
274
+ # Alif
275
+ if token.endswith('\u0627'):
276
+ return token[1:-1]
277
+ # Noon
278
+ if token.endswith('\u0646'):
279
+ return token[1:-1]
280
+ # ^Yaa, Noon$
281
+ if (len(token) > 4
282
+ and token.startswith('\u064A')
283
+ and token.endswith('\u0646')):
284
+ return token[1:-1]
285
+ # ^Taa, Noon$
286
+ if (len(token) > 4
287
+ and token.startswith('\u062A')
288
+ and token.endswith('\u0646')):
289
+ return token[1:-1]
290
+
291
+ def verb_t2(self, token):
292
+ """
293
+ stem the future prefixes and suffixes
294
+ """
295
+ if len(token) > 6:
296
+ for s2 in self.pl_si2:
297
+ # ^Siin Taa
298
+ if (token.startswith(self.verb_pr2[0])
299
+ and token.endswith(s2)):
300
+ return token[2:-2]
301
+ # ^Siin Yaa, Alif Noon$
302
+ if (token.startswith(self.verb_pr2[1])
303
+ and token.endswith(self.pl_si2[0])):
304
+ return token[2:-2]
305
+ # ^Siin Yaa, Waaw Noon$
306
+ if (token.startswith(self.verb_pr2[1])
307
+ and token.endswith(self.pl_si2[2])):
308
+ return token[2:-2]
309
+ # ^Siin Taa, Noon$
310
+ if (len(token) > 5
311
+ and token.startswith(self.verb_pr2[0])
312
+ and token.endswith('\u0646')):
313
+ return token[2:-1]
314
+ # ^Siin Yaa, Noon$
315
+ if (len(token) > 5
316
+ and token.startswith(self.verb_pr2[1])
317
+ and token.endswith('\u0646')):
318
+ return token[2:-1]
319
+
320
+ def verb_t3(self, token):
321
+ """
322
+ stem the present suffixes
323
+ """
324
+ if len(token) > 5:
325
+ for su3 in self.verb_suf3:
326
+ if(token.endswith(su3)):
327
+ return token[:-3]
328
+ if len(token) > 4:
329
+ for su2 in self.verb_suf2:
330
+ if token.endswith(su2):
331
+ return token[:-2]
332
+ if len(token) > 3:
333
+ for su1 in self.verb_suf1:
334
+ if token.endswith(su1):
335
+ return token[:-1]
336
+
337
+ def verb_t4(self, token):
338
+ """
339
+ stem the present prefixes
340
+ """
341
+ if len(token) > 3:
342
+ for pr1 in self.verb_suf1:
343
+ if token.startswith(pr1):
344
+ return token[1:]
345
+ if token.startswith('\u064A'):
346
+ return token[1:]
347
+
348
+ def verb_t5(self, token):
349
+ """
350
+ stem the future prefixes
351
+ """
352
+ if len(token) > 4:
353
+ for pr2 in self.verb_pr22:
354
+ if token.startswith(pr2):
355
+ return token[2:]
356
+ for pr2 in self.verb_pr2:
357
+ if token.startswith(pr2):
358
+ return token[2:]
359
+ return token
360
+
361
+ def verb_t6(self, token):
362
+ """
363
+ stem the order prefixes
364
+ """
365
+ if len(token) > 4:
366
+ for pr3 in self.verb_pr33:
367
+ if token.startswith(pr3):
368
+ return token[2:]
369
+ return token
@@ -2,7 +2,7 @@
2
2
  #
3
3
  # Natural Language Toolkit: The ISRI Arabic Stemmer
4
4
  #
5
- # Copyright (C) 2001-2016 NLTK Proejct
5
+ # Copyright (C) 2001-2018 NLTK Proejct
6
6
  # Algorithm: Kazem Taghva, Rania Elkhoury, and Jeffrey Coombs (2005)
7
7
  # Author: Hosam Algasaier <hosam_hme@yahoo.com>
8
8
  # URL: <http://nltk.org/>
@@ -1,12 +1,12 @@
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: Steven Tomcavage <stomcava@law.upenn.edu>
5
5
  # URL: <http://nltk.org/>
6
6
  # For license information, see LICENSE.TXT
7
7
 
8
8
  """
9
- A word stemmer based on the Lancaster stemming algorithm.
9
+ A word stemmer based on the Lancaster (Paice/Husk) stemming algorithm.
10
10
  Paice, Chris D. "Another Stemmer." ACM SIGIR Forum 24.3 (1990): 56-61.
11
11
  """
12
12
  from __future__ import unicode_literals
@@ -44,10 +44,16 @@ class LancasterStemmer(StemmerI):
44
44
  'meant'
45
45
  >>> st.stem('cement') # ditto
46
46
  'cem'
47
+ >>> st_pre = LancasterStemmer(strip_prefix_flag=True)
48
+ >>> st_pre.stem('kilometer') # Test Prefix
49
+ 'met'
50
+ >>> st_custom = LancasterStemmer(rule_tuple=("ssen4>", "s1t."))
51
+ >>> st_custom.stem("ness") # Change s to t
52
+ 'nest'
47
53
  """
48
54
 
49
55
  # The rule list is static since it doesn't change between instances
50
- rule_tuple = (
56
+ default_rule_tuple = (
51
57
  "ai*2.", # -ia > - if intact
52
58
  "a*1.", # -a > - if intact
53
59
  "bb1.", # -bb > -b
@@ -165,23 +171,33 @@ class LancasterStemmer(StemmerI):
165
171
  "zy1s." # -yz > -ys
166
172
  )
167
173
 
168
-
169
- def __init__(self):
174
+ def __init__(self, rule_tuple=None, strip_prefix_flag=False):
170
175
  """Create an instance of the Lancaster stemmer.
171
176
  """
172
177
  # Setup an empty rule dictionary - this will be filled in later
173
178
  self.rule_dictionary = {}
179
+ # Check if a user wants to strip prefix
180
+ self._strip_prefix = strip_prefix_flag
181
+ # Check if a user wants to use his/her own rule tuples.
182
+ self._rule_tuple = rule_tuple if rule_tuple else self.default_rule_tuple
174
183
 
175
- def parseRules(self, rule_tuple):
184
+ def parseRules(self, rule_tuple=None):
176
185
  """Validate the set of rules used in this stemmer.
186
+
187
+ If this function is called as an individual method, without using stem
188
+ method, rule_tuple argument will be compiled into self.rule_dictionary.
189
+ If this function is called within stem, self._rule_tuple will be used.
190
+
177
191
  """
192
+ # If there is no argument for the function, use class' own rule tuple.
193
+ rule_tuple = rule_tuple if rule_tuple else self._rule_tuple
178
194
  valid_rule = re.compile("^[a-z]+\*?\d[a-z]*[>\.]?$")
179
195
  # Empty any old rules from the rule set before adding new ones
180
196
  self.rule_dictionary = {}
181
197
 
182
198
  for rule in rule_tuple:
183
199
  if not valid_rule.match(rule):
184
- raise ValueError("The rule %s is invalid" % rule)
200
+ raise ValueError("The rule {0} is invalid".format(rule))
185
201
  first_letter = rule[0:1]
186
202
  if first_letter in self.rule_dictionary:
187
203
  self.rule_dictionary[first_letter].append(rule)
@@ -193,13 +209,14 @@ class LancasterStemmer(StemmerI):
193
209
  """
194
210
  # Lower-case the word, since all the rules are lower-cased
195
211
  word = word.lower()
212
+ word = self.__stripPrefix(word) if self._strip_prefix else word
196
213
 
197
214
  # Save a copy of the original word
198
215
  intact_word = word
199
216
 
200
- # If the user hasn't supplied any rules, setup the default rules
201
- if len(self.rule_dictionary) == 0:
202
- self.parseRules(LancasterStemmer.rule_tuple)
217
+ # If rule dictionary is empty, parse rule tuple.
218
+ if not self.rule_dictionary:
219
+ self.parseRules()
203
220
 
204
221
  return self.__doStemming(word, intact_word)
205
222
 
@@ -304,7 +321,17 @@ class LancasterStemmer(StemmerI):
304
321
  word += append_string
305
322
  return word
306
323
 
307
- def __repr__(self):
308
- return '<LancasterStemmer>'
324
+ def __stripPrefix(self, word):
325
+ """Remove prefix from a word.
309
326
 
327
+ This function originally taken from Whoosh.
310
328
 
329
+ """
330
+ for prefix in ("kilo", "micro", "milli", "intra", "ultra", "mega",
331
+ "nano", "pico", "pseudo"):
332
+ if word.startswith(prefix):
333
+ return word[len(prefix):]
334
+ return word
335
+
336
+ def __repr__(self):
337
+ return '<LancasterStemmer>'