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,604 +1,595 @@
1
- # Natural Language Toolkit: TnT Tagger
2
- #
3
- # Copyright (C) 2001-2015 NLTK Project
4
- # Author: Sam Huston <sjh900@gmail.com>
5
- #
6
- # URL: <http://nltk.org/>
7
- # For license information, see LICENSE.TXT
8
-
9
- '''
10
- Implementation of 'TnT - A Statisical Part of Speech Tagger'
11
- by Thorsten Brants
12
-
13
- http://acl.ldc.upenn.edu/A/A00/A00-1031.pdf
14
- '''
15
- from __future__ import print_function, division
16
- from math import log
17
-
18
- from operator import itemgetter
19
-
20
- from nltk.probability import FreqDist, ConditionalFreqDist
21
- from nltk.tag.api import TaggerI
22
-
23
- class TnT(TaggerI):
24
- '''
25
- TnT - Statistical POS tagger
26
-
27
- IMPORTANT NOTES:
28
-
29
- * DOES NOT AUTOMATICALLY DEAL WITH UNSEEN WORDS
30
-
31
- - It is possible to provide an untrained POS tagger to
32
- create tags for unknown words, see __init__ function
33
-
34
- * SHOULD BE USED WITH SENTENCE-DELIMITED INPUT
35
-
36
- - Due to the nature of this tagger, it works best when
37
- trained over sentence delimited input.
38
- - However it still produces good results if the training
39
- data and testing data are separated on all punctuation eg: [,.?!]
40
- - Input for training is expected to be a list of sentences
41
- where each sentence is a list of (word, tag) tuples
42
- - Input for tag function is a single sentence
43
- Input for tagdata function is a list of sentences
44
- Output is of a similar form
45
-
46
- * Function provided to process text that is unsegmented
47
-
48
- - Please see basic_sent_chop()
49
-
50
-
51
- TnT uses a second order Markov model to produce tags for
52
- a sequence of input, specifically:
53
-
54
- argmax [Proj(P(t_i|t_i-1,t_i-2)P(w_i|t_i))] P(t_T+1 | t_T)
55
-
56
- IE: the maximum projection of a set of probabilities
57
-
58
- The set of possible tags for a given word is derived
59
- from the training data. It is the set of all tags
60
- that exact word has been assigned.
61
-
62
- To speed up and get more precision, we can use log addition
63
- to instead multiplication, specifically:
64
-
65
- argmax [Sigma(log(P(t_i|t_i-1,t_i-2))+log(P(w_i|t_i)))] +
66
- log(P(t_T+1|t_T))
67
-
68
- The probability of a tag for a given word is the linear
69
- interpolation of 3 markov models; a zero-order, first-order,
70
- and a second order model.
71
-
72
- P(t_i| t_i-1, t_i-2) = l1*P(t_i) + l2*P(t_i| t_i-1) +
73
- l3*P(t_i| t_i-1, t_i-2)
74
-
75
- A beam search is used to limit the memory usage of the algorithm.
76
- The degree of the beam can be changed using N in the initialization.
77
- N represents the maximum number of possible solutions to maintain
78
- while tagging.
79
-
80
- It is possible to differentiate the tags which are assigned to
81
- capitalized words. However this does not result in a significant
82
- gain in the accuracy of the results.
83
- '''
84
-
85
- def __init__(self, unk=None, Trained=False, N=1000, C=False):
86
- '''
87
- Construct a TnT statistical tagger. Tagger must be trained
88
- before being used to tag input.
89
-
90
- :param unk: instance of a POS tagger, conforms to TaggerI
91
- :type unk:(TaggerI)
92
- :param Trained: Indication that the POS tagger is trained or not
93
- :type Trained: boolean
94
- :param N: Beam search degree (see above)
95
- :type N:(int)
96
- :param C: Capitalization flag
97
- :type C: boolean
98
-
99
- Initializer, creates frequency distributions to be used
100
- for tagging
101
-
102
- _lx values represent the portion of the tri/bi/uni taggers
103
- to be used to calculate the probability
104
-
105
- N value is the number of possible solutions to maintain
106
- while tagging. A good value for this is 1000
107
-
108
- C is a boolean value which specifies to use or
109
- not use the Capitalization of the word as additional
110
- information for tagging.
111
- NOTE: using capitalization may not increase the accuracy
112
- of the tagger
113
- '''
114
-
115
- self._uni = FreqDist()
116
- self._bi = ConditionalFreqDist()
117
- self._tri = ConditionalFreqDist()
118
- self._wd = ConditionalFreqDist()
119
- self._eos = ConditionalFreqDist()
120
- self._l1 = 0.0
121
- self._l2 = 0.0
122
- self._l3 = 0.0
123
- self._N = N
124
- self._C = C
125
- self._T = Trained
126
-
127
- self._unk = unk
128
-
129
- # statistical tools (ignore or delete me)
130
- self.unknown = 0
131
- self.known = 0
132
-
133
- def train(self, data):
134
- '''
135
- Uses a set of tagged data to train the tagger.
136
- If an unknown word tagger is specified,
137
- it is trained on the same data.
138
-
139
- :param data: List of lists of (word, tag) tuples
140
- :type data: tuple(str)
141
- '''
142
-
143
- # Ensure that local C flag is initialized before use
144
- C = False
145
-
146
- if self._unk is not None and self._T == False:
147
- self._unk.train(data)
148
-
149
- for sent in data:
150
- history = [('BOS',False), ('BOS',False)]
151
- for w, t in sent:
152
-
153
- # if capitalization is requested,
154
- # and the word begins with a capital
155
- # set local flag C to True
156
- if self._C and w[0].isupper(): C=True
157
-
158
- self._wd[w][t] += 1
159
- self._uni[(t,C)] += 1
160
- self._bi[history[1]][(t,C)] += 1
161
- self._tri[tuple(history)][(t,C)] += 1
162
-
163
- history.append((t,C))
164
- history.pop(0)
165
-
166
- # set local flag C to false for the next word
167
- C = False
168
-
169
- self._eos[t]['EOS'] += 1
170
-
171
-
172
- # compute lambda values from the trained frequency distributions
173
- self._compute_lambda()
174
-
175
- #(debugging -- ignore or delete me)
176
- #print "lambdas"
177
- #print i, self._l1, i, self._l2, i, self._l3
178
-
179
-
180
- def _compute_lambda(self):
181
- '''
182
- creates lambda values based upon training data
183
-
184
- NOTE: no need to explicitly reference C,
185
- it is contained within the tag variable :: tag == (tag,C)
186
-
187
- for each tag trigram (t1, t2, t3)
188
- depending on the maximum value of
189
- - f(t1,t2,t3)-1 / f(t1,t2)-1
190
- - f(t2,t3)-1 / f(t2)-1
191
- - f(t3)-1 / N-1
192
-
193
- increment l3,l2, or l1 by f(t1,t2,t3)
194
-
195
- ISSUES -- Resolutions:
196
- if 2 values are equal, increment both lambda values
197
- by (f(t1,t2,t3) / 2)
198
- '''
199
-
200
- # temporary lambda variables
201
- tl1 = 0.0
202
- tl2 = 0.0
203
- tl3 = 0.0
204
-
205
- # for each t1,t2 in system
206
- for history in self._tri.conditions():
207
- (h1, h2) = history
208
-
209
- # for each t3 given t1,t2 in system
210
- # (NOTE: tag actually represents (tag,C))
211
- # However no effect within this function
212
- for tag in self._tri[history].keys():
213
-
214
- # if there has only been 1 occurrence of this tag in the data
215
- # then ignore this trigram.
216
- if self._uni[tag] == 1:
217
- continue
218
-
219
- # safe_div provides a safe floating point division
220
- # it returns -1 if the denominator is 0
221
- c3 = self._safe_div((self._tri[history][tag]-1), (self._tri[history].N()-1))
222
- c2 = self._safe_div((self._bi[h2][tag]-1), (self._bi[h2].N()-1))
223
- c1 = self._safe_div((self._uni[tag]-1), (self._uni.N()-1))
224
-
225
-
226
- # if c1 is the maximum value:
227
- if (c1 > c3) and (c1 > c2):
228
- tl1 += self._tri[history][tag]
229
-
230
- # if c2 is the maximum value
231
- elif (c2 > c3) and (c2 > c1):
232
- tl2 += self._tri[history][tag]
233
-
234
- # if c3 is the maximum value
235
- elif (c3 > c2) and (c3 > c1):
236
- tl3 += self._tri[history][tag]
237
-
238
- # if c3, and c2 are equal and larger than c1
239
- elif (c3 == c2) and (c3 > c1):
240
- tl2 += self._tri[history][tag] / 2.0
241
- tl3 += self._tri[history][tag] / 2.0
242
-
243
- # if c1, and c2 are equal and larger than c3
244
- # this might be a dumb thing to do....(not sure yet)
245
- elif (c2 == c1) and (c1 > c3):
246
- tl1 += self._tri[history][tag] / 2.0
247
- tl2 += self._tri[history][tag] / 2.0
248
-
249
- # otherwise there might be a problem
250
- # eg: all values = 0
251
- else:
252
- #print "Problem", c1, c2 ,c3
253
- pass
254
-
255
- # Lambda normalisation:
256
- # ensures that l1+l2+l3 = 1
257
- self._l1 = tl1 / (tl1+tl2+tl3)
258
- self._l2 = tl2 / (tl1+tl2+tl3)
259
- self._l3 = tl3 / (tl1+tl2+tl3)
260
-
261
-
262
-
263
- def _safe_div(self, v1, v2):
264
- '''
265
- Safe floating point division function, does not allow division by 0
266
- returns -1 if the denominator is 0
267
- '''
268
- if v2 == 0:
269
- return -1
270
- else:
271
- return v1 / v2
272
-
273
- def tagdata(self, data):
274
- '''
275
- Tags each sentence in a list of sentences
276
-
277
- :param data:list of list of words
278
- :type data: [[string,],]
279
- :return: list of list of (word, tag) tuples
280
-
281
- Invokes tag(sent) function for each sentence
282
- compiles the results into a list of tagged sentences
283
- each tagged sentence is a list of (word, tag) tuples
284
- '''
285
- res = []
286
- for sent in data:
287
- res1 = self.tag(sent)
288
- res.append(res1)
289
- return res
290
-
291
-
292
- def tag(self, data):
293
- '''
294
- Tags a single sentence
295
-
296
- :param data: list of words
297
- :type data: [string,]
298
-
299
- :return: [(word, tag),]
300
-
301
- Calls recursive function '_tagword'
302
- to produce a list of tags
303
-
304
- Associates the sequence of returned tags
305
- with the correct words in the input sequence
306
-
307
- returns a list of (word, tag) tuples
308
- '''
309
-
310
- current_state = [(['BOS', 'BOS'], 0.0)]
311
-
312
- sent = list(data)
313
-
314
- tags = self._tagword(sent, current_state)
315
-
316
- res = []
317
- for i in range(len(sent)):
318
- # unpack and discard the C flags
319
- (t,C) = tags[i+2]
320
- res.append((sent[i], t))
321
-
322
- return res
323
-
324
-
325
- def _tagword(self, sent, current_states):
326
- '''
327
- :param sent : List of words remaining in the sentence
328
- :type sent : [word,]
329
- :param current_states : List of possible tag combinations for
330
- the sentence so far, and the log probability
331
- associated with each tag combination
332
- :type current_states : [([tag, ], logprob), ]
333
-
334
- Tags the first word in the sentence and
335
- recursively tags the reminder of sentence
336
-
337
- Uses formula specified above to calculate the probability
338
- of a particular tag
339
- '''
340
-
341
- # if this word marks the end of the sentance,
342
- # return the most probable tag
343
- if sent == []:
344
- (h, logp) = current_states[0]
345
- return h
346
-
347
- # otherwise there are more words to be tagged
348
- word = sent[0]
349
- sent = sent[1:]
350
- new_states = []
351
-
352
- # if the Capitalisation is requested,
353
- # initalise the flag for this word
354
- C = False
355
- if self._C and word[0].isupper(): C=True
356
-
357
- # if word is known
358
- # compute the set of possible tags
359
- # and their associated log probabilities
360
- if word in self._wd.conditions():
361
- self.known += 1
362
-
363
- for (history, curr_sent_logprob) in current_states:
364
- logprobs = []
365
-
366
- for t in self._wd[word].keys():
367
- p_uni = self._uni.freq((t,C))
368
- p_bi = self._bi[history[-1]].freq((t,C))
369
- p_tri = self._tri[tuple(history[-2:])].freq((t,C))
370
- p_wd = self._wd[word][t] / self._uni[(t,C)]
371
- p = self._l1 *p_uni + self._l2 *p_bi + self._l3 *p_tri
372
- p2 = log(p, 2) + log(p_wd, 2)
373
-
374
- logprobs.append(((t,C), p2))
375
-
376
-
377
- # compute the result of appending each tag to this history
378
- for (tag, logprob) in logprobs:
379
- new_states.append((history + [tag],
380
- curr_sent_logprob + logprob))
381
-
382
-
383
-
384
-
385
- # otherwise a new word, set of possible tags is unknown
386
- else:
387
- self.unknown += 1
388
-
389
- # since a set of possible tags,
390
- # and the probability of each specific tag
391
- # can not be returned from most classifiers:
392
- # specify that any unknown words are tagged with certainty
393
- p = 1
394
-
395
- # if no unknown word tagger has been specified
396
- # then use the tag 'Unk'
397
- if self._unk is None:
398
- tag = ('Unk',C)
399
-
400
- # otherwise apply the unknown word tagger
401
- else :
402
- [(_w, t)] = list(self._unk.tag([word]))
403
- tag = (t,C)
404
-
405
- for (history, logprob) in current_states:
406
- history.append(tag)
407
-
408
- new_states = current_states
409
-
410
-
411
-
412
- # now have computed a set of possible new_states
413
-
414
- # sort states by log prob
415
- # set is now ordered greatest to least log probability
416
- new_states.sort(reverse=True, key=itemgetter(1))
417
-
418
- # del everything after N (threshold)
419
- # this is the beam search cut
420
- if len(new_states) > self._N:
421
- new_states = new_states[:self._N]
422
-
423
-
424
- # compute the tags for the rest of the sentence
425
- # return the best list of tags for the sentence
426
- return self._tagword(sent, new_states)
427
-
428
-
429
- ########################################
430
- # helper function -- basic sentence tokenizer
431
- ########################################
432
-
433
- def basic_sent_chop(data, raw=True):
434
- '''
435
- Basic method for tokenizing input into sentences
436
- for this tagger:
437
-
438
- :param data: list of tokens (words or (word, tag) tuples)
439
- :type data: str or tuple(str, str)
440
- :param raw: boolean flag marking the input data
441
- as a list of words or a list of tagged words
442
- :type raw: bool
443
- :return: list of sentences
444
- sentences are a list of tokens
445
- tokens are the same as the input
446
-
447
- Function takes a list of tokens and separates the tokens into lists
448
- where each list represents a sentence fragment
449
- This function can separate both tagged and raw sequences into
450
- basic sentences.
451
-
452
- Sentence markers are the set of [,.!?]
453
-
454
- This is a simple method which enhances the performance of the TnT
455
- tagger. Better sentence tokenization will further enhance the results.
456
- '''
457
-
458
- new_data = []
459
- curr_sent = []
460
- sent_mark = [',','.','?','!']
461
-
462
-
463
- if raw:
464
- for word in data:
465
- if word in sent_mark:
466
- curr_sent.append(word)
467
- new_data.append(curr_sent)
468
- curr_sent = []
469
- else:
470
- curr_sent.append(word)
471
-
472
- else:
473
- for (word,tag) in data:
474
- if word in sent_mark:
475
- curr_sent.append((word,tag))
476
- new_data.append(curr_sent)
477
- curr_sent = []
478
- else:
479
- curr_sent.append((word,tag))
480
- return new_data
481
-
482
-
483
-
484
- def demo():
485
- from nltk.corpus import brown
486
- sents = list(brown.tagged_sents())
487
- test = list(brown.sents())
488
-
489
- # create and train the tagger
490
- tagger = TnT()
491
- tagger.train(sents[200:1000])
492
-
493
- # tag some data
494
- tagged_data = tagger.tagdata(test[100:120])
495
-
496
- # print results
497
- for j in range(len(tagged_data)):
498
- s = tagged_data[j]
499
- t = sents[j+100]
500
- for i in range(len(s)):
501
- print(s[i],'--', t[i])
502
- print()
503
-
504
-
505
- def demo2():
506
- from nltk.corpus import treebank
507
-
508
- d = list(treebank.tagged_sents())
509
-
510
- t = TnT(N=1000, C=False)
511
- s = TnT(N=1000, C=True)
512
- t.train(d[(11)*100:])
513
- s.train(d[(11)*100:])
514
-
515
- for i in range(10):
516
- tacc = t.evaluate(d[i*100:((i+1)*100)])
517
- tp_un = t.unknown / (t.known + t.unknown)
518
- tp_kn = t.known / (t.known + t.unknown)
519
- t.unknown = 0
520
- t.known = 0
521
-
522
- print('Capitalization off:')
523
- print('Accuracy:', tacc)
524
- print('Percentage known:', tp_kn)
525
- print('Percentage unknown:', tp_un)
526
- print('Accuracy over known words:', (tacc / tp_kn))
527
-
528
- sacc = s.evaluate(d[i*100:((i+1)*100)])
529
- sp_un = s.unknown / (s.known + s.unknown)
530
- sp_kn = s.known / (s.known + s.unknown)
531
- s.unknown = 0
532
- s.known = 0
533
-
534
- print('Capitalization on:')
535
- print('Accuracy:', sacc)
536
- print('Percentage known:', sp_kn)
537
- print('Percentage unknown:', sp_un)
538
- print('Accuracy over known words:', (sacc / sp_kn))
539
-
540
- def demo3():
541
- from nltk.corpus import treebank, brown
542
-
543
- d = list(treebank.tagged_sents())
544
- e = list(brown.tagged_sents())
545
-
546
- d = d[:1000]
547
- e = e[:1000]
548
-
549
- d10 = int(len(d)*0.1)
550
- e10 = int(len(e)*0.1)
551
-
552
- tknacc = 0
553
- sknacc = 0
554
- tallacc = 0
555
- sallacc = 0
556
- tknown = 0
557
- sknown = 0
558
-
559
- for i in range(10):
560
-
561
- t = TnT(N=1000, C=False)
562
- s = TnT(N=1000, C=False)
563
-
564
- dtest = d[(i*d10):((i+1)*d10)]
565
- etest = e[(i*e10):((i+1)*e10)]
566
-
567
- dtrain = d[:(i*d10)] + d[((i+1)*d10):]
568
- etrain = e[:(i*e10)] + e[((i+1)*e10):]
569
-
570
- t.train(dtrain)
571
- s.train(etrain)
572
-
573
- tacc = t.evaluate(dtest)
574
- tp_un = t.unknown / (t.known + t.unknown)
575
- tp_kn = t.known / (t.known + t.unknown)
576
- tknown += tp_kn
577
- t.unknown = 0
578
- t.known = 0
579
-
580
- sacc = s.evaluate(etest)
581
- sp_un = s.unknown / (s.known + s.unknown)
582
- sp_kn = s.known / (s.known + s.unknown)
583
- sknown += sp_kn
584
- s.unknown = 0
585
- s.known = 0
586
-
587
- tknacc += (tacc / tp_kn)
588
- sknacc += (sacc / tp_kn)
589
- tallacc += tacc
590
- sallacc += sacc
591
-
592
- #print i+1, (tacc / tp_kn), i+1, (sacc / tp_kn), i+1, tacc, i+1, sacc
593
-
594
-
595
- print("brown: acc over words known:", 10 * tknacc)
596
- print(" : overall accuracy:", 10 * tallacc)
597
- print(" : words known:", 10 * tknown)
598
- print("treebank: acc over words known:", 10 * sknacc)
599
- print(" : overall accuracy:", 10 * sallacc)
600
- print(" : words known:", 10 * sknown)
601
-
602
-
603
-
604
-
1
+ # Natural Language Toolkit: TnT Tagger
2
+ #
3
+ # Copyright (C) 2001-2018 NLTK Project
4
+ # Author: Sam Huston <sjh900@gmail.com>
5
+ #
6
+ # URL: <http://nltk.org/>
7
+ # For license information, see LICENSE.TXT
8
+
9
+ '''
10
+ Implementation of 'TnT - A Statisical Part of Speech Tagger'
11
+ by Thorsten Brants
12
+
13
+ http://acl.ldc.upenn.edu/A/A00/A00-1031.pdf
14
+ '''
15
+ from __future__ import print_function, division
16
+ from math import log
17
+
18
+ from operator import itemgetter
19
+
20
+ from nltk.probability import FreqDist, ConditionalFreqDist
21
+ from nltk.tag.api import TaggerI
22
+
23
+ class TnT(TaggerI):
24
+ '''
25
+ TnT - Statistical POS tagger
26
+
27
+ IMPORTANT NOTES:
28
+
29
+ * DOES NOT AUTOMATICALLY DEAL WITH UNSEEN WORDS
30
+
31
+ - It is possible to provide an untrained POS tagger to
32
+ create tags for unknown words, see __init__ function
33
+
34
+ * SHOULD BE USED WITH SENTENCE-DELIMITED INPUT
35
+
36
+ - Due to the nature of this tagger, it works best when
37
+ trained over sentence delimited input.
38
+ - However it still produces good results if the training
39
+ data and testing data are separated on all punctuation eg: [,.?!]
40
+ - Input for training is expected to be a list of sentences
41
+ where each sentence is a list of (word, tag) tuples
42
+ - Input for tag function is a single sentence
43
+ Input for tagdata function is a list of sentences
44
+ Output is of a similar form
45
+
46
+ * Function provided to process text that is unsegmented
47
+
48
+ - Please see basic_sent_chop()
49
+
50
+
51
+ TnT uses a second order Markov model to produce tags for
52
+ a sequence of input, specifically:
53
+
54
+ argmax [Proj(P(t_i|t_i-1,t_i-2)P(w_i|t_i))] P(t_T+1 | t_T)
55
+
56
+ IE: the maximum projection of a set of probabilities
57
+
58
+ The set of possible tags for a given word is derived
59
+ from the training data. It is the set of all tags
60
+ that exact word has been assigned.
61
+
62
+ To speed up and get more precision, we can use log addition
63
+ to instead multiplication, specifically:
64
+
65
+ argmax [Sigma(log(P(t_i|t_i-1,t_i-2))+log(P(w_i|t_i)))] +
66
+ log(P(t_T+1|t_T))
67
+
68
+ The probability of a tag for a given word is the linear
69
+ interpolation of 3 markov models; a zero-order, first-order,
70
+ and a second order model.
71
+
72
+ P(t_i| t_i-1, t_i-2) = l1*P(t_i) + l2*P(t_i| t_i-1) +
73
+ l3*P(t_i| t_i-1, t_i-2)
74
+
75
+ A beam search is used to limit the memory usage of the algorithm.
76
+ The degree of the beam can be changed using N in the initialization.
77
+ N represents the maximum number of possible solutions to maintain
78
+ while tagging.
79
+
80
+ It is possible to differentiate the tags which are assigned to
81
+ capitalized words. However this does not result in a significant
82
+ gain in the accuracy of the results.
83
+ '''
84
+
85
+ def __init__(self, unk=None, Trained=False, N=1000, C=False):
86
+ '''
87
+ Construct a TnT statistical tagger. Tagger must be trained
88
+ before being used to tag input.
89
+
90
+ :param unk: instance of a POS tagger, conforms to TaggerI
91
+ :type unk:(TaggerI)
92
+ :param Trained: Indication that the POS tagger is trained or not
93
+ :type Trained: boolean
94
+ :param N: Beam search degree (see above)
95
+ :type N:(int)
96
+ :param C: Capitalization flag
97
+ :type C: boolean
98
+
99
+ Initializer, creates frequency distributions to be used
100
+ for tagging
101
+
102
+ _lx values represent the portion of the tri/bi/uni taggers
103
+ to be used to calculate the probability
104
+
105
+ N value is the number of possible solutions to maintain
106
+ while tagging. A good value for this is 1000
107
+
108
+ C is a boolean value which specifies to use or
109
+ not use the Capitalization of the word as additional
110
+ information for tagging.
111
+ NOTE: using capitalization may not increase the accuracy
112
+ of the tagger
113
+ '''
114
+
115
+ self._uni = FreqDist()
116
+ self._bi = ConditionalFreqDist()
117
+ self._tri = ConditionalFreqDist()
118
+ self._wd = ConditionalFreqDist()
119
+ self._eos = ConditionalFreqDist()
120
+ self._l1 = 0.0
121
+ self._l2 = 0.0
122
+ self._l3 = 0.0
123
+ self._N = N
124
+ self._C = C
125
+ self._T = Trained
126
+
127
+ self._unk = unk
128
+
129
+ # statistical tools (ignore or delete me)
130
+ self.unknown = 0
131
+ self.known = 0
132
+
133
+ def train(self, data):
134
+ '''
135
+ Uses a set of tagged data to train the tagger.
136
+ If an unknown word tagger is specified,
137
+ it is trained on the same data.
138
+
139
+ :param data: List of lists of (word, tag) tuples
140
+ :type data: tuple(str)
141
+ '''
142
+
143
+ # Ensure that local C flag is initialized before use
144
+ C = False
145
+
146
+ if self._unk is not None and self._T == False:
147
+ self._unk.train(data)
148
+
149
+ for sent in data:
150
+ history = [('BOS',False), ('BOS',False)]
151
+ for w, t in sent:
152
+
153
+ # if capitalization is requested,
154
+ # and the word begins with a capital
155
+ # set local flag C to True
156
+ if self._C and w[0].isupper(): C=True
157
+
158
+ self._wd[w][t] += 1
159
+ self._uni[(t,C)] += 1
160
+ self._bi[history[1]][(t,C)] += 1
161
+ self._tri[tuple(history)][(t,C)] += 1
162
+
163
+ history.append((t,C))
164
+ history.pop(0)
165
+
166
+ # set local flag C to false for the next word
167
+ C = False
168
+
169
+ self._eos[t]['EOS'] += 1
170
+
171
+
172
+ # compute lambda values from the trained frequency distributions
173
+ self._compute_lambda()
174
+
175
+ #(debugging -- ignore or delete me)
176
+ #print "lambdas"
177
+ #print i, self._l1, i, self._l2, i, self._l3
178
+
179
+
180
+ def _compute_lambda(self):
181
+ '''
182
+ creates lambda values based upon training data
183
+
184
+ NOTE: no need to explicitly reference C,
185
+ it is contained within the tag variable :: tag == (tag,C)
186
+
187
+ for each tag trigram (t1, t2, t3)
188
+ depending on the maximum value of
189
+ - f(t1,t2,t3)-1 / f(t1,t2)-1
190
+ - f(t2,t3)-1 / f(t2)-1
191
+ - f(t3)-1 / N-1
192
+
193
+ increment l3,l2, or l1 by f(t1,t2,t3)
194
+
195
+ ISSUES -- Resolutions:
196
+ if 2 values are equal, increment both lambda values
197
+ by (f(t1,t2,t3) / 2)
198
+ '''
199
+
200
+ # temporary lambda variables
201
+ tl1 = 0.0
202
+ tl2 = 0.0
203
+ tl3 = 0.0
204
+
205
+ # for each t1,t2 in system
206
+ for history in self._tri.conditions():
207
+ (h1, h2) = history
208
+
209
+ # for each t3 given t1,t2 in system
210
+ # (NOTE: tag actually represents (tag,C))
211
+ # However no effect within this function
212
+ for tag in self._tri[history].keys():
213
+
214
+ # if there has only been 1 occurrence of this tag in the data
215
+ # then ignore this trigram.
216
+ if self._uni[tag] == 1:
217
+ continue
218
+
219
+ # safe_div provides a safe floating point division
220
+ # it returns -1 if the denominator is 0
221
+ c3 = self._safe_div((self._tri[history][tag]-1), (self._tri[history].N()-1))
222
+ c2 = self._safe_div((self._bi[h2][tag]-1), (self._bi[h2].N()-1))
223
+ c1 = self._safe_div((self._uni[tag]-1), (self._uni.N()-1))
224
+
225
+
226
+ # if c1 is the maximum value:
227
+ if (c1 > c3) and (c1 > c2):
228
+ tl1 += self._tri[history][tag]
229
+
230
+ # if c2 is the maximum value
231
+ elif (c2 > c3) and (c2 > c1):
232
+ tl2 += self._tri[history][tag]
233
+
234
+ # if c3 is the maximum value
235
+ elif (c3 > c2) and (c3 > c1):
236
+ tl3 += self._tri[history][tag]
237
+
238
+ # if c3, and c2 are equal and larger than c1
239
+ elif (c3 == c2) and (c3 > c1):
240
+ tl2 += self._tri[history][tag] / 2.0
241
+ tl3 += self._tri[history][tag] / 2.0
242
+
243
+ # if c1, and c2 are equal and larger than c3
244
+ # this might be a dumb thing to do....(not sure yet)
245
+ elif (c2 == c1) and (c1 > c3):
246
+ tl1 += self._tri[history][tag] / 2.0
247
+ tl2 += self._tri[history][tag] / 2.0
248
+
249
+ # otherwise there might be a problem
250
+ # eg: all values = 0
251
+ else:
252
+ #print "Problem", c1, c2 ,c3
253
+ pass
254
+
255
+ # Lambda normalisation:
256
+ # ensures that l1+l2+l3 = 1
257
+ self._l1 = tl1 / (tl1+tl2+tl3)
258
+ self._l2 = tl2 / (tl1+tl2+tl3)
259
+ self._l3 = tl3 / (tl1+tl2+tl3)
260
+
261
+
262
+
263
+ def _safe_div(self, v1, v2):
264
+ '''
265
+ Safe floating point division function, does not allow division by 0
266
+ returns -1 if the denominator is 0
267
+ '''
268
+ if v2 == 0:
269
+ return -1
270
+ else:
271
+ return v1 / v2
272
+
273
+ def tagdata(self, data):
274
+ '''
275
+ Tags each sentence in a list of sentences
276
+
277
+ :param data:list of list of words
278
+ :type data: [[string,],]
279
+ :return: list of list of (word, tag) tuples
280
+
281
+ Invokes tag(sent) function for each sentence
282
+ compiles the results into a list of tagged sentences
283
+ each tagged sentence is a list of (word, tag) tuples
284
+ '''
285
+ res = []
286
+ for sent in data:
287
+ res1 = self.tag(sent)
288
+ res.append(res1)
289
+ return res
290
+
291
+
292
+ def tag(self, data):
293
+ '''
294
+ Tags a single sentence
295
+
296
+ :param data: list of words
297
+ :type data: [string,]
298
+
299
+ :return: [(word, tag),]
300
+
301
+ Calls recursive function '_tagword'
302
+ to produce a list of tags
303
+
304
+ Associates the sequence of returned tags
305
+ with the correct words in the input sequence
306
+
307
+ returns a list of (word, tag) tuples
308
+ '''
309
+
310
+ current_state = [(['BOS', 'BOS'], 0.0)]
311
+
312
+ sent = list(data)
313
+
314
+ tags = self._tagword(sent, current_state)
315
+
316
+ res = []
317
+ for i in range(len(sent)):
318
+ # unpack and discard the C flags
319
+ (t,C) = tags[i+2]
320
+ res.append((sent[i], t))
321
+
322
+ return res
323
+
324
+
325
+ def _tagword(self, sent, current_states):
326
+ '''
327
+ :param sent : List of words remaining in the sentence
328
+ :type sent : [word,]
329
+ :param current_states : List of possible tag combinations for
330
+ the sentence so far, and the log probability
331
+ associated with each tag combination
332
+ :type current_states : [([tag, ], logprob), ]
333
+
334
+ Tags the first word in the sentence and
335
+ recursively tags the reminder of sentence
336
+
337
+ Uses formula specified above to calculate the probability
338
+ of a particular tag
339
+ '''
340
+
341
+ # if this word marks the end of the sentance,
342
+ # return the most probable tag
343
+ if sent == []:
344
+ (h, logp) = current_states[0]
345
+ return h
346
+
347
+ # otherwise there are more words to be tagged
348
+ word = sent[0]
349
+ sent = sent[1:]
350
+ new_states = []
351
+
352
+ # if the Capitalisation is requested,
353
+ # initalise the flag for this word
354
+ C = False
355
+ if self._C and word[0].isupper(): C=True
356
+
357
+ # if word is known
358
+ # compute the set of possible tags
359
+ # and their associated log probabilities
360
+ if word in self._wd:
361
+ self.known += 1
362
+
363
+ for (history, curr_sent_logprob) in current_states:
364
+ logprobs = []
365
+
366
+ for t in self._wd[word].keys():
367
+ tC = (t,C)
368
+ p_uni = self._uni.freq(tC)
369
+ p_bi = self._bi[history[-1]].freq(tC)
370
+ p_tri = self._tri[tuple(history[-2:])].freq(tC)
371
+ p_wd = self._wd[word][t] / self._uni[tC]
372
+ p = self._l1 *p_uni + self._l2 *p_bi + self._l3 *p_tri
373
+ p2 = log(p, 2) + log(p_wd, 2)
374
+
375
+ # compute the result of appending each tag to this history
376
+ new_states.append((history + [tC],
377
+ curr_sent_logprob + p2))
378
+
379
+ # otherwise a new word, set of possible tags is unknown
380
+ else:
381
+ self.unknown += 1
382
+
383
+ # since a set of possible tags,
384
+ # and the probability of each specific tag
385
+ # can not be returned from most classifiers:
386
+ # specify that any unknown words are tagged with certainty
387
+ p = 1
388
+
389
+ # if no unknown word tagger has been specified
390
+ # then use the tag 'Unk'
391
+ if self._unk is None:
392
+ tag = ('Unk',C)
393
+
394
+ # otherwise apply the unknown word tagger
395
+ else:
396
+ [(_w, t)] = list(self._unk.tag([word]))
397
+ tag = (t,C)
398
+
399
+ for (history, logprob) in current_states:
400
+ history.append(tag)
401
+
402
+ new_states = current_states
403
+
404
+ # now have computed a set of possible new_states
405
+
406
+ # sort states by log prob
407
+ # set is now ordered greatest to least log probability
408
+ new_states.sort(reverse=True, key=itemgetter(1))
409
+
410
+ # del everything after N (threshold)
411
+ # this is the beam search cut
412
+ if len(new_states) > self._N:
413
+ new_states = new_states[:self._N]
414
+
415
+ # compute the tags for the rest of the sentence
416
+ # return the best list of tags for the sentence
417
+ return self._tagword(sent, new_states)
418
+
419
+
420
+ ########################################
421
+ # helper function -- basic sentence tokenizer
422
+ ########################################
423
+
424
+ def basic_sent_chop(data, raw=True):
425
+ '''
426
+ Basic method for tokenizing input into sentences
427
+ for this tagger:
428
+
429
+ :param data: list of tokens (words or (word, tag) tuples)
430
+ :type data: str or tuple(str, str)
431
+ :param raw: boolean flag marking the input data
432
+ as a list of words or a list of tagged words
433
+ :type raw: bool
434
+ :return: list of sentences
435
+ sentences are a list of tokens
436
+ tokens are the same as the input
437
+
438
+ Function takes a list of tokens and separates the tokens into lists
439
+ where each list represents a sentence fragment
440
+ This function can separate both tagged and raw sequences into
441
+ basic sentences.
442
+
443
+ Sentence markers are the set of [,.!?]
444
+
445
+ This is a simple method which enhances the performance of the TnT
446
+ tagger. Better sentence tokenization will further enhance the results.
447
+ '''
448
+
449
+ new_data = []
450
+ curr_sent = []
451
+ sent_mark = [',','.','?','!']
452
+
453
+
454
+ if raw:
455
+ for word in data:
456
+ if word in sent_mark:
457
+ curr_sent.append(word)
458
+ new_data.append(curr_sent)
459
+ curr_sent = []
460
+ else:
461
+ curr_sent.append(word)
462
+
463
+ else:
464
+ for (word,tag) in data:
465
+ if word in sent_mark:
466
+ curr_sent.append((word,tag))
467
+ new_data.append(curr_sent)
468
+ curr_sent = []
469
+ else:
470
+ curr_sent.append((word,tag))
471
+ return new_data
472
+
473
+
474
+
475
+ def demo():
476
+ from nltk.corpus import brown
477
+ sents = list(brown.tagged_sents())
478
+ test = list(brown.sents())
479
+
480
+ # create and train the tagger
481
+ tagger = TnT()
482
+ tagger.train(sents[200:1000])
483
+
484
+ # tag some data
485
+ tagged_data = tagger.tagdata(test[100:120])
486
+
487
+ # print results
488
+ for j in range(len(tagged_data)):
489
+ s = tagged_data[j]
490
+ t = sents[j+100]
491
+ for i in range(len(s)):
492
+ print(s[i],'--', t[i])
493
+ print()
494
+
495
+
496
+ def demo2():
497
+ from nltk.corpus import treebank
498
+
499
+ d = list(treebank.tagged_sents())
500
+
501
+ t = TnT(N=1000, C=False)
502
+ s = TnT(N=1000, C=True)
503
+ t.train(d[(11)*100:])
504
+ s.train(d[(11)*100:])
505
+
506
+ for i in range(10):
507
+ tacc = t.evaluate(d[i*100:((i+1)*100)])
508
+ tp_un = t.unknown / (t.known + t.unknown)
509
+ tp_kn = t.known / (t.known + t.unknown)
510
+ t.unknown = 0
511
+ t.known = 0
512
+
513
+ print('Capitalization off:')
514
+ print('Accuracy:', tacc)
515
+ print('Percentage known:', tp_kn)
516
+ print('Percentage unknown:', tp_un)
517
+ print('Accuracy over known words:', (tacc / tp_kn))
518
+
519
+ sacc = s.evaluate(d[i*100:((i+1)*100)])
520
+ sp_un = s.unknown / (s.known + s.unknown)
521
+ sp_kn = s.known / (s.known + s.unknown)
522
+ s.unknown = 0
523
+ s.known = 0
524
+
525
+ print('Capitalization on:')
526
+ print('Accuracy:', sacc)
527
+ print('Percentage known:', sp_kn)
528
+ print('Percentage unknown:', sp_un)
529
+ print('Accuracy over known words:', (sacc / sp_kn))
530
+
531
+ def demo3():
532
+ from nltk.corpus import treebank, brown
533
+
534
+ d = list(treebank.tagged_sents())
535
+ e = list(brown.tagged_sents())
536
+
537
+ d = d[:1000]
538
+ e = e[:1000]
539
+
540
+ d10 = int(len(d)*0.1)
541
+ e10 = int(len(e)*0.1)
542
+
543
+ tknacc = 0
544
+ sknacc = 0
545
+ tallacc = 0
546
+ sallacc = 0
547
+ tknown = 0
548
+ sknown = 0
549
+
550
+ for i in range(10):
551
+
552
+ t = TnT(N=1000, C=False)
553
+ s = TnT(N=1000, C=False)
554
+
555
+ dtest = d[(i*d10):((i+1)*d10)]
556
+ etest = e[(i*e10):((i+1)*e10)]
557
+
558
+ dtrain = d[:(i*d10)] + d[((i+1)*d10):]
559
+ etrain = e[:(i*e10)] + e[((i+1)*e10):]
560
+
561
+ t.train(dtrain)
562
+ s.train(etrain)
563
+
564
+ tacc = t.evaluate(dtest)
565
+ tp_un = t.unknown / (t.known + t.unknown)
566
+ tp_kn = t.known / (t.known + t.unknown)
567
+ tknown += tp_kn
568
+ t.unknown = 0
569
+ t.known = 0
570
+
571
+ sacc = s.evaluate(etest)
572
+ sp_un = s.unknown / (s.known + s.unknown)
573
+ sp_kn = s.known / (s.known + s.unknown)
574
+ sknown += sp_kn
575
+ s.unknown = 0
576
+ s.known = 0
577
+
578
+ tknacc += (tacc / tp_kn)
579
+ sknacc += (sacc / tp_kn)
580
+ tallacc += tacc
581
+ sallacc += sacc
582
+
583
+ #print i+1, (tacc / tp_kn), i+1, (sacc / tp_kn), i+1, tacc, i+1, sacc
584
+
585
+
586
+ print("brown: acc over words known:", 10 * tknacc)
587
+ print(" : overall accuracy:", 10 * tallacc)
588
+ print(" : words known:", 10 * tknown)
589
+ print("treebank: acc over words known:", 10 * sknacc)
590
+ print(" : overall accuracy:", 10 * sallacc)
591
+ print(" : words known:", 10 * sknown)
592
+
593
+
594
+
595
+