nltk 3.2__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 (406) hide show
  1. {nltk-3.2 → nltk-3.3}/INSTALL.txt +6 -6
  2. {nltk-3.2 → nltk-3.3}/LICENSE.txt +13 -13
  3. {nltk-3.2 → nltk-3.3}/MANIFEST.in +6 -6
  4. {nltk-3.2/nltk.egg-info → nltk-3.3}/PKG-INFO +13 -5
  5. nltk-3.2/README.txt → nltk-3.3/README.md +49 -48
  6. nltk-3.3/nltk/VERSION +1 -0
  7. {nltk-3.2 → nltk-3.3}/nltk/__init__.py +185 -185
  8. {nltk-3.2 → nltk-3.3}/nltk/app/__init__.py +52 -53
  9. {nltk-3.2 → nltk-3.3}/nltk/app/chartparser_app.py +2276 -2276
  10. {nltk-3.2 → nltk-3.3}/nltk/app/chunkparser_app.py +1262 -1264
  11. {nltk-3.2 → nltk-3.3}/nltk/app/collocations_app.py +347 -350
  12. {nltk-3.2 → nltk-3.3}/nltk/app/concordance_app.py +568 -570
  13. {nltk-3.2 → nltk-3.3}/nltk/app/nemo_app.py +156 -155
  14. {nltk-3.2 → nltk-3.3}/nltk/app/rdparser_app.py +892 -894
  15. {nltk-3.2 → nltk-3.3}/nltk/app/srparser_app.py +809 -809
  16. {nltk-3.2 → nltk-3.3}/nltk/app/wordfreq_app.py +32 -32
  17. {nltk-3.2 → nltk-3.3}/nltk/app/wordnet_app.py +968 -968
  18. {nltk-3.2 → nltk-3.3}/nltk/book.py +91 -90
  19. {nltk-3.2 → nltk-3.3}/nltk/ccg/__init__.py +22 -22
  20. {nltk-3.2 → nltk-3.3}/nltk/ccg/api.py +359 -335
  21. {nltk-3.2 → nltk-3.3}/nltk/ccg/chart.py +394 -361
  22. {nltk-3.2 → nltk-3.3}/nltk/ccg/combinator.py +343 -312
  23. {nltk-3.2 → nltk-3.3}/nltk/ccg/lexicon.py +328 -290
  24. nltk-3.3/nltk/ccg/logic.py +46 -0
  25. {nltk-3.2 → nltk-3.3}/nltk/chat/__init__.py +49 -49
  26. {nltk-3.2 → nltk-3.3}/nltk/chat/eliza.py +244 -244
  27. {nltk-3.2 → nltk-3.3}/nltk/chat/iesha.py +140 -140
  28. {nltk-3.2 → nltk-3.3}/nltk/chat/rude.py +92 -92
  29. {nltk-3.2 → nltk-3.3}/nltk/chat/suntsu.py +117 -117
  30. {nltk-3.2 → nltk-3.3}/nltk/chat/util.py +122 -120
  31. {nltk-3.2 → nltk-3.3}/nltk/chat/zen.py +282 -282
  32. {nltk-3.2 → nltk-3.3}/nltk/chunk/__init__.py +190 -190
  33. {nltk-3.2 → nltk-3.3}/nltk/chunk/api.py +51 -51
  34. {nltk-3.2 → nltk-3.3}/nltk/chunk/named_entity.py +331 -331
  35. {nltk-3.2 → nltk-3.3}/nltk/chunk/regexp.py +1390 -1384
  36. {nltk-3.2 → nltk-3.3}/nltk/chunk/util.py +600 -600
  37. {nltk-3.2 → nltk-3.3}/nltk/classify/__init__.py +98 -98
  38. {nltk-3.2 → nltk-3.3}/nltk/classify/api.py +193 -193
  39. {nltk-3.2 → nltk-3.3}/nltk/classify/decisiontree.py +295 -295
  40. {nltk-3.2 → nltk-3.3}/nltk/classify/maxent.py +1510 -1492
  41. {nltk-3.2 → nltk-3.3}/nltk/classify/megam.py +179 -178
  42. {nltk-3.2 → nltk-3.3}/nltk/classify/naivebayes.py +245 -242
  43. {nltk-3.2 → nltk-3.3}/nltk/classify/positivenaivebayes.py +170 -170
  44. {nltk-3.2 → nltk-3.3}/nltk/classify/rte_classify.py +160 -191
  45. {nltk-3.2 → nltk-3.3}/nltk/classify/scikitlearn.py +153 -151
  46. {nltk-3.2 → nltk-3.3}/nltk/classify/senna.py +183 -181
  47. {nltk-3.2 → nltk-3.3}/nltk/classify/svm.py +15 -15
  48. {nltk-3.2 → nltk-3.3}/nltk/classify/tadm.py +113 -112
  49. {nltk-3.2 → nltk-3.3}/nltk/classify/textcat.py +193 -193
  50. {nltk-3.2 → nltk-3.3}/nltk/classify/util.py +324 -312
  51. {nltk-3.2 → nltk-3.3}/nltk/classify/weka.py +346 -345
  52. {nltk-3.2 → nltk-3.3}/nltk/cluster/__init__.py +86 -86
  53. {nltk-3.2 → nltk-3.3}/nltk/cluster/api.py +74 -70
  54. {nltk-3.2 → nltk-3.3}/nltk/cluster/em.py +247 -247
  55. {nltk-3.2 → nltk-3.3}/nltk/cluster/gaac.py +168 -168
  56. {nltk-3.2 → nltk-3.3}/nltk/cluster/kmeans.py +221 -221
  57. {nltk-3.2 → nltk-3.3}/nltk/cluster/util.py +304 -289
  58. nltk-3.3/nltk/collections.py +640 -0
  59. {nltk-3.2 → nltk-3.3}/nltk/collocations.py +388 -388
  60. nltk-3.3/nltk/compat.py +365 -0
  61. {nltk-3.2 → nltk-3.3}/nltk/corpus/__init__.py +341 -320
  62. {nltk-3.2 → nltk-3.3}/nltk/corpus/europarl_raw.py +44 -44
  63. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/__init__.py +147 -145
  64. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/aligned.py +115 -114
  65. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/api.py +448 -446
  66. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/bnc.py +252 -252
  67. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/bracket_parse.py +227 -227
  68. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/categorized_sents.py +179 -178
  69. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/chasen.py +140 -139
  70. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/childes.py +522 -494
  71. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/chunked.py +212 -212
  72. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/cmudict.py +97 -95
  73. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/comparative_sents.py +280 -278
  74. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/conll.py +528 -521
  75. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/crubadan.py +116 -116
  76. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/dependency.py +101 -101
  77. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/framenet.py +3059 -2093
  78. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/ieer.py +112 -111
  79. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/indian.py +85 -86
  80. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/ipipan.py +332 -331
  81. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/knbc.py +187 -187
  82. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/lin.py +156 -156
  83. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/mte.py +311 -310
  84. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/nkjp.py +429 -428
  85. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/nombank.py +421 -421
  86. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/nps_chat.py +73 -73
  87. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/opinion_lexicon.py +115 -115
  88. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/panlex_lite.py +165 -165
  89. nltk-3.3/nltk/corpus/reader/pl196x.py +292 -0
  90. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/plaintext.py +232 -233
  91. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/ppattach.py +96 -95
  92. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/propbank.py +479 -481
  93. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/pros_cons.py +128 -126
  94. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/reviews.py +330 -328
  95. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/rte.py +144 -146
  96. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/semcor.py +256 -256
  97. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/senseval.py +203 -201
  98. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/sentiwordnet.py +137 -137
  99. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/sinica_treebank.py +75 -75
  100. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/string_category.py +60 -59
  101. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/switchboard.py +119 -119
  102. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/tagged.py +295 -294
  103. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/timit.py +452 -450
  104. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/toolbox.py +68 -68
  105. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/twitter.py +155 -157
  106. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/udhr.py +80 -80
  107. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/util.py +804 -800
  108. nltk-3.3/nltk/corpus/reader/verbnet.py +595 -0
  109. nltk-3.3/nltk/corpus/reader/wordlist.py +134 -0
  110. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/wordnet.py +2108 -2036
  111. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/xmldocs.py +392 -387
  112. {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/ycoe.py +243 -242
  113. {nltk-3.2 → nltk-3.3}/nltk/corpus/util.py +144 -127
  114. {nltk-3.2 → nltk-3.3}/nltk/data.py +1487 -1451
  115. {nltk-3.2 → nltk-3.3}/nltk/decorators.py +219 -215
  116. {nltk-3.2 → nltk-3.3}/nltk/downloader.py +2278 -2274
  117. {nltk-3.2 → nltk-3.3}/nltk/draw/__init__.py +27 -27
  118. {nltk-3.2 → nltk-3.3}/nltk/draw/cfg.py +774 -777
  119. {nltk-3.2 → nltk-3.3}/nltk/draw/dispersion.py +58 -58
  120. {nltk-3.2 → nltk-3.3}/nltk/draw/table.py +1098 -1098
  121. {nltk-3.2 → nltk-3.3}/nltk/draw/tree.py +963 -966
  122. {nltk-3.2 → nltk-3.3}/nltk/draw/util.py +2356 -2356
  123. {nltk-3.2 → nltk-3.3}/nltk/featstruct.py +2617 -2500
  124. {nltk-3.2 → nltk-3.3}/nltk/grammar.py +1559 -1516
  125. {nltk-3.2 → nltk-3.3}/nltk/help.py +56 -56
  126. {nltk-3.2 → nltk-3.3}/nltk/inference/__init__.py +20 -20
  127. {nltk-3.2 → nltk-3.3}/nltk/inference/api.py +597 -589
  128. {nltk-3.2 → nltk-3.3}/nltk/inference/discourse.py +612 -608
  129. {nltk-3.2 → nltk-3.3}/nltk/inference/mace.py +311 -311
  130. {nltk-3.2 → nltk-3.3}/nltk/inference/nonmonotonic.py +509 -509
  131. {nltk-3.2 → nltk-3.3}/nltk/inference/prover9.py +431 -431
  132. {nltk-3.2 → nltk-3.3}/nltk/inference/resolution.py +687 -687
  133. {nltk-3.2 → nltk-3.3}/nltk/inference/tableau.py +607 -607
  134. {nltk-3.2 → nltk-3.3}/nltk/internals.py +982 -982
  135. {nltk-3.2 → nltk-3.3}/nltk/jsontags.py +63 -63
  136. {nltk-3.2 → nltk-3.3}/nltk/lazyimport.py +142 -142
  137. {nltk-3.2 → nltk-3.3}/nltk/metrics/__init__.py +30 -29
  138. {nltk-3.2 → nltk-3.3}/nltk/metrics/agreement.py +421 -401
  139. nltk-3.3/nltk/metrics/aline.py +607 -0
  140. {nltk-3.2 → nltk-3.3}/nltk/metrics/association.py +414 -410
  141. {nltk-3.2 → nltk-3.3}/nltk/metrics/confusionmatrix.py +206 -206
  142. {nltk-3.2 → nltk-3.3}/nltk/metrics/distance.py +207 -202
  143. {nltk-3.2 → nltk-3.3}/nltk/metrics/paice.py +381 -381
  144. {nltk-3.2 → nltk-3.3}/nltk/metrics/scores.py +228 -228
  145. {nltk-3.2 → nltk-3.3}/nltk/metrics/segmentation.py +231 -232
  146. {nltk-3.2 → nltk-3.3}/nltk/metrics/spearman.py +69 -69
  147. {nltk-3.2 → nltk-3.3}/nltk/misc/__init__.py +11 -11
  148. {nltk-3.2 → nltk-3.3}/nltk/misc/babelfish.py +10 -10
  149. {nltk-3.2 → nltk-3.3}/nltk/misc/chomsky.py +135 -133
  150. {nltk-3.2 → nltk-3.3}/nltk/misc/minimalset.py +83 -83
  151. {nltk-3.2 → nltk-3.3}/nltk/misc/sort.py +157 -157
  152. {nltk-3.2 → nltk-3.3}/nltk/misc/wordfinder.py +129 -129
  153. {nltk-3.2 → nltk-3.3}/nltk/parse/__init__.py +81 -80
  154. {nltk-3.2 → nltk-3.3}/nltk/parse/api.py +66 -66
  155. {nltk-3.2 → nltk-3.3}/nltk/parse/bllip.py +282 -282
  156. {nltk-3.2 → nltk-3.3}/nltk/parse/chart.py +1682 -1681
  157. nltk-3.3/nltk/parse/corenlp.py +780 -0
  158. {nltk-3.2 → nltk-3.3}/nltk/parse/dependencygraph.py +760 -758
  159. {nltk-3.2 → nltk-3.3}/nltk/parse/earleychart.py +452 -451
  160. {nltk-3.2 → nltk-3.3}/nltk/parse/evaluate.py +129 -129
  161. {nltk-3.2 → nltk-3.3}/nltk/parse/featurechart.py +580 -578
  162. {nltk-3.2 → nltk-3.3}/nltk/parse/generate.py +87 -76
  163. {nltk-3.2 → nltk-3.3}/nltk/parse/malt.py +356 -356
  164. {nltk-3.2 → nltk-3.3}/nltk/parse/nonprojectivedependencyparser.py +783 -783
  165. {nltk-3.2 → nltk-3.3}/nltk/parse/pchart.py +522 -522
  166. {nltk-3.2 → nltk-3.3}/nltk/parse/projectivedependencyparser.py +579 -578
  167. {nltk-3.2 → nltk-3.3}/nltk/parse/recursivedescent.py +655 -656
  168. {nltk-3.2 → nltk-3.3}/nltk/parse/shiftreduce.py +458 -459
  169. {nltk-3.2 → nltk-3.3}/nltk/parse/stanford.py +431 -406
  170. {nltk-3.2 → nltk-3.3}/nltk/parse/transitionparser.py +774 -772
  171. {nltk-3.2 → nltk-3.3}/nltk/parse/util.py +231 -231
  172. {nltk-3.2 → nltk-3.3}/nltk/parse/viterbi.py +401 -401
  173. {nltk-3.2 → nltk-3.3}/nltk/probability.py +2410 -2355
  174. {nltk-3.2 → nltk-3.3}/nltk/sem/__init__.py +61 -61
  175. {nltk-3.2 → nltk-3.3}/nltk/sem/boxer.py +1261 -1261
  176. {nltk-3.2 → nltk-3.3}/nltk/sem/chat80.py +782 -782
  177. {nltk-3.2 → nltk-3.3}/nltk/sem/cooper_storage.py +118 -118
  178. {nltk-3.2 → nltk-3.3}/nltk/sem/drt.py +1258 -1257
  179. {nltk-3.2 → nltk-3.3}/nltk/sem/drt_glue_demo.py +485 -489
  180. {nltk-3.2 → nltk-3.3}/nltk/sem/evaluate.py +790 -784
  181. {nltk-3.2 → nltk-3.3}/nltk/sem/glue.py +696 -694
  182. {nltk-3.2 → nltk-3.3}/nltk/sem/hole.py +386 -384
  183. {nltk-3.2 → nltk-3.3}/nltk/sem/lfg.py +210 -208
  184. {nltk-3.2 → nltk-3.3}/nltk/sem/linearlogic.py +451 -449
  185. {nltk-3.2 → nltk-3.3}/nltk/sem/logic.py +1910 -1910
  186. {nltk-3.2 → nltk-3.3}/nltk/sem/relextract.py +476 -483
  187. {nltk-3.2 → nltk-3.3}/nltk/sem/skolemize.py +101 -101
  188. {nltk-3.2 → nltk-3.3}/nltk/sem/util.py +249 -249
  189. {nltk-3.2 → nltk-3.3}/nltk/sentiment/__init__.py +14 -14
  190. {nltk-3.2 → nltk-3.3}/nltk/sentiment/sentiment_analyzer.py +229 -229
  191. {nltk-3.2 → nltk-3.3}/nltk/sentiment/util.py +762 -752
  192. {nltk-3.2 → nltk-3.3}/nltk/sentiment/vader.py +443 -445
  193. {nltk-3.2 → nltk-3.3}/nltk/stem/__init__.py +31 -33
  194. {nltk-3.2 → nltk-3.3}/nltk/stem/api.py +28 -25
  195. nltk-3.3/nltk/stem/arlstem.py +369 -0
  196. {nltk-3.2 → nltk-3.3}/nltk/stem/isri.py +345 -345
  197. {nltk-3.2 → nltk-3.3}/nltk/stem/lancaster.py +337 -310
  198. nltk-3.3/nltk/stem/porter.py +710 -0
  199. {nltk-3.2 → nltk-3.3}/nltk/stem/regexp.py +61 -61
  200. {nltk-3.2 → nltk-3.3}/nltk/stem/rslp.py +142 -142
  201. {nltk-3.2 → nltk-3.3}/nltk/stem/snowball.py +4236 -3712
  202. {nltk-3.2 → nltk-3.3}/nltk/stem/util.py +22 -12
  203. {nltk-3.2 → nltk-3.3}/nltk/stem/wordnet.py +51 -51
  204. {nltk-3.2 → nltk-3.3}/nltk/tag/__init__.py +152 -127
  205. {nltk-3.2 → nltk-3.3}/nltk/tag/api.py +86 -81
  206. {nltk-3.2 → nltk-3.3}/nltk/tag/brill.py +424 -426
  207. {nltk-3.2 → nltk-3.3}/nltk/tag/brill_trainer.py +608 -608
  208. {nltk-3.2 → nltk-3.3}/nltk/tag/crf.py +204 -200
  209. {nltk-3.2 → nltk-3.3}/nltk/tag/hmm.py +1277 -1277
  210. {nltk-3.2 → nltk-3.3}/nltk/tag/hunpos.py +132 -132
  211. {nltk-3.2 → nltk-3.3}/nltk/tag/mapping.py +101 -101
  212. {nltk-3.2 → nltk-3.3}/nltk/tag/perceptron.py +329 -314
  213. {nltk-3.2 → nltk-3.3}/nltk/tag/senna.py +147 -145
  214. {nltk-3.2 → nltk-3.3}/nltk/tag/sequential.py +740 -736
  215. {nltk-3.2 → nltk-3.3}/nltk/tag/stanford.py +219 -196
  216. {nltk-3.2 → nltk-3.3}/nltk/tag/tnt.py +595 -604
  217. {nltk-3.2 → nltk-3.3}/nltk/tag/util.py +72 -72
  218. {nltk-3.2 → nltk-3.3}/nltk/tbl/__init__.py +28 -28
  219. {nltk-3.2 → nltk-3.3}/nltk/tbl/api.py +1 -1
  220. {nltk-3.2 → nltk-3.3}/nltk/tbl/demo.py +366 -366
  221. {nltk-3.2 → nltk-3.3}/nltk/tbl/erroranalysis.py +39 -39
  222. {nltk-3.2 → nltk-3.3}/nltk/tbl/feature.py +259 -261
  223. {nltk-3.2 → nltk-3.3}/nltk/tbl/rule.py +321 -321
  224. {nltk-3.2 → nltk-3.3}/nltk/tbl/template.py +303 -308
  225. {nltk-3.2 → nltk-3.3}/nltk/test/__init__.py +18 -18
  226. {nltk-3.2 → nltk-3.3}/nltk/test/all.py +24 -23
  227. {nltk-3.2 → nltk-3.3}/nltk/test/bleu.doctest +14 -14
  228. {nltk-3.2 → nltk-3.3}/nltk/test/bnc.doctest +60 -60
  229. {nltk-3.2 → nltk-3.3}/nltk/test/ccg.doctest +376 -395
  230. nltk-3.3/nltk/test/ccg_semantics.doctest +553 -0
  231. {nltk-3.2 → nltk-3.3}/nltk/test/chat80.doctest +234 -234
  232. {nltk-3.2 → nltk-3.3}/nltk/test/childes.doctest +184 -184
  233. {nltk-3.2 → nltk-3.3}/nltk/test/childes_fixt.py +14 -13
  234. {nltk-3.2 → nltk-3.3}/nltk/test/chunk.doctest +373 -373
  235. {nltk-3.2 → nltk-3.3}/nltk/test/classify.doctest +185 -185
  236. {nltk-3.2 → nltk-3.3}/nltk/test/classify_fixt.py +11 -10
  237. nltk-3.3/nltk/test/collections.doctest +20 -0
  238. {nltk-3.2 → nltk-3.3}/nltk/test/collocations.doctest +276 -276
  239. {nltk-3.2 → nltk-3.3}/nltk/test/compat.doctest +134 -138
  240. {nltk-3.2 → nltk-3.3}/nltk/test/compat_fixt.py +9 -8
  241. nltk-3.3/nltk/test/concordance.doctest +55 -0
  242. {nltk-3.2 → nltk-3.3}/nltk/test/corpus.doctest +2200 -2212
  243. {nltk-3.2 → nltk-3.3}/nltk/test/corpus_fixt.py +3 -3
  244. {nltk-3.2 → nltk-3.3}/nltk/test/crubadan.doctest +65 -65
  245. {nltk-3.2 → nltk-3.3}/nltk/test/data.doctest +379 -379
  246. {nltk-3.2 → nltk-3.3}/nltk/test/dependency.doctest +241 -241
  247. {nltk-3.2 → nltk-3.3}/nltk/test/discourse.doctest +546 -546
  248. {nltk-3.2 → nltk-3.3}/nltk/test/discourse_fixt.py +14 -13
  249. {nltk-3.2 → nltk-3.3}/nltk/test/doctest_nose_plugin.py +159 -156
  250. {nltk-3.2 → nltk-3.3}/nltk/test/drt.doctest +517 -517
  251. {nltk-3.2 → nltk-3.3}/nltk/test/featgram.doctest +607 -607
  252. {nltk-3.2 → nltk-3.3}/nltk/test/featstruct.doctest +1229 -1230
  253. {nltk-3.2 → nltk-3.3}/nltk/test/framenet.doctest +288 -239
  254. {nltk-3.2 → nltk-3.3}/nltk/test/generate.doctest +67 -67
  255. {nltk-3.2 → nltk-3.3}/nltk/test/gensim.doctest +140 -141
  256. {nltk-3.2 → nltk-3.3}/nltk/test/gensim_fixt.py +10 -9
  257. {nltk-3.2 → nltk-3.3}/nltk/test/gluesemantics.doctest +384 -386
  258. {nltk-3.2 → nltk-3.3}/nltk/test/gluesemantics_malt.doctest +68 -68
  259. {nltk-3.2 → nltk-3.3}/nltk/test/gluesemantics_malt_fixt.py +12 -11
  260. {nltk-3.2 → nltk-3.3}/nltk/test/grammar.doctest +48 -48
  261. {nltk-3.2 → nltk-3.3}/nltk/test/grammartestsuites.doctest +109 -109
  262. {nltk-3.2 → nltk-3.3}/nltk/test/index.doctest +100 -100
  263. {nltk-3.2 → nltk-3.3}/nltk/test/inference.doctest +534 -534
  264. {nltk-3.2 → nltk-3.3}/nltk/test/inference_fixt.py +12 -11
  265. {nltk-3.2 → nltk-3.3}/nltk/test/internals.doctest +140 -140
  266. {nltk-3.2 → nltk-3.3}/nltk/test/japanese.doctest +48 -48
  267. {nltk-3.2 → nltk-3.3}/nltk/test/logic.doctest +1098 -1098
  268. {nltk-3.2 → nltk-3.3}/nltk/test/metrics.doctest +270 -270
  269. {nltk-3.2 → nltk-3.3}/nltk/test/misc.doctest +118 -118
  270. {nltk-3.2 → nltk-3.3}/nltk/test/nonmonotonic.doctest +286 -286
  271. {nltk-3.2 → nltk-3.3}/nltk/test/nonmonotonic_fixt.py +12 -11
  272. {nltk-3.2 → nltk-3.3}/nltk/test/paice.doctest +35 -35
  273. {nltk-3.2 → nltk-3.3}/nltk/test/parse.doctest +884 -884
  274. {nltk-3.2 → nltk-3.3}/nltk/test/portuguese_en.doctest +565 -565
  275. {nltk-3.2 → nltk-3.3}/nltk/test/portuguese_en_fixt.py +16 -16
  276. {nltk-3.2 → nltk-3.3}/nltk/test/probability.doctest +304 -304
  277. {nltk-3.2 → nltk-3.3}/nltk/test/probability_fixt.py +13 -12
  278. {nltk-3.2 → nltk-3.3}/nltk/test/propbank.doctest +176 -176
  279. {nltk-3.2 → nltk-3.3}/nltk/test/relextract.doctest +263 -263
  280. {nltk-3.2 → nltk-3.3}/nltk/test/resolution.doctest +221 -221
  281. {nltk-3.2 → nltk-3.3}/nltk/test/runtests.py +86 -64
  282. {nltk-3.2 → nltk-3.3}/nltk/test/segmentation_fixt.py +10 -10
  283. {nltk-3.2 → nltk-3.3}/nltk/test/semantics.doctest +665 -665
  284. {nltk-3.2 → nltk-3.3}/nltk/test/semantics_fixt.py +7 -7
  285. {nltk-3.2 → nltk-3.3}/nltk/test/sentiment.doctest +233 -233
  286. {nltk-3.2 → nltk-3.3}/nltk/test/sentiwordnet.doctest +41 -41
  287. {nltk-3.2 → nltk-3.3}/nltk/test/simple.doctest +85 -85
  288. {nltk-3.2 → nltk-3.3}/nltk/test/stem.doctest +78 -78
  289. {nltk-3.2 → nltk-3.3}/nltk/test/tag.doctest +33 -33
  290. {nltk-3.2 → nltk-3.3}/nltk/test/tokenize.doctest +273 -166
  291. {nltk-3.2 → nltk-3.3}/nltk/test/toolbox.doctest +307 -307
  292. {nltk-3.2 → nltk-3.3}/nltk/test/translate.doctest +242 -242
  293. {nltk-3.2 → nltk-3.3}/nltk/test/translate_fixt.py +3 -3
  294. {nltk-3.2 → nltk-3.3}/nltk/test/tree.doctest +1101 -1101
  295. {nltk-3.2 → nltk-3.3}/nltk/test/treeprettyprinter.doctest +127 -127
  296. {nltk-3.2 → nltk-3.3}/nltk/test/treetransforms.doctest +156 -156
  297. nltk-3.3/nltk/test/unit/test_2x_compat.py +63 -0
  298. nltk-3.3/nltk/test/unit/test_aline.py +52 -0
  299. nltk-3.3/nltk/test/unit/test_chunk.py +56 -0
  300. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_classify.py +55 -53
  301. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_collocations.py +88 -79
  302. nltk-3.3/nltk/test/unit/test_concordance.py +98 -0
  303. nltk-3.3/nltk/test/unit/test_corenlp.py +1000 -0
  304. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_corpora.py +200 -183
  305. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_corpus_views.py +45 -45
  306. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_hmm.py +88 -88
  307. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_json2csv_corpus.py +188 -187
  308. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_naivebayes.py +26 -26
  309. nltk-3.3/nltk/test/unit/test_rte_classify.py +86 -0
  310. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_seekable_unicode_stream_reader.py +124 -124
  311. nltk-3.3/nltk/test/unit/test_senna.py +74 -0
  312. nltk-3.3/nltk/test/unit/test_stem.py +121 -0
  313. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_tag.py +20 -20
  314. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_tgrep.py +628 -626
  315. nltk-3.3/nltk/test/unit/test_tokenize.py +168 -0
  316. {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_twitter_auth.py +185 -185
  317. nltk-3.3/nltk/test/unit/test_wordnet.py +134 -0
  318. nltk-3.3/nltk/test/unit/translate/test_bleu.py +244 -0
  319. nltk-3.3/nltk/test/unit/translate/test_gdfa.py +57 -0
  320. {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm1.py +75 -75
  321. {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm2.py +87 -87
  322. {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm3.py +105 -105
  323. {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm4.py +126 -126
  324. {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm5.py +166 -166
  325. {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm_model.py +270 -270
  326. nltk-3.3/nltk/test/unit/translate/test_nist.py +37 -0
  327. {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_stack_decoder.py +300 -300
  328. {nltk-3.2 → nltk-3.3}/nltk/test/unit/utils.py +41 -41
  329. {nltk-3.2 → nltk-3.3}/nltk/test/util.doctest +48 -48
  330. {nltk-3.2 → nltk-3.3}/nltk/test/wordnet.doctest +595 -581
  331. {nltk-3.2 → nltk-3.3}/nltk/test/wordnet_fixt.py +7 -6
  332. {nltk-3.2 → nltk-3.3}/nltk/test/wordnet_lch.doctest +53 -53
  333. {nltk-3.2 → nltk-3.3}/nltk/test/wsd.doctest +68 -68
  334. {nltk-3.2 → nltk-3.3}/nltk/text.py +663 -610
  335. {nltk-3.2 → nltk-3.3}/nltk/tgrep.py +938 -937
  336. {nltk-3.2 → nltk-3.3}/nltk/tokenize/__init__.py +130 -107
  337. {nltk-3.2 → nltk-3.3}/nltk/tokenize/api.py +77 -78
  338. {nltk-3.2 → nltk-3.3}/nltk/tokenize/casual.py +343 -342
  339. {nltk-3.2 → nltk-3.3}/nltk/tokenize/mwe.py +120 -120
  340. nltk-3.3/nltk/tokenize/nist.py +173 -0
  341. {nltk-3.2 → nltk-3.3}/nltk/tokenize/punkt.py +1620 -1601
  342. {nltk-3.2 → nltk-3.3}/nltk/tokenize/regexp.py +208 -202
  343. nltk-3.3/nltk/tokenize/repp.py +151 -0
  344. {nltk-3.2 → nltk-3.3}/nltk/tokenize/sexpr.py +140 -142
  345. {nltk-3.2 → nltk-3.3}/nltk/tokenize/simple.py +138 -136
  346. {nltk-3.2 → nltk-3.3}/nltk/tokenize/stanford.py +117 -113
  347. nltk-3.3/nltk/tokenize/stanford_segmenter.py +246 -0
  348. {nltk-3.2 → nltk-3.3}/nltk/tokenize/texttiling.py +458 -460
  349. nltk-3.3/nltk/tokenize/toktok.py +155 -0
  350. nltk-3.3/nltk/tokenize/treebank.py +363 -0
  351. nltk-3.3/nltk/tokenize/util.py +261 -0
  352. {nltk-3.2 → nltk-3.3}/nltk/toolbox.py +499 -497
  353. {nltk-3.2 → nltk-3.3}/nltk/translate/__init__.py +24 -24
  354. {nltk-3.2 → nltk-3.3}/nltk/translate/api.py +331 -321
  355. {nltk-3.2 → nltk-3.3}/nltk/translate/bleu_score.py +615 -556
  356. nltk-3.3/nltk/translate/chrf_score.py +137 -0
  357. {nltk-3.2 → nltk-3.3}/nltk/translate/gale_church.py +248 -235
  358. {nltk-3.2 → nltk-3.3}/nltk/translate/gdfa.py +135 -131
  359. nltk-3.3/nltk/translate/gleu_score.py +193 -0
  360. {nltk-3.2 → nltk-3.3}/nltk/translate/ibm1.py +250 -241
  361. {nltk-3.2 → nltk-3.3}/nltk/translate/ibm2.py +308 -308
  362. {nltk-3.2 → nltk-3.3}/nltk/translate/ibm3.py +337 -337
  363. {nltk-3.2 → nltk-3.3}/nltk/translate/ibm4.py +467 -467
  364. {nltk-3.2 → nltk-3.3}/nltk/translate/ibm5.py +639 -639
  365. {nltk-3.2 → nltk-3.3}/nltk/translate/ibm_model.py +536 -533
  366. {nltk-3.2 → nltk-3.3}/nltk/translate/metrics.py +40 -40
  367. nltk-3.3/nltk/translate/nist_score.py +178 -0
  368. {nltk-3.2 → nltk-3.3}/nltk/translate/phrase_based.py +175 -175
  369. {nltk-3.2 → nltk-3.3}/nltk/translate/ribes_score.py +325 -325
  370. {nltk-3.2 → nltk-3.3}/nltk/translate/stack_decoder.py +499 -495
  371. {nltk-3.2 → nltk-3.3}/nltk/tree.py +1605 -1603
  372. {nltk-3.2 → nltk-3.3}/nltk/treeprettyprinter.py +564 -564
  373. {nltk-3.2 → nltk-3.3}/nltk/treetransforms.py +309 -309
  374. {nltk-3.2 → nltk-3.3}/nltk/twitter/__init__.py +28 -28
  375. {nltk-3.2 → nltk-3.3}/nltk/twitter/api.py +141 -136
  376. {nltk-3.2 → nltk-3.3}/nltk/twitter/common.py +264 -258
  377. {nltk-3.2 → nltk-3.3}/nltk/twitter/twitter_demo.py +288 -288
  378. {nltk-3.2 → nltk-3.3}/nltk/twitter/twitterclient.py +530 -530
  379. {nltk-3.2 → nltk-3.3}/nltk/twitter/util.py +147 -146
  380. nltk-3.3/nltk/util.py +751 -0
  381. {nltk-3.2 → nltk-3.3}/nltk/wsd.py +53 -53
  382. {nltk-3.2 → nltk-3.3/nltk.egg-info}/PKG-INFO +13 -5
  383. {nltk-3.2 → nltk-3.3}/nltk.egg-info/SOURCES.txt +26 -3
  384. nltk-3.3/nltk.egg-info/requires.txt +31 -0
  385. {nltk-3.2 → nltk-3.3}/setup.cfg +0 -1
  386. {nltk-3.2 → nltk-3.3}/setup.py +102 -75
  387. nltk-3.2/nltk/VERSION +0 -1
  388. nltk-3.2/nltk/compat.py +0 -680
  389. nltk-3.2/nltk/corpus/reader/pl196x.py +0 -278
  390. nltk-3.2/nltk/corpus/reader/verbnet.py +0 -408
  391. nltk-3.2/nltk/corpus/reader/wordlist.py +0 -37
  392. nltk-3.2/nltk/sentiment/vader_lexicon.txt +0 -7517
  393. nltk-3.2/nltk/six.py +0 -868
  394. nltk-3.2/nltk/stem/porter.py +0 -692
  395. nltk-3.2/nltk/test/unit/test_2x_compat.py +0 -26
  396. nltk-3.2/nltk/test/unit/test_stem.py +0 -36
  397. nltk-3.2/nltk/test/unit/test_tokenize.py +0 -23
  398. nltk-3.2/nltk/test/unit/translate/test_bleu.py +0 -84
  399. nltk-3.2/nltk/tokenize/treebank.py +0 -124
  400. nltk-3.2/nltk/tokenize/util.py +0 -90
  401. nltk-3.2/nltk/util.py +0 -1364
  402. {nltk-3.2 → nltk-3.3}/nltk/test/unit/__init__.py +0 -0
  403. {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/__init__.py +0 -0
  404. {nltk-3.2 → nltk-3.3}/nltk.egg-info/dependency_links.txt +0 -0
  405. {nltk-3.2 → nltk-3.3}/nltk.egg-info/not-zip-safe +0 -0
  406. {nltk-3.2 → nltk-3.3}/nltk.egg-info/top_level.txt +0 -0
@@ -1,361 +1,394 @@
1
- # Natural Language Toolkit: Combinatory Categorial Grammar
2
- #
3
- # Copyright (C) 2001-2015 NLTK Project
4
- # Author: Graeme Gange <ggange@csse.unimelb.edu.au>
5
- # URL: <http://nltk.org/>
6
- # For license information, see LICENSE.TXT
7
-
8
- """
9
- The lexicon is constructed by calling
10
- ``lexicon.fromstring(<lexicon string>)``.
11
-
12
- In order to construct a parser, you also need a rule set.
13
- The standard English rules are provided in chart as
14
- ``chart.DefaultRuleSet``.
15
-
16
- The parser can then be constructed by calling, for example:
17
- ``parser = chart.CCGChartParser(<lexicon>, <ruleset>)``
18
-
19
- Parsing is then performed by running
20
- ``parser.parse(<sentence>.split())``.
21
-
22
- While this returns a list of trees, the default representation
23
- of the produced trees is not very enlightening, particularly
24
- given that it uses the same tree class as the CFG parsers.
25
- It is probably better to call:
26
- ``chart.printCCGDerivation(<parse tree extracted from list>)``
27
- which should print a nice representation of the derivation.
28
-
29
- This entire process is shown far more clearly in the demonstration:
30
- python chart.py
31
- """
32
- from __future__ import print_function, division, unicode_literals
33
-
34
- import itertools
35
-
36
- from nltk.parse import ParserI
37
- from nltk.parse.chart import AbstractChartRule, EdgeI, Chart
38
- from nltk.tree import Tree
39
-
40
- from nltk.ccg.lexicon import fromstring
41
- from nltk.ccg.combinator import (ForwardT, BackwardT, ForwardApplication,
42
- BackwardApplication, ForwardComposition,
43
- BackwardComposition, ForwardSubstitution,
44
- BackwardBx, BackwardSx)
45
- from nltk.compat import python_2_unicode_compatible, string_types
46
-
47
- # Based on the EdgeI class from NLTK.
48
- # A number of the properties of the EdgeI interface don't
49
- # transfer well to CCGs, however.
50
- class CCGEdge(EdgeI):
51
- def __init__(self, span, categ, rule):
52
- self._span = span
53
- self._categ = categ
54
- self._rule = rule
55
- self._comparison_key = (span, categ, rule)
56
-
57
- # Accessors
58
- def lhs(self): return self._categ
59
- def span(self): return self._span
60
- def start(self): return self._span[0]
61
- def end(self): return self._span[1]
62
- def length(self): return self._span[1] - self.span[0]
63
- def rhs(self): return ()
64
- def dot(self): return 0
65
- def is_complete(self): return True
66
- def is_incomplete(self): return False
67
- def nextsym(self): return None
68
-
69
- def categ(self): return self._categ
70
- def rule(self): return self._rule
71
-
72
- class CCGLeafEdge(EdgeI):
73
- '''
74
- Class representing leaf edges in a CCG derivation.
75
- '''
76
- def __init__(self, pos, categ, leaf):
77
- self._pos = pos
78
- self._categ = categ
79
- self._leaf = leaf
80
- self._comparison_key = (pos, categ, leaf)
81
-
82
- # Accessors
83
- def lhs(self): return self._categ
84
- def span(self): return (self._pos, self._pos+1)
85
- def start(self): return self._pos
86
- def end(self): return self._pos + 1
87
- def length(self): return 1
88
- def rhs(self): return self._leaf
89
- def dot(self): return 0
90
- def is_complete(self): return True
91
- def is_incomplete(self): return False
92
- def nextsym(self): return None
93
-
94
- def categ(self): return self._categ
95
- def leaf(self): return self._leaf
96
-
97
- @python_2_unicode_compatible
98
- class BinaryCombinatorRule(AbstractChartRule):
99
- '''
100
- Class implementing application of a binary combinator to a chart.
101
- Takes the directed combinator to apply.
102
- '''
103
- NUMEDGES = 2
104
- def __init__(self,combinator):
105
- self._combinator = combinator
106
-
107
- # Apply a combinator
108
- def apply(self, chart, grammar, left_edge, right_edge):
109
- # The left & right edges must be touching.
110
- if not (left_edge.end() == right_edge.start()):
111
- return
112
-
113
- # Check if the two edges are permitted to combine.
114
- # If so, generate the corresponding edge.
115
- if self._combinator.can_combine(left_edge.categ(),right_edge.categ()):
116
- for res in self._combinator.combine(left_edge.categ(), right_edge.categ()):
117
- new_edge = CCGEdge(span=(left_edge.start(), right_edge.end()),categ=res,rule=self._combinator)
118
- if chart.insert(new_edge,(left_edge,right_edge)):
119
- yield new_edge
120
-
121
- # The representation of the combinator (for printing derivations)
122
- def __str__(self):
123
- return "%s" % self._combinator
124
-
125
- # Type-raising must be handled slightly differently to the other rules, as the
126
- # resulting rules only span a single edge, rather than both edges.
127
- @python_2_unicode_compatible
128
- class ForwardTypeRaiseRule(AbstractChartRule):
129
- '''
130
- Class for applying forward type raising
131
- '''
132
- NUMEDGES = 2
133
-
134
- def __init__(self):
135
- self._combinator = ForwardT
136
- def apply(self, chart, grammar, left_edge, right_edge):
137
- if not (left_edge.end() == right_edge.start()):
138
- return
139
-
140
- for res in self._combinator.combine(left_edge.categ(), right_edge.categ()):
141
- new_edge = CCGEdge(span=left_edge.span(),categ=res,rule=self._combinator)
142
- if chart.insert(new_edge,(left_edge,)):
143
- yield new_edge
144
-
145
- def __str__(self):
146
- return "%s" % self._combinator
147
-
148
- @python_2_unicode_compatible
149
- class BackwardTypeRaiseRule(AbstractChartRule):
150
- '''
151
- Class for applying backward type raising.
152
- '''
153
- NUMEDGES = 2
154
-
155
- def __init__(self):
156
- self._combinator = BackwardT
157
- def apply(self, chart, grammar, left_edge, right_edge):
158
- if not (left_edge.end() == right_edge.start()):
159
- return
160
-
161
- for res in self._combinator.combine(left_edge.categ(), right_edge.categ()):
162
- new_edge = CCGEdge(span=right_edge.span(),categ=res,rule=self._combinator)
163
- if chart.insert(new_edge,(right_edge,)):
164
- yield new_edge
165
-
166
- def __str__(self):
167
- return "%s" % self._combinator
168
-
169
-
170
- # Common sets of combinators used for English derivations.
171
- ApplicationRuleSet = [BinaryCombinatorRule(ForwardApplication),
172
- BinaryCombinatorRule(BackwardApplication)]
173
- CompositionRuleSet = [BinaryCombinatorRule(ForwardComposition),
174
- BinaryCombinatorRule(BackwardComposition),
175
- BinaryCombinatorRule(BackwardBx)]
176
- SubstitutionRuleSet = [BinaryCombinatorRule(ForwardSubstitution),
177
- BinaryCombinatorRule(BackwardSx)]
178
- TypeRaiseRuleSet = [ForwardTypeRaiseRule(), BackwardTypeRaiseRule()]
179
-
180
- # The standard English rule set.
181
- DefaultRuleSet = ApplicationRuleSet + CompositionRuleSet + \
182
- SubstitutionRuleSet + TypeRaiseRuleSet
183
-
184
- class CCGChartParser(ParserI):
185
- '''
186
- Chart parser for CCGs.
187
- Based largely on the ChartParser class from NLTK.
188
- '''
189
- def __init__(self, lexicon, rules, trace=0):
190
- self._lexicon = lexicon
191
- self._rules = rules
192
- self._trace = trace
193
-
194
- def lexicon(self):
195
- return self._lexicon
196
-
197
- # Implements the CYK algorithm
198
- def parse(self, tokens):
199
- tokens = list(tokens)
200
- chart = CCGChart(list(tokens))
201
- lex = self._lexicon
202
-
203
- # Initialize leaf edges.
204
- for index in range(chart.num_leaves()):
205
- for cat in lex.categories(chart.leaf(index)):
206
- new_edge = CCGLeafEdge(index, cat, chart.leaf(index))
207
- chart.insert(new_edge, ())
208
-
209
-
210
- # Select a span for the new edges
211
- for span in range(2,chart.num_leaves()+1):
212
- for start in range(0,chart.num_leaves()-span+1):
213
- # Try all possible pairs of edges that could generate
214
- # an edge for that span
215
- for part in range(1,span):
216
- lstart = start
217
- mid = start + part
218
- rend = start + span
219
-
220
- for left in chart.select(span=(lstart,mid)):
221
- for right in chart.select(span=(mid,rend)):
222
- # Generate all possible combinations of the two edges
223
- for rule in self._rules:
224
- edges_added_by_rule = 0
225
- for newedge in rule.apply(chart,lex,left,right):
226
- edges_added_by_rule += 1
227
-
228
- # Output the resulting parses
229
- return chart.parses(lex.start())
230
-
231
- class CCGChart(Chart):
232
- def __init__(self, tokens):
233
- Chart.__init__(self, tokens)
234
-
235
- # Constructs the trees for a given parse. Unfortnunately, the parse trees need to be
236
- # constructed slightly differently to those in the default Chart class, so it has to
237
- # be reimplemented
238
- def _trees(self, edge, complete, memo, tree_class):
239
- assert complete, "CCGChart cannot build incomplete trees"
240
-
241
- if edge in memo:
242
- return memo[edge]
243
-
244
- if isinstance(edge,CCGLeafEdge):
245
- word = tree_class(edge.lhs(), [self._tokens[edge.start()]])
246
- leaf = tree_class((edge.lhs(), "Leaf"), [word])
247
- memo[edge] = [leaf]
248
- return [leaf]
249
-
250
- memo[edge] = []
251
- trees = []
252
- lhs = (edge.lhs(), "%s" % edge.rule())
253
-
254
- for cpl in self.child_pointer_lists(edge):
255
- child_choices = [self._trees(cp, complete, memo, tree_class)
256
- for cp in cpl]
257
- for children in itertools.product(*child_choices):
258
- trees.append(tree_class(lhs, children))
259
-
260
- memo[edge] = trees
261
- return trees
262
-
263
- #--------
264
- # Displaying derivations
265
- #--------
266
- def printCCGDerivation(tree):
267
- # Get the leaves and initial categories
268
- leafcats = tree.pos()
269
- leafstr = ''
270
- catstr = ''
271
-
272
- # Construct a string with both the leaf word and corresponding
273
- # category aligned.
274
- for (leaf, cat) in leafcats:
275
- str_cat = "%s" % cat
276
- # print(cat.__class__)
277
- # print("str_cat", str_cat)
278
- nextlen = 2 + max(len(leaf), len(str_cat))
279
- lcatlen = (nextlen - len(str_cat)) // 2
280
- rcatlen = lcatlen + (nextlen - len(str_cat)) % 2
281
- catstr += ' '*lcatlen + str_cat + ' '*rcatlen
282
- lleaflen = (nextlen - len(leaf)) // 2
283
- rleaflen = lleaflen + (nextlen - len(leaf)) % 2
284
- leafstr += ' '*lleaflen + leaf + ' '*rleaflen
285
- print(leafstr)
286
- print(catstr)
287
-
288
- # Display the derivation steps
289
- printCCGTree(0,tree)
290
-
291
- # Prints the sequence of derivation steps.
292
- def printCCGTree(lwidth,tree):
293
- rwidth = lwidth
294
-
295
- # Is a leaf (word).
296
- # Increment the span by the space occupied by the leaf.
297
- if not isinstance(tree,Tree):
298
- return 2 + lwidth + len(tree)
299
-
300
- # Find the width of the current derivation step
301
- for child in tree:
302
- rwidth = max(rwidth, printCCGTree(rwidth,child))
303
-
304
- # Is a leaf node.
305
- # Don't print anything, but account for the space occupied.
306
- if not isinstance(tree.label(), tuple):
307
- return max(rwidth,2 + lwidth + len("%s" % tree.label()),
308
- 2 + lwidth + len(tree[0]))
309
-
310
- (res,op) = tree.label()
311
- # Pad to the left with spaces, followed by a sequence of '-'
312
- # and the derivation rule.
313
- print(lwidth*' ' + (rwidth-lwidth)*'-' + "%s" % op)
314
- # Print the resulting category on a new line.
315
- str_res = "%s" % res
316
- respadlen = (rwidth - lwidth - len(str_res)) // 2 + lwidth
317
- print(respadlen*' ' + str_res)
318
- return rwidth
319
-
320
-
321
- ### Demonstration code
322
-
323
- # Construct the lexicon
324
- lex = fromstring('''
325
- :- S, NP, N, VP # Primitive categories, S is the target primitive
326
-
327
- Det :: NP/N # Family of words
328
- Pro :: NP
329
- TV :: VP/NP
330
- Modal :: (S\\NP)/VP # Backslashes need to be escaped
331
-
332
- I => Pro # Word -> Category mapping
333
- you => Pro
334
-
335
- the => Det
336
-
337
- # Variables have the special keyword 'var'
338
- # '.' prevents permutation
339
- # ',' prevents composition
340
- and => var\\.,var/.,var
341
-
342
- which => (N\\N)/(S/NP)
343
-
344
- will => Modal # Categories can be either explicit, or families.
345
- might => Modal
346
-
347
- cook => TV
348
- eat => TV
349
-
350
- mushrooms => N
351
- parsnips => N
352
- bacon => N
353
- ''')
354
-
355
- def demo():
356
- parser = CCGChartParser(lex, DefaultRuleSet)
357
- for parse in parser.parse("I might cook and eat the bacon".split()):
358
- printCCGDerivation(parse)
359
-
360
- if __name__ == '__main__':
361
- demo()
1
+ # Natural Language Toolkit: Combinatory Categorial Grammar
2
+ #
3
+ # Copyright (C) 2001-2018 NLTK Project
4
+ # Author: Graeme Gange <ggange@csse.unimelb.edu.au>
5
+ # URL: <http://nltk.org/>
6
+ # For license information, see LICENSE.TXT
7
+
8
+ """
9
+ The lexicon is constructed by calling
10
+ ``lexicon.fromstring(<lexicon string>)``.
11
+
12
+ In order to construct a parser, you also need a rule set.
13
+ The standard English rules are provided in chart as
14
+ ``chart.DefaultRuleSet``.
15
+
16
+ The parser can then be constructed by calling, for example:
17
+ ``parser = chart.CCGChartParser(<lexicon>, <ruleset>)``
18
+
19
+ Parsing is then performed by running
20
+ ``parser.parse(<sentence>.split())``.
21
+
22
+ While this returns a list of trees, the default representation
23
+ of the produced trees is not very enlightening, particularly
24
+ given that it uses the same tree class as the CFG parsers.
25
+ It is probably better to call:
26
+ ``chart.printCCGDerivation(<parse tree extracted from list>)``
27
+ which should print a nice representation of the derivation.
28
+
29
+ This entire process is shown far more clearly in the demonstration:
30
+ python chart.py
31
+ """
32
+ from __future__ import print_function, division, unicode_literals
33
+
34
+ import itertools
35
+
36
+ from six import string_types
37
+
38
+ from nltk.parse import ParserI
39
+ from nltk.parse.chart import AbstractChartRule, EdgeI, Chart
40
+ from nltk.tree import Tree
41
+
42
+ from nltk.ccg.lexicon import fromstring, Token
43
+ from nltk.ccg.combinator import (ForwardT, BackwardT, ForwardApplication,
44
+ BackwardApplication, ForwardComposition,
45
+ BackwardComposition, ForwardSubstitution,
46
+ BackwardBx, BackwardSx)
47
+ from nltk.compat import python_2_unicode_compatible
48
+ from nltk.ccg.combinator import *
49
+ from nltk.ccg.logic import *
50
+ from nltk.sem.logic import *
51
+
52
+ # Based on the EdgeI class from NLTK.
53
+ # A number of the properties of the EdgeI interface don't
54
+ # transfer well to CCGs, however.
55
+ class CCGEdge(EdgeI):
56
+ def __init__(self, span, categ, rule):
57
+ self._span = span
58
+ self._categ = categ
59
+ self._rule = rule
60
+ self._comparison_key = (span, categ, rule)
61
+
62
+ # Accessors
63
+ def lhs(self): return self._categ
64
+ def span(self): return self._span
65
+ def start(self): return self._span[0]
66
+ def end(self): return self._span[1]
67
+ def length(self): return self._span[1] - self.span[0]
68
+ def rhs(self): return ()
69
+ def dot(self): return 0
70
+ def is_complete(self): return True
71
+ def is_incomplete(self): return False
72
+ def nextsym(self): return None
73
+
74
+ def categ(self): return self._categ
75
+ def rule(self): return self._rule
76
+
77
+ class CCGLeafEdge(EdgeI):
78
+ '''
79
+ Class representing leaf edges in a CCG derivation.
80
+ '''
81
+ def __init__(self, pos, token, leaf):
82
+ self._pos = pos
83
+ self._token = token
84
+ self._leaf = leaf
85
+ self._comparison_key = (pos, token.categ(), leaf)
86
+
87
+ # Accessors
88
+ def lhs(self): return self._token.categ()
89
+ def span(self): return (self._pos, self._pos+1)
90
+ def start(self): return self._pos
91
+ def end(self): return self._pos + 1
92
+ def length(self): return 1
93
+ def rhs(self): return self._leaf
94
+ def dot(self): return 0
95
+ def is_complete(self): return True
96
+ def is_incomplete(self): return False
97
+ def nextsym(self): return None
98
+
99
+ def token(self): return self._token
100
+ def categ(self): return self._token.categ()
101
+ def leaf(self): return self._leaf
102
+
103
+ @python_2_unicode_compatible
104
+ class BinaryCombinatorRule(AbstractChartRule):
105
+ '''
106
+ Class implementing application of a binary combinator to a chart.
107
+ Takes the directed combinator to apply.
108
+ '''
109
+ NUMEDGES = 2
110
+ def __init__(self,combinator):
111
+ self._combinator = combinator
112
+
113
+ # Apply a combinator
114
+ def apply(self, chart, grammar, left_edge, right_edge):
115
+ # The left & right edges must be touching.
116
+ if not (left_edge.end() == right_edge.start()):
117
+ return
118
+
119
+ # Check if the two edges are permitted to combine.
120
+ # If so, generate the corresponding edge.
121
+ if self._combinator.can_combine(left_edge.categ(),right_edge.categ()):
122
+ for res in self._combinator.combine(left_edge.categ(), right_edge.categ()):
123
+ new_edge = CCGEdge(span=(left_edge.start(), right_edge.end()),categ=res,rule=self._combinator)
124
+ if chart.insert(new_edge,(left_edge,right_edge)):
125
+ yield new_edge
126
+
127
+ # The representation of the combinator (for printing derivations)
128
+ def __str__(self):
129
+ return "%s" % self._combinator
130
+
131
+ # Type-raising must be handled slightly differently to the other rules, as the
132
+ # resulting rules only span a single edge, rather than both edges.
133
+ @python_2_unicode_compatible
134
+ class ForwardTypeRaiseRule(AbstractChartRule):
135
+ '''
136
+ Class for applying forward type raising
137
+ '''
138
+ NUMEDGES = 2
139
+
140
+ def __init__(self):
141
+ self._combinator = ForwardT
142
+ def apply(self, chart, grammar, left_edge, right_edge):
143
+ if not (left_edge.end() == right_edge.start()):
144
+ return
145
+
146
+ for res in self._combinator.combine(left_edge.categ(), right_edge.categ()):
147
+ new_edge = CCGEdge(span=left_edge.span(),categ=res,rule=self._combinator)
148
+ if chart.insert(new_edge,(left_edge,)):
149
+ yield new_edge
150
+
151
+ def __str__(self):
152
+ return "%s" % self._combinator
153
+
154
+ @python_2_unicode_compatible
155
+ class BackwardTypeRaiseRule(AbstractChartRule):
156
+ '''
157
+ Class for applying backward type raising.
158
+ '''
159
+ NUMEDGES = 2
160
+
161
+ def __init__(self):
162
+ self._combinator = BackwardT
163
+ def apply(self, chart, grammar, left_edge, right_edge):
164
+ if not (left_edge.end() == right_edge.start()):
165
+ return
166
+
167
+ for res in self._combinator.combine(left_edge.categ(), right_edge.categ()):
168
+ new_edge = CCGEdge(span=right_edge.span(),categ=res,rule=self._combinator)
169
+ if chart.insert(new_edge,(right_edge,)):
170
+ yield new_edge
171
+
172
+ def __str__(self):
173
+ return "%s" % self._combinator
174
+
175
+
176
+ # Common sets of combinators used for English derivations.
177
+ ApplicationRuleSet = [BinaryCombinatorRule(ForwardApplication),
178
+ BinaryCombinatorRule(BackwardApplication)]
179
+ CompositionRuleSet = [BinaryCombinatorRule(ForwardComposition),
180
+ BinaryCombinatorRule(BackwardComposition),
181
+ BinaryCombinatorRule(BackwardBx)]
182
+ SubstitutionRuleSet = [BinaryCombinatorRule(ForwardSubstitution),
183
+ BinaryCombinatorRule(BackwardSx)]
184
+ TypeRaiseRuleSet = [ForwardTypeRaiseRule(), BackwardTypeRaiseRule()]
185
+
186
+ # The standard English rule set.
187
+ DefaultRuleSet = ApplicationRuleSet + CompositionRuleSet + \
188
+ SubstitutionRuleSet + TypeRaiseRuleSet
189
+
190
+ class CCGChartParser(ParserI):
191
+ '''
192
+ Chart parser for CCGs.
193
+ Based largely on the ChartParser class from NLTK.
194
+ '''
195
+ def __init__(self, lexicon, rules, trace=0):
196
+ self._lexicon = lexicon
197
+ self._rules = rules
198
+ self._trace = trace
199
+
200
+ def lexicon(self):
201
+ return self._lexicon
202
+
203
+ # Implements the CYK algorithm
204
+ def parse(self, tokens):
205
+ tokens = list(tokens)
206
+ chart = CCGChart(list(tokens))
207
+ lex = self._lexicon
208
+
209
+ # Initialize leaf edges.
210
+ for index in range(chart.num_leaves()):
211
+ for token in lex.categories(chart.leaf(index)):
212
+ new_edge = CCGLeafEdge(index, token, chart.leaf(index))
213
+ chart.insert(new_edge, ())
214
+
215
+
216
+ # Select a span for the new edges
217
+ for span in range(2,chart.num_leaves()+1):
218
+ for start in range(0,chart.num_leaves()-span+1):
219
+ # Try all possible pairs of edges that could generate
220
+ # an edge for that span
221
+ for part in range(1,span):
222
+ lstart = start
223
+ mid = start + part
224
+ rend = start + span
225
+
226
+ for left in chart.select(span=(lstart,mid)):
227
+ for right in chart.select(span=(mid,rend)):
228
+ # Generate all possible combinations of the two edges
229
+ for rule in self._rules:
230
+ edges_added_by_rule = 0
231
+ for newedge in rule.apply(chart,lex,left,right):
232
+ edges_added_by_rule += 1
233
+
234
+ # Output the resulting parses
235
+ return chart.parses(lex.start())
236
+
237
+ class CCGChart(Chart):
238
+ def __init__(self, tokens):
239
+ Chart.__init__(self, tokens)
240
+
241
+ # Constructs the trees for a given parse. Unfortnunately, the parse trees need to be
242
+ # constructed slightly differently to those in the default Chart class, so it has to
243
+ # be reimplemented
244
+ def _trees(self, edge, complete, memo, tree_class):
245
+ assert complete, "CCGChart cannot build incomplete trees"
246
+
247
+ if edge in memo:
248
+ return memo[edge]
249
+
250
+ if isinstance(edge,CCGLeafEdge):
251
+ word = tree_class(edge.token(), [self._tokens[edge.start()]])
252
+ leaf = tree_class((edge.token(), "Leaf"), [word])
253
+ memo[edge] = [leaf]
254
+ return [leaf]
255
+
256
+ memo[edge] = []
257
+ trees = []
258
+
259
+ for cpl in self.child_pointer_lists(edge):
260
+ child_choices = [self._trees(cp, complete, memo, tree_class)
261
+ for cp in cpl]
262
+ for children in itertools.product(*child_choices):
263
+ lhs = (Token(self._tokens[edge.start():edge.end()], edge.lhs(), compute_semantics(children, edge)), str(edge.rule()))
264
+ trees.append(tree_class(lhs, children))
265
+
266
+ memo[edge] = trees
267
+ return trees
268
+
269
+
270
+ def compute_semantics(children, edge):
271
+ if children[0].label()[0].semantics() is None:
272
+ return None
273
+
274
+ if len(children) is 2:
275
+ if isinstance(edge.rule(), BackwardCombinator):
276
+ children = [children[1],children[0]]
277
+
278
+ combinator = edge.rule()._combinator
279
+ function = children[0].label()[0].semantics()
280
+ argument = children[1].label()[0].semantics()
281
+
282
+ if isinstance(combinator, UndirectedFunctionApplication):
283
+ return compute_function_semantics(function, argument)
284
+ elif isinstance(combinator, UndirectedComposition):
285
+ return compute_composition_semantics(function, argument)
286
+ elif isinstance(combinator, UndirectedSubstitution):
287
+ return compute_substitution_semantics(function, argument)
288
+ else:
289
+ raise AssertionError('Unsupported combinator \'' + combinator + '\'')
290
+ else:
291
+ return compute_type_raised_semantics(children[0].label()[0].semantics())
292
+
293
+ #--------
294
+ # Displaying derivations
295
+ #--------
296
+ def printCCGDerivation(tree):
297
+ # Get the leaves and initial categories
298
+ leafcats = tree.pos()
299
+ leafstr = ''
300
+ catstr = ''
301
+
302
+ # Construct a string with both the leaf word and corresponding
303
+ # category aligned.
304
+ for (leaf, cat) in leafcats:
305
+ str_cat = "%s" % cat
306
+ nextlen = 2 + max(len(leaf), len(str_cat))
307
+ lcatlen = (nextlen - len(str_cat)) // 2
308
+ rcatlen = lcatlen + (nextlen - len(str_cat)) % 2
309
+ catstr += ' '*lcatlen + str_cat + ' '*rcatlen
310
+ lleaflen = (nextlen - len(leaf)) // 2
311
+ rleaflen = lleaflen + (nextlen - len(leaf)) % 2
312
+ leafstr += ' '*lleaflen + leaf + ' '*rleaflen
313
+ print(leafstr.rstrip())
314
+ print(catstr.rstrip())
315
+
316
+ # Display the derivation steps
317
+ printCCGTree(0,tree)
318
+
319
+ # Prints the sequence of derivation steps.
320
+ def printCCGTree(lwidth,tree):
321
+ rwidth = lwidth
322
+
323
+ # Is a leaf (word).
324
+ # Increment the span by the space occupied by the leaf.
325
+ if not isinstance(tree, Tree):
326
+ return 2 + lwidth + len(tree)
327
+
328
+ # Find the width of the current derivation step
329
+ for child in tree:
330
+ rwidth = max(rwidth, printCCGTree(rwidth,child))
331
+
332
+ # Is a leaf node.
333
+ # Don't print anything, but account for the space occupied.
334
+ if not isinstance(tree.label(), tuple):
335
+ return max(rwidth,2 + lwidth + len("%s" % tree.label()),
336
+ 2 + lwidth + len(tree[0]))
337
+
338
+ (token, op) = tree.label()
339
+
340
+ if op == 'Leaf':
341
+ return rwidth
342
+
343
+ # Pad to the left with spaces, followed by a sequence of '-'
344
+ # and the derivation rule.
345
+ print(lwidth*' ' + (rwidth-lwidth)*'-' + "%s" % op)
346
+ # Print the resulting category on a new line.
347
+ str_res = "%s" % (token.categ())
348
+ if token.semantics() is not None:
349
+ str_res += " {" + str(token.semantics()) + "}"
350
+ respadlen = (rwidth - lwidth - len(str_res)) // 2 + lwidth
351
+ print(respadlen*' ' + str_res)
352
+ return rwidth
353
+
354
+ ### Demonstration code
355
+
356
+ # Construct the lexicon
357
+ lex = fromstring('''
358
+ :- S, NP, N, VP # Primitive categories, S is the target primitive
359
+
360
+ Det :: NP/N # Family of words
361
+ Pro :: NP
362
+ TV :: VP/NP
363
+ Modal :: (S\\NP)/VP # Backslashes need to be escaped
364
+
365
+ I => Pro # Word -> Category mapping
366
+ you => Pro
367
+
368
+ the => Det
369
+
370
+ # Variables have the special keyword 'var'
371
+ # '.' prevents permutation
372
+ # ',' prevents composition
373
+ and => var\\.,var/.,var
374
+
375
+ which => (N\\N)/(S/NP)
376
+
377
+ will => Modal # Categories can be either explicit, or families.
378
+ might => Modal
379
+
380
+ cook => TV
381
+ eat => TV
382
+
383
+ mushrooms => N
384
+ parsnips => N
385
+ bacon => N
386
+ ''')
387
+
388
+ def demo():
389
+ parser = CCGChartParser(lex, DefaultRuleSet)
390
+ for parse in parser.parse("I might cook and eat the bacon".split()):
391
+ printCCGDerivation(parse)
392
+
393
+ if __name__ == '__main__':
394
+ demo()