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.
- {nltk-3.2 → nltk-3.3}/INSTALL.txt +6 -6
- {nltk-3.2 → nltk-3.3}/LICENSE.txt +13 -13
- {nltk-3.2 → nltk-3.3}/MANIFEST.in +6 -6
- {nltk-3.2/nltk.egg-info → nltk-3.3}/PKG-INFO +13 -5
- nltk-3.2/README.txt → nltk-3.3/README.md +49 -48
- nltk-3.3/nltk/VERSION +1 -0
- {nltk-3.2 → nltk-3.3}/nltk/__init__.py +185 -185
- {nltk-3.2 → nltk-3.3}/nltk/app/__init__.py +52 -53
- {nltk-3.2 → nltk-3.3}/nltk/app/chartparser_app.py +2276 -2276
- {nltk-3.2 → nltk-3.3}/nltk/app/chunkparser_app.py +1262 -1264
- {nltk-3.2 → nltk-3.3}/nltk/app/collocations_app.py +347 -350
- {nltk-3.2 → nltk-3.3}/nltk/app/concordance_app.py +568 -570
- {nltk-3.2 → nltk-3.3}/nltk/app/nemo_app.py +156 -155
- {nltk-3.2 → nltk-3.3}/nltk/app/rdparser_app.py +892 -894
- {nltk-3.2 → nltk-3.3}/nltk/app/srparser_app.py +809 -809
- {nltk-3.2 → nltk-3.3}/nltk/app/wordfreq_app.py +32 -32
- {nltk-3.2 → nltk-3.3}/nltk/app/wordnet_app.py +968 -968
- {nltk-3.2 → nltk-3.3}/nltk/book.py +91 -90
- {nltk-3.2 → nltk-3.3}/nltk/ccg/__init__.py +22 -22
- {nltk-3.2 → nltk-3.3}/nltk/ccg/api.py +359 -335
- {nltk-3.2 → nltk-3.3}/nltk/ccg/chart.py +394 -361
- {nltk-3.2 → nltk-3.3}/nltk/ccg/combinator.py +343 -312
- {nltk-3.2 → nltk-3.3}/nltk/ccg/lexicon.py +328 -290
- nltk-3.3/nltk/ccg/logic.py +46 -0
- {nltk-3.2 → nltk-3.3}/nltk/chat/__init__.py +49 -49
- {nltk-3.2 → nltk-3.3}/nltk/chat/eliza.py +244 -244
- {nltk-3.2 → nltk-3.3}/nltk/chat/iesha.py +140 -140
- {nltk-3.2 → nltk-3.3}/nltk/chat/rude.py +92 -92
- {nltk-3.2 → nltk-3.3}/nltk/chat/suntsu.py +117 -117
- {nltk-3.2 → nltk-3.3}/nltk/chat/util.py +122 -120
- {nltk-3.2 → nltk-3.3}/nltk/chat/zen.py +282 -282
- {nltk-3.2 → nltk-3.3}/nltk/chunk/__init__.py +190 -190
- {nltk-3.2 → nltk-3.3}/nltk/chunk/api.py +51 -51
- {nltk-3.2 → nltk-3.3}/nltk/chunk/named_entity.py +331 -331
- {nltk-3.2 → nltk-3.3}/nltk/chunk/regexp.py +1390 -1384
- {nltk-3.2 → nltk-3.3}/nltk/chunk/util.py +600 -600
- {nltk-3.2 → nltk-3.3}/nltk/classify/__init__.py +98 -98
- {nltk-3.2 → nltk-3.3}/nltk/classify/api.py +193 -193
- {nltk-3.2 → nltk-3.3}/nltk/classify/decisiontree.py +295 -295
- {nltk-3.2 → nltk-3.3}/nltk/classify/maxent.py +1510 -1492
- {nltk-3.2 → nltk-3.3}/nltk/classify/megam.py +179 -178
- {nltk-3.2 → nltk-3.3}/nltk/classify/naivebayes.py +245 -242
- {nltk-3.2 → nltk-3.3}/nltk/classify/positivenaivebayes.py +170 -170
- {nltk-3.2 → nltk-3.3}/nltk/classify/rte_classify.py +160 -191
- {nltk-3.2 → nltk-3.3}/nltk/classify/scikitlearn.py +153 -151
- {nltk-3.2 → nltk-3.3}/nltk/classify/senna.py +183 -181
- {nltk-3.2 → nltk-3.3}/nltk/classify/svm.py +15 -15
- {nltk-3.2 → nltk-3.3}/nltk/classify/tadm.py +113 -112
- {nltk-3.2 → nltk-3.3}/nltk/classify/textcat.py +193 -193
- {nltk-3.2 → nltk-3.3}/nltk/classify/util.py +324 -312
- {nltk-3.2 → nltk-3.3}/nltk/classify/weka.py +346 -345
- {nltk-3.2 → nltk-3.3}/nltk/cluster/__init__.py +86 -86
- {nltk-3.2 → nltk-3.3}/nltk/cluster/api.py +74 -70
- {nltk-3.2 → nltk-3.3}/nltk/cluster/em.py +247 -247
- {nltk-3.2 → nltk-3.3}/nltk/cluster/gaac.py +168 -168
- {nltk-3.2 → nltk-3.3}/nltk/cluster/kmeans.py +221 -221
- {nltk-3.2 → nltk-3.3}/nltk/cluster/util.py +304 -289
- nltk-3.3/nltk/collections.py +640 -0
- {nltk-3.2 → nltk-3.3}/nltk/collocations.py +388 -388
- nltk-3.3/nltk/compat.py +365 -0
- {nltk-3.2 → nltk-3.3}/nltk/corpus/__init__.py +341 -320
- {nltk-3.2 → nltk-3.3}/nltk/corpus/europarl_raw.py +44 -44
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/__init__.py +147 -145
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/aligned.py +115 -114
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/api.py +448 -446
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/bnc.py +252 -252
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/bracket_parse.py +227 -227
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/categorized_sents.py +179 -178
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/chasen.py +140 -139
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/childes.py +522 -494
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/chunked.py +212 -212
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/cmudict.py +97 -95
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/comparative_sents.py +280 -278
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/conll.py +528 -521
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/crubadan.py +116 -116
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/dependency.py +101 -101
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/framenet.py +3059 -2093
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/ieer.py +112 -111
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/indian.py +85 -86
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/ipipan.py +332 -331
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/knbc.py +187 -187
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/lin.py +156 -156
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/mte.py +311 -310
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/nkjp.py +429 -428
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/nombank.py +421 -421
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/nps_chat.py +73 -73
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/opinion_lexicon.py +115 -115
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/panlex_lite.py +165 -165
- nltk-3.3/nltk/corpus/reader/pl196x.py +292 -0
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/plaintext.py +232 -233
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/ppattach.py +96 -95
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/propbank.py +479 -481
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/pros_cons.py +128 -126
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/reviews.py +330 -328
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/rte.py +144 -146
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/semcor.py +256 -256
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/senseval.py +203 -201
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/sentiwordnet.py +137 -137
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/sinica_treebank.py +75 -75
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/string_category.py +60 -59
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/switchboard.py +119 -119
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/tagged.py +295 -294
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/timit.py +452 -450
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/toolbox.py +68 -68
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/twitter.py +155 -157
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/udhr.py +80 -80
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/util.py +804 -800
- nltk-3.3/nltk/corpus/reader/verbnet.py +595 -0
- nltk-3.3/nltk/corpus/reader/wordlist.py +134 -0
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/wordnet.py +2108 -2036
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/xmldocs.py +392 -387
- {nltk-3.2 → nltk-3.3}/nltk/corpus/reader/ycoe.py +243 -242
- {nltk-3.2 → nltk-3.3}/nltk/corpus/util.py +144 -127
- {nltk-3.2 → nltk-3.3}/nltk/data.py +1487 -1451
- {nltk-3.2 → nltk-3.3}/nltk/decorators.py +219 -215
- {nltk-3.2 → nltk-3.3}/nltk/downloader.py +2278 -2274
- {nltk-3.2 → nltk-3.3}/nltk/draw/__init__.py +27 -27
- {nltk-3.2 → nltk-3.3}/nltk/draw/cfg.py +774 -777
- {nltk-3.2 → nltk-3.3}/nltk/draw/dispersion.py +58 -58
- {nltk-3.2 → nltk-3.3}/nltk/draw/table.py +1098 -1098
- {nltk-3.2 → nltk-3.3}/nltk/draw/tree.py +963 -966
- {nltk-3.2 → nltk-3.3}/nltk/draw/util.py +2356 -2356
- {nltk-3.2 → nltk-3.3}/nltk/featstruct.py +2617 -2500
- {nltk-3.2 → nltk-3.3}/nltk/grammar.py +1559 -1516
- {nltk-3.2 → nltk-3.3}/nltk/help.py +56 -56
- {nltk-3.2 → nltk-3.3}/nltk/inference/__init__.py +20 -20
- {nltk-3.2 → nltk-3.3}/nltk/inference/api.py +597 -589
- {nltk-3.2 → nltk-3.3}/nltk/inference/discourse.py +612 -608
- {nltk-3.2 → nltk-3.3}/nltk/inference/mace.py +311 -311
- {nltk-3.2 → nltk-3.3}/nltk/inference/nonmonotonic.py +509 -509
- {nltk-3.2 → nltk-3.3}/nltk/inference/prover9.py +431 -431
- {nltk-3.2 → nltk-3.3}/nltk/inference/resolution.py +687 -687
- {nltk-3.2 → nltk-3.3}/nltk/inference/tableau.py +607 -607
- {nltk-3.2 → nltk-3.3}/nltk/internals.py +982 -982
- {nltk-3.2 → nltk-3.3}/nltk/jsontags.py +63 -63
- {nltk-3.2 → nltk-3.3}/nltk/lazyimport.py +142 -142
- {nltk-3.2 → nltk-3.3}/nltk/metrics/__init__.py +30 -29
- {nltk-3.2 → nltk-3.3}/nltk/metrics/agreement.py +421 -401
- nltk-3.3/nltk/metrics/aline.py +607 -0
- {nltk-3.2 → nltk-3.3}/nltk/metrics/association.py +414 -410
- {nltk-3.2 → nltk-3.3}/nltk/metrics/confusionmatrix.py +206 -206
- {nltk-3.2 → nltk-3.3}/nltk/metrics/distance.py +207 -202
- {nltk-3.2 → nltk-3.3}/nltk/metrics/paice.py +381 -381
- {nltk-3.2 → nltk-3.3}/nltk/metrics/scores.py +228 -228
- {nltk-3.2 → nltk-3.3}/nltk/metrics/segmentation.py +231 -232
- {nltk-3.2 → nltk-3.3}/nltk/metrics/spearman.py +69 -69
- {nltk-3.2 → nltk-3.3}/nltk/misc/__init__.py +11 -11
- {nltk-3.2 → nltk-3.3}/nltk/misc/babelfish.py +10 -10
- {nltk-3.2 → nltk-3.3}/nltk/misc/chomsky.py +135 -133
- {nltk-3.2 → nltk-3.3}/nltk/misc/minimalset.py +83 -83
- {nltk-3.2 → nltk-3.3}/nltk/misc/sort.py +157 -157
- {nltk-3.2 → nltk-3.3}/nltk/misc/wordfinder.py +129 -129
- {nltk-3.2 → nltk-3.3}/nltk/parse/__init__.py +81 -80
- {nltk-3.2 → nltk-3.3}/nltk/parse/api.py +66 -66
- {nltk-3.2 → nltk-3.3}/nltk/parse/bllip.py +282 -282
- {nltk-3.2 → nltk-3.3}/nltk/parse/chart.py +1682 -1681
- nltk-3.3/nltk/parse/corenlp.py +780 -0
- {nltk-3.2 → nltk-3.3}/nltk/parse/dependencygraph.py +760 -758
- {nltk-3.2 → nltk-3.3}/nltk/parse/earleychart.py +452 -451
- {nltk-3.2 → nltk-3.3}/nltk/parse/evaluate.py +129 -129
- {nltk-3.2 → nltk-3.3}/nltk/parse/featurechart.py +580 -578
- {nltk-3.2 → nltk-3.3}/nltk/parse/generate.py +87 -76
- {nltk-3.2 → nltk-3.3}/nltk/parse/malt.py +356 -356
- {nltk-3.2 → nltk-3.3}/nltk/parse/nonprojectivedependencyparser.py +783 -783
- {nltk-3.2 → nltk-3.3}/nltk/parse/pchart.py +522 -522
- {nltk-3.2 → nltk-3.3}/nltk/parse/projectivedependencyparser.py +579 -578
- {nltk-3.2 → nltk-3.3}/nltk/parse/recursivedescent.py +655 -656
- {nltk-3.2 → nltk-3.3}/nltk/parse/shiftreduce.py +458 -459
- {nltk-3.2 → nltk-3.3}/nltk/parse/stanford.py +431 -406
- {nltk-3.2 → nltk-3.3}/nltk/parse/transitionparser.py +774 -772
- {nltk-3.2 → nltk-3.3}/nltk/parse/util.py +231 -231
- {nltk-3.2 → nltk-3.3}/nltk/parse/viterbi.py +401 -401
- {nltk-3.2 → nltk-3.3}/nltk/probability.py +2410 -2355
- {nltk-3.2 → nltk-3.3}/nltk/sem/__init__.py +61 -61
- {nltk-3.2 → nltk-3.3}/nltk/sem/boxer.py +1261 -1261
- {nltk-3.2 → nltk-3.3}/nltk/sem/chat80.py +782 -782
- {nltk-3.2 → nltk-3.3}/nltk/sem/cooper_storage.py +118 -118
- {nltk-3.2 → nltk-3.3}/nltk/sem/drt.py +1258 -1257
- {nltk-3.2 → nltk-3.3}/nltk/sem/drt_glue_demo.py +485 -489
- {nltk-3.2 → nltk-3.3}/nltk/sem/evaluate.py +790 -784
- {nltk-3.2 → nltk-3.3}/nltk/sem/glue.py +696 -694
- {nltk-3.2 → nltk-3.3}/nltk/sem/hole.py +386 -384
- {nltk-3.2 → nltk-3.3}/nltk/sem/lfg.py +210 -208
- {nltk-3.2 → nltk-3.3}/nltk/sem/linearlogic.py +451 -449
- {nltk-3.2 → nltk-3.3}/nltk/sem/logic.py +1910 -1910
- {nltk-3.2 → nltk-3.3}/nltk/sem/relextract.py +476 -483
- {nltk-3.2 → nltk-3.3}/nltk/sem/skolemize.py +101 -101
- {nltk-3.2 → nltk-3.3}/nltk/sem/util.py +249 -249
- {nltk-3.2 → nltk-3.3}/nltk/sentiment/__init__.py +14 -14
- {nltk-3.2 → nltk-3.3}/nltk/sentiment/sentiment_analyzer.py +229 -229
- {nltk-3.2 → nltk-3.3}/nltk/sentiment/util.py +762 -752
- {nltk-3.2 → nltk-3.3}/nltk/sentiment/vader.py +443 -445
- {nltk-3.2 → nltk-3.3}/nltk/stem/__init__.py +31 -33
- {nltk-3.2 → nltk-3.3}/nltk/stem/api.py +28 -25
- nltk-3.3/nltk/stem/arlstem.py +369 -0
- {nltk-3.2 → nltk-3.3}/nltk/stem/isri.py +345 -345
- {nltk-3.2 → nltk-3.3}/nltk/stem/lancaster.py +337 -310
- nltk-3.3/nltk/stem/porter.py +710 -0
- {nltk-3.2 → nltk-3.3}/nltk/stem/regexp.py +61 -61
- {nltk-3.2 → nltk-3.3}/nltk/stem/rslp.py +142 -142
- {nltk-3.2 → nltk-3.3}/nltk/stem/snowball.py +4236 -3712
- {nltk-3.2 → nltk-3.3}/nltk/stem/util.py +22 -12
- {nltk-3.2 → nltk-3.3}/nltk/stem/wordnet.py +51 -51
- {nltk-3.2 → nltk-3.3}/nltk/tag/__init__.py +152 -127
- {nltk-3.2 → nltk-3.3}/nltk/tag/api.py +86 -81
- {nltk-3.2 → nltk-3.3}/nltk/tag/brill.py +424 -426
- {nltk-3.2 → nltk-3.3}/nltk/tag/brill_trainer.py +608 -608
- {nltk-3.2 → nltk-3.3}/nltk/tag/crf.py +204 -200
- {nltk-3.2 → nltk-3.3}/nltk/tag/hmm.py +1277 -1277
- {nltk-3.2 → nltk-3.3}/nltk/tag/hunpos.py +132 -132
- {nltk-3.2 → nltk-3.3}/nltk/tag/mapping.py +101 -101
- {nltk-3.2 → nltk-3.3}/nltk/tag/perceptron.py +329 -314
- {nltk-3.2 → nltk-3.3}/nltk/tag/senna.py +147 -145
- {nltk-3.2 → nltk-3.3}/nltk/tag/sequential.py +740 -736
- {nltk-3.2 → nltk-3.3}/nltk/tag/stanford.py +219 -196
- {nltk-3.2 → nltk-3.3}/nltk/tag/tnt.py +595 -604
- {nltk-3.2 → nltk-3.3}/nltk/tag/util.py +72 -72
- {nltk-3.2 → nltk-3.3}/nltk/tbl/__init__.py +28 -28
- {nltk-3.2 → nltk-3.3}/nltk/tbl/api.py +1 -1
- {nltk-3.2 → nltk-3.3}/nltk/tbl/demo.py +366 -366
- {nltk-3.2 → nltk-3.3}/nltk/tbl/erroranalysis.py +39 -39
- {nltk-3.2 → nltk-3.3}/nltk/tbl/feature.py +259 -261
- {nltk-3.2 → nltk-3.3}/nltk/tbl/rule.py +321 -321
- {nltk-3.2 → nltk-3.3}/nltk/tbl/template.py +303 -308
- {nltk-3.2 → nltk-3.3}/nltk/test/__init__.py +18 -18
- {nltk-3.2 → nltk-3.3}/nltk/test/all.py +24 -23
- {nltk-3.2 → nltk-3.3}/nltk/test/bleu.doctest +14 -14
- {nltk-3.2 → nltk-3.3}/nltk/test/bnc.doctest +60 -60
- {nltk-3.2 → nltk-3.3}/nltk/test/ccg.doctest +376 -395
- nltk-3.3/nltk/test/ccg_semantics.doctest +553 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/chat80.doctest +234 -234
- {nltk-3.2 → nltk-3.3}/nltk/test/childes.doctest +184 -184
- {nltk-3.2 → nltk-3.3}/nltk/test/childes_fixt.py +14 -13
- {nltk-3.2 → nltk-3.3}/nltk/test/chunk.doctest +373 -373
- {nltk-3.2 → nltk-3.3}/nltk/test/classify.doctest +185 -185
- {nltk-3.2 → nltk-3.3}/nltk/test/classify_fixt.py +11 -10
- nltk-3.3/nltk/test/collections.doctest +20 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/collocations.doctest +276 -276
- {nltk-3.2 → nltk-3.3}/nltk/test/compat.doctest +134 -138
- {nltk-3.2 → nltk-3.3}/nltk/test/compat_fixt.py +9 -8
- nltk-3.3/nltk/test/concordance.doctest +55 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/corpus.doctest +2200 -2212
- {nltk-3.2 → nltk-3.3}/nltk/test/corpus_fixt.py +3 -3
- {nltk-3.2 → nltk-3.3}/nltk/test/crubadan.doctest +65 -65
- {nltk-3.2 → nltk-3.3}/nltk/test/data.doctest +379 -379
- {nltk-3.2 → nltk-3.3}/nltk/test/dependency.doctest +241 -241
- {nltk-3.2 → nltk-3.3}/nltk/test/discourse.doctest +546 -546
- {nltk-3.2 → nltk-3.3}/nltk/test/discourse_fixt.py +14 -13
- {nltk-3.2 → nltk-3.3}/nltk/test/doctest_nose_plugin.py +159 -156
- {nltk-3.2 → nltk-3.3}/nltk/test/drt.doctest +517 -517
- {nltk-3.2 → nltk-3.3}/nltk/test/featgram.doctest +607 -607
- {nltk-3.2 → nltk-3.3}/nltk/test/featstruct.doctest +1229 -1230
- {nltk-3.2 → nltk-3.3}/nltk/test/framenet.doctest +288 -239
- {nltk-3.2 → nltk-3.3}/nltk/test/generate.doctest +67 -67
- {nltk-3.2 → nltk-3.3}/nltk/test/gensim.doctest +140 -141
- {nltk-3.2 → nltk-3.3}/nltk/test/gensim_fixt.py +10 -9
- {nltk-3.2 → nltk-3.3}/nltk/test/gluesemantics.doctest +384 -386
- {nltk-3.2 → nltk-3.3}/nltk/test/gluesemantics_malt.doctest +68 -68
- {nltk-3.2 → nltk-3.3}/nltk/test/gluesemantics_malt_fixt.py +12 -11
- {nltk-3.2 → nltk-3.3}/nltk/test/grammar.doctest +48 -48
- {nltk-3.2 → nltk-3.3}/nltk/test/grammartestsuites.doctest +109 -109
- {nltk-3.2 → nltk-3.3}/nltk/test/index.doctest +100 -100
- {nltk-3.2 → nltk-3.3}/nltk/test/inference.doctest +534 -534
- {nltk-3.2 → nltk-3.3}/nltk/test/inference_fixt.py +12 -11
- {nltk-3.2 → nltk-3.3}/nltk/test/internals.doctest +140 -140
- {nltk-3.2 → nltk-3.3}/nltk/test/japanese.doctest +48 -48
- {nltk-3.2 → nltk-3.3}/nltk/test/logic.doctest +1098 -1098
- {nltk-3.2 → nltk-3.3}/nltk/test/metrics.doctest +270 -270
- {nltk-3.2 → nltk-3.3}/nltk/test/misc.doctest +118 -118
- {nltk-3.2 → nltk-3.3}/nltk/test/nonmonotonic.doctest +286 -286
- {nltk-3.2 → nltk-3.3}/nltk/test/nonmonotonic_fixt.py +12 -11
- {nltk-3.2 → nltk-3.3}/nltk/test/paice.doctest +35 -35
- {nltk-3.2 → nltk-3.3}/nltk/test/parse.doctest +884 -884
- {nltk-3.2 → nltk-3.3}/nltk/test/portuguese_en.doctest +565 -565
- {nltk-3.2 → nltk-3.3}/nltk/test/portuguese_en_fixt.py +16 -16
- {nltk-3.2 → nltk-3.3}/nltk/test/probability.doctest +304 -304
- {nltk-3.2 → nltk-3.3}/nltk/test/probability_fixt.py +13 -12
- {nltk-3.2 → nltk-3.3}/nltk/test/propbank.doctest +176 -176
- {nltk-3.2 → nltk-3.3}/nltk/test/relextract.doctest +263 -263
- {nltk-3.2 → nltk-3.3}/nltk/test/resolution.doctest +221 -221
- {nltk-3.2 → nltk-3.3}/nltk/test/runtests.py +86 -64
- {nltk-3.2 → nltk-3.3}/nltk/test/segmentation_fixt.py +10 -10
- {nltk-3.2 → nltk-3.3}/nltk/test/semantics.doctest +665 -665
- {nltk-3.2 → nltk-3.3}/nltk/test/semantics_fixt.py +7 -7
- {nltk-3.2 → nltk-3.3}/nltk/test/sentiment.doctest +233 -233
- {nltk-3.2 → nltk-3.3}/nltk/test/sentiwordnet.doctest +41 -41
- {nltk-3.2 → nltk-3.3}/nltk/test/simple.doctest +85 -85
- {nltk-3.2 → nltk-3.3}/nltk/test/stem.doctest +78 -78
- {nltk-3.2 → nltk-3.3}/nltk/test/tag.doctest +33 -33
- {nltk-3.2 → nltk-3.3}/nltk/test/tokenize.doctest +273 -166
- {nltk-3.2 → nltk-3.3}/nltk/test/toolbox.doctest +307 -307
- {nltk-3.2 → nltk-3.3}/nltk/test/translate.doctest +242 -242
- {nltk-3.2 → nltk-3.3}/nltk/test/translate_fixt.py +3 -3
- {nltk-3.2 → nltk-3.3}/nltk/test/tree.doctest +1101 -1101
- {nltk-3.2 → nltk-3.3}/nltk/test/treeprettyprinter.doctest +127 -127
- {nltk-3.2 → nltk-3.3}/nltk/test/treetransforms.doctest +156 -156
- nltk-3.3/nltk/test/unit/test_2x_compat.py +63 -0
- nltk-3.3/nltk/test/unit/test_aline.py +52 -0
- nltk-3.3/nltk/test/unit/test_chunk.py +56 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_classify.py +55 -53
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_collocations.py +88 -79
- nltk-3.3/nltk/test/unit/test_concordance.py +98 -0
- nltk-3.3/nltk/test/unit/test_corenlp.py +1000 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_corpora.py +200 -183
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_corpus_views.py +45 -45
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_hmm.py +88 -88
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_json2csv_corpus.py +188 -187
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_naivebayes.py +26 -26
- nltk-3.3/nltk/test/unit/test_rte_classify.py +86 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_seekable_unicode_stream_reader.py +124 -124
- nltk-3.3/nltk/test/unit/test_senna.py +74 -0
- nltk-3.3/nltk/test/unit/test_stem.py +121 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_tag.py +20 -20
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_tgrep.py +628 -626
- nltk-3.3/nltk/test/unit/test_tokenize.py +168 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/test_twitter_auth.py +185 -185
- nltk-3.3/nltk/test/unit/test_wordnet.py +134 -0
- nltk-3.3/nltk/test/unit/translate/test_bleu.py +244 -0
- nltk-3.3/nltk/test/unit/translate/test_gdfa.py +57 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm1.py +75 -75
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm2.py +87 -87
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm3.py +105 -105
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm4.py +126 -126
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm5.py +166 -166
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_ibm_model.py +270 -270
- nltk-3.3/nltk/test/unit/translate/test_nist.py +37 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/test_stack_decoder.py +300 -300
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/utils.py +41 -41
- {nltk-3.2 → nltk-3.3}/nltk/test/util.doctest +48 -48
- {nltk-3.2 → nltk-3.3}/nltk/test/wordnet.doctest +595 -581
- {nltk-3.2 → nltk-3.3}/nltk/test/wordnet_fixt.py +7 -6
- {nltk-3.2 → nltk-3.3}/nltk/test/wordnet_lch.doctest +53 -53
- {nltk-3.2 → nltk-3.3}/nltk/test/wsd.doctest +68 -68
- {nltk-3.2 → nltk-3.3}/nltk/text.py +663 -610
- {nltk-3.2 → nltk-3.3}/nltk/tgrep.py +938 -937
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/__init__.py +130 -107
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/api.py +77 -78
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/casual.py +343 -342
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/mwe.py +120 -120
- nltk-3.3/nltk/tokenize/nist.py +173 -0
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/punkt.py +1620 -1601
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/regexp.py +208 -202
- nltk-3.3/nltk/tokenize/repp.py +151 -0
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/sexpr.py +140 -142
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/simple.py +138 -136
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/stanford.py +117 -113
- nltk-3.3/nltk/tokenize/stanford_segmenter.py +246 -0
- {nltk-3.2 → nltk-3.3}/nltk/tokenize/texttiling.py +458 -460
- nltk-3.3/nltk/tokenize/toktok.py +155 -0
- nltk-3.3/nltk/tokenize/treebank.py +363 -0
- nltk-3.3/nltk/tokenize/util.py +261 -0
- {nltk-3.2 → nltk-3.3}/nltk/toolbox.py +499 -497
- {nltk-3.2 → nltk-3.3}/nltk/translate/__init__.py +24 -24
- {nltk-3.2 → nltk-3.3}/nltk/translate/api.py +331 -321
- {nltk-3.2 → nltk-3.3}/nltk/translate/bleu_score.py +615 -556
- nltk-3.3/nltk/translate/chrf_score.py +137 -0
- {nltk-3.2 → nltk-3.3}/nltk/translate/gale_church.py +248 -235
- {nltk-3.2 → nltk-3.3}/nltk/translate/gdfa.py +135 -131
- nltk-3.3/nltk/translate/gleu_score.py +193 -0
- {nltk-3.2 → nltk-3.3}/nltk/translate/ibm1.py +250 -241
- {nltk-3.2 → nltk-3.3}/nltk/translate/ibm2.py +308 -308
- {nltk-3.2 → nltk-3.3}/nltk/translate/ibm3.py +337 -337
- {nltk-3.2 → nltk-3.3}/nltk/translate/ibm4.py +467 -467
- {nltk-3.2 → nltk-3.3}/nltk/translate/ibm5.py +639 -639
- {nltk-3.2 → nltk-3.3}/nltk/translate/ibm_model.py +536 -533
- {nltk-3.2 → nltk-3.3}/nltk/translate/metrics.py +40 -40
- nltk-3.3/nltk/translate/nist_score.py +178 -0
- {nltk-3.2 → nltk-3.3}/nltk/translate/phrase_based.py +175 -175
- {nltk-3.2 → nltk-3.3}/nltk/translate/ribes_score.py +325 -325
- {nltk-3.2 → nltk-3.3}/nltk/translate/stack_decoder.py +499 -495
- {nltk-3.2 → nltk-3.3}/nltk/tree.py +1605 -1603
- {nltk-3.2 → nltk-3.3}/nltk/treeprettyprinter.py +564 -564
- {nltk-3.2 → nltk-3.3}/nltk/treetransforms.py +309 -309
- {nltk-3.2 → nltk-3.3}/nltk/twitter/__init__.py +28 -28
- {nltk-3.2 → nltk-3.3}/nltk/twitter/api.py +141 -136
- {nltk-3.2 → nltk-3.3}/nltk/twitter/common.py +264 -258
- {nltk-3.2 → nltk-3.3}/nltk/twitter/twitter_demo.py +288 -288
- {nltk-3.2 → nltk-3.3}/nltk/twitter/twitterclient.py +530 -530
- {nltk-3.2 → nltk-3.3}/nltk/twitter/util.py +147 -146
- nltk-3.3/nltk/util.py +751 -0
- {nltk-3.2 → nltk-3.3}/nltk/wsd.py +53 -53
- {nltk-3.2 → nltk-3.3/nltk.egg-info}/PKG-INFO +13 -5
- {nltk-3.2 → nltk-3.3}/nltk.egg-info/SOURCES.txt +26 -3
- nltk-3.3/nltk.egg-info/requires.txt +31 -0
- {nltk-3.2 → nltk-3.3}/setup.cfg +0 -1
- {nltk-3.2 → nltk-3.3}/setup.py +102 -75
- nltk-3.2/nltk/VERSION +0 -1
- nltk-3.2/nltk/compat.py +0 -680
- nltk-3.2/nltk/corpus/reader/pl196x.py +0 -278
- nltk-3.2/nltk/corpus/reader/verbnet.py +0 -408
- nltk-3.2/nltk/corpus/reader/wordlist.py +0 -37
- nltk-3.2/nltk/sentiment/vader_lexicon.txt +0 -7517
- nltk-3.2/nltk/six.py +0 -868
- nltk-3.2/nltk/stem/porter.py +0 -692
- nltk-3.2/nltk/test/unit/test_2x_compat.py +0 -26
- nltk-3.2/nltk/test/unit/test_stem.py +0 -36
- nltk-3.2/nltk/test/unit/test_tokenize.py +0 -23
- nltk-3.2/nltk/test/unit/translate/test_bleu.py +0 -84
- nltk-3.2/nltk/tokenize/treebank.py +0 -124
- nltk-3.2/nltk/tokenize/util.py +0 -90
- nltk-3.2/nltk/util.py +0 -1364
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/__init__.py +0 -0
- {nltk-3.2 → nltk-3.3}/nltk/test/unit/translate/__init__.py +0 -0
- {nltk-3.2 → nltk-3.3}/nltk.egg-info/dependency_links.txt +0 -0
- {nltk-3.2 → nltk-3.3}/nltk.egg-info/not-zip-safe +0 -0
- {nltk-3.2 → nltk-3.3}/nltk.egg-info/top_level.txt +0 -0
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Natural Language Toolkit: Python port of the tok-tok.pl tokenizer.
|
|
3
|
+
#
|
|
4
|
+
# Copyright (C) 2001-2015 NLTK Project
|
|
5
|
+
# Author: Jon Dehdari
|
|
6
|
+
# Contributors: Liling Tan, Selcuk Ayguney, ikegami, Martijn Pieters
|
|
7
|
+
#
|
|
8
|
+
# URL: <http://nltk.sourceforge.net>
|
|
9
|
+
# For license information, see LICENSE.TXT
|
|
10
|
+
|
|
11
|
+
"""
|
|
12
|
+
The tok-tok tokenizer is a simple, general tokenizer, where the input has one
|
|
13
|
+
sentence per line; thus only final period is tokenized.
|
|
14
|
+
|
|
15
|
+
Tok-tok has been tested on, and gives reasonably good results for English,
|
|
16
|
+
Persian, Russian, Czech, French, German, Vietnamese, Tajik, and a few others.
|
|
17
|
+
The input should be in UTF-8 encoding.
|
|
18
|
+
|
|
19
|
+
Reference:
|
|
20
|
+
Jon Dehdari. 2014. A Neurophysiologically-Inspired Statistical Language
|
|
21
|
+
Model (Doctoral dissertation). Columbus, OH, USA: The Ohio State University.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
import re
|
|
25
|
+
from six import text_type
|
|
26
|
+
|
|
27
|
+
from nltk.tokenize.api import TokenizerI
|
|
28
|
+
|
|
29
|
+
class ToktokTokenizer(TokenizerI):
|
|
30
|
+
"""
|
|
31
|
+
This is a Python port of the tok-tok.pl from
|
|
32
|
+
https://github.com/jonsafari/tok-tok/blob/master/tok-tok.pl
|
|
33
|
+
|
|
34
|
+
>>> toktok = ToktokTokenizer()
|
|
35
|
+
>>> text = u'Is 9.5 or 525,600 my favorite number?'
|
|
36
|
+
>>> print (toktok.tokenize(text, return_str=True))
|
|
37
|
+
Is 9.5 or 525,600 my favorite number ?
|
|
38
|
+
>>> text = u'The https://github.com/jonsafari/tok-tok/blob/master/tok-tok.pl is a website with/and/or slashes and sort of weird : things'
|
|
39
|
+
>>> print (toktok.tokenize(text, return_str=True))
|
|
40
|
+
The https://github.com/jonsafari/tok-tok/blob/master/tok-tok.pl is a website with/and/or slashes and sort of weird : things
|
|
41
|
+
>>> text = u'\xa1This, is a sentence with weird\xbb symbols\u2026 appearing everywhere\xbf'
|
|
42
|
+
>>> expected = u'\xa1 This , is a sentence with weird \xbb symbols \u2026 appearing everywhere \xbf'
|
|
43
|
+
>>> assert toktok.tokenize(text, return_str=True) == expected
|
|
44
|
+
>>> toktok.tokenize(text) == [u'\xa1', u'This', u',', u'is', u'a', u'sentence', u'with', u'weird', u'\xbb', u'symbols', u'\u2026', u'appearing', u'everywhere', u'\xbf']
|
|
45
|
+
True
|
|
46
|
+
"""
|
|
47
|
+
# Replace non-breaking spaces with normal spaces.
|
|
48
|
+
NON_BREAKING = re.compile(u"\u00A0"), " "
|
|
49
|
+
|
|
50
|
+
# Pad some funky punctuation.
|
|
51
|
+
FUNKY_PUNCT_1 = re.compile(u'([،;؛¿!"\])}»›”؟¡%٪°±©®।॥…])'), r" \1 "
|
|
52
|
+
# Pad more funky punctuation.
|
|
53
|
+
FUNKY_PUNCT_2 = re.compile(u'([({\[“‘„‚«‹「『])'), r" \1 "
|
|
54
|
+
# Pad En dash and em dash
|
|
55
|
+
EN_EM_DASHES = re.compile(u'([–—])'), r" \1 "
|
|
56
|
+
|
|
57
|
+
# Replace problematic character with numeric character reference.
|
|
58
|
+
AMPERCENT = re.compile('& '), '& '
|
|
59
|
+
TAB = re.compile('\t'), ' 	 '
|
|
60
|
+
PIPE = re.compile('\|'), ' | '
|
|
61
|
+
|
|
62
|
+
# Pad numbers with commas to keep them from further tokenization.
|
|
63
|
+
COMMA_IN_NUM = re.compile(r'(?<!,)([,،])(?![,\d])'), r' \1 '
|
|
64
|
+
|
|
65
|
+
# Just pad problematic (often neurotic) hyphen/single quote, etc.
|
|
66
|
+
PROB_SINGLE_QUOTES = re.compile(r"(['’`])"), r' \1 '
|
|
67
|
+
# Group ` ` stupid quotes ' ' into a single token.
|
|
68
|
+
STUPID_QUOTES_1 = re.compile(r" ` ` "), r" `` "
|
|
69
|
+
STUPID_QUOTES_2 = re.compile(r" ' ' "), r" '' "
|
|
70
|
+
|
|
71
|
+
# Don't tokenize period unless it ends the line and that it isn't
|
|
72
|
+
# preceded by another period, e.g.
|
|
73
|
+
# "something ..." -> "something ..."
|
|
74
|
+
# "something." -> "something ."
|
|
75
|
+
FINAL_PERIOD_1 = re.compile(r"(?<!\.)\.$"), r" ."
|
|
76
|
+
# Don't tokenize period unless it ends the line eg.
|
|
77
|
+
# " ... stuff." -> "... stuff ."
|
|
78
|
+
FINAL_PERIOD_2 = re.compile(r"""(?<!\.)\.\s*(["'’»›”]) *$"""), r" . \1"
|
|
79
|
+
|
|
80
|
+
# Treat continuous commas as fake German,Czech, etc.: „
|
|
81
|
+
MULTI_COMMAS = re.compile(r'(,{2,})'), r' \1 '
|
|
82
|
+
# Treat continuous dashes as fake en-dash, etc.
|
|
83
|
+
MULTI_DASHES = re.compile(r'(-{2,})'), r' \1 '
|
|
84
|
+
# Treat multiple periods as a thing (eg. ellipsis)
|
|
85
|
+
MULTI_DOTS = re.compile(r'(\.{2,})'), r' \1 '
|
|
86
|
+
|
|
87
|
+
# This is the \p{Open_Punctuation} from Perl's perluniprops
|
|
88
|
+
# see http://perldoc.perl.org/perluniprops.html
|
|
89
|
+
OPEN_PUNCT = text_type(u'([{\u0f3a\u0f3c\u169b\u201a\u201e\u2045\u207d'
|
|
90
|
+
u'\u208d\u2329\u2768\u276a\u276c\u276e\u2770\u2772'
|
|
91
|
+
u'\u2774\u27c5\u27e6\u27e8\u27ea\u27ec\u27ee\u2983'
|
|
92
|
+
u'\u2985\u2987\u2989\u298b\u298d\u298f\u2991\u2993'
|
|
93
|
+
u'\u2995\u2997\u29d8\u29da\u29fc\u2e22\u2e24\u2e26'
|
|
94
|
+
u'\u2e28\u3008\u300a\u300c\u300e\u3010\u3014\u3016'
|
|
95
|
+
u'\u3018\u301a\u301d\ufd3e\ufe17\ufe35\ufe37\ufe39'
|
|
96
|
+
u'\ufe3b\ufe3d\ufe3f\ufe41\ufe43\ufe47\ufe59\ufe5b'
|
|
97
|
+
u'\ufe5d\uff08\uff3b\uff5b\uff5f\uff62')
|
|
98
|
+
# This is the \p{Close_Punctuation} from Perl's perluniprops
|
|
99
|
+
CLOSE_PUNCT = text_type(u')]}\u0f3b\u0f3d\u169c\u2046\u207e\u208e\u232a'
|
|
100
|
+
u'\u2769\u276b\u276d\u276f\u2771\u2773\u2775\u27c6'
|
|
101
|
+
u'\u27e7\u27e9\u27eb\u27ed\u27ef\u2984\u2986\u2988'
|
|
102
|
+
u'\u298a\u298c\u298e\u2990\u2992\u2994\u2996\u2998'
|
|
103
|
+
u'\u29d9\u29db\u29fd\u2e23\u2e25\u2e27\u2e29\u3009'
|
|
104
|
+
u'\u300b\u300d\u300f\u3011\u3015\u3017\u3019\u301b'
|
|
105
|
+
u'\u301e\u301f\ufd3f\ufe18\ufe36\ufe38\ufe3a\ufe3c'
|
|
106
|
+
u'\ufe3e\ufe40\ufe42\ufe44\ufe48\ufe5a\ufe5c\ufe5e'
|
|
107
|
+
u'\uff09\uff3d\uff5d\uff60\uff63')
|
|
108
|
+
# This is the \p{Close_Punctuation} from Perl's perluniprops
|
|
109
|
+
CURRENCY_SYM = text_type(u'$\xa2\xa3\xa4\xa5\u058f\u060b\u09f2\u09f3\u09fb'
|
|
110
|
+
u'\u0af1\u0bf9\u0e3f\u17db\u20a0\u20a1\u20a2\u20a3'
|
|
111
|
+
u'\u20a4\u20a5\u20a6\u20a7\u20a8\u20a9\u20aa\u20ab'
|
|
112
|
+
u'\u20ac\u20ad\u20ae\u20af\u20b0\u20b1\u20b2\u20b3'
|
|
113
|
+
u'\u20b4\u20b5\u20b6\u20b7\u20b8\u20b9\u20ba\ua838'
|
|
114
|
+
u'\ufdfc\ufe69\uff04\uffe0\uffe1\uffe5\uffe6')
|
|
115
|
+
|
|
116
|
+
# Pad spaces after opening punctuations.
|
|
117
|
+
OPEN_PUNCT_RE = re.compile(u'([{}])'.format(OPEN_PUNCT)), r'\1 '
|
|
118
|
+
# Pad spaces before closing punctuations.
|
|
119
|
+
CLOSE_PUNCT_RE = re.compile(u'([{}])'.format(CLOSE_PUNCT)), r'\1 '
|
|
120
|
+
# Pad spaces after currency symbols.
|
|
121
|
+
CURRENCY_SYM_RE = re.compile(u'([{}])'.format(CURRENCY_SYM)), r'\1 '
|
|
122
|
+
|
|
123
|
+
# Use for tokenizing URL-unfriendly characters: [:/?#]
|
|
124
|
+
URL_FOE_1 = re.compile(r':(?!//)'), r' : ' # in perl s{:(?!//)}{ : }g;
|
|
125
|
+
URL_FOE_2 = re.compile(r'\?(?!\S)'), r' ? ' # in perl s{\?(?!\S)}{ ? }g;
|
|
126
|
+
# in perl: m{://} or m{\S+\.\S+/\S+} or s{/}{ / }g;
|
|
127
|
+
URL_FOE_3 = re.compile(r'(:\/\/)[\S+\.\S+\/\S+][\/]'), ' / '
|
|
128
|
+
URL_FOE_4 = re.compile(r' /'), r' / ' # s{ /}{ / }g;
|
|
129
|
+
|
|
130
|
+
# Left/Right strip, i.e. remove heading/trailing spaces.
|
|
131
|
+
# These strip regexes should NOT be used,
|
|
132
|
+
# instead use str.lstrip(), str.rstrip() or str.strip()
|
|
133
|
+
# (They are kept for reference purposes to the original toktok.pl code)
|
|
134
|
+
LSTRIP = re.compile(r'^ +'), ''
|
|
135
|
+
RSTRIP = re.compile(r'\s+$'),'\n'
|
|
136
|
+
# Merge multiple spaces.
|
|
137
|
+
ONE_SPACE = re.compile(r' {2,}'), ' '
|
|
138
|
+
|
|
139
|
+
TOKTOK_REGEXES = [NON_BREAKING, FUNKY_PUNCT_1,
|
|
140
|
+
URL_FOE_1, URL_FOE_2, URL_FOE_3, URL_FOE_4,
|
|
141
|
+
AMPERCENT, TAB, PIPE,
|
|
142
|
+
OPEN_PUNCT_RE, CLOSE_PUNCT_RE,
|
|
143
|
+
MULTI_COMMAS, COMMA_IN_NUM, FINAL_PERIOD_2,
|
|
144
|
+
PROB_SINGLE_QUOTES, STUPID_QUOTES_1, STUPID_QUOTES_2,
|
|
145
|
+
CURRENCY_SYM_RE, EN_EM_DASHES, MULTI_DASHES, MULTI_DOTS,
|
|
146
|
+
FINAL_PERIOD_1, FINAL_PERIOD_2, ONE_SPACE]
|
|
147
|
+
|
|
148
|
+
def tokenize(self, text, return_str=False):
|
|
149
|
+
text = text_type(text) # Converts input string into unicode.
|
|
150
|
+
for regexp, subsitution in self.TOKTOK_REGEXES:
|
|
151
|
+
text = regexp.sub(subsitution, text)
|
|
152
|
+
# Finally, strips heading and trailing spaces
|
|
153
|
+
# and converts output string into unicode.
|
|
154
|
+
text = text_type(text.strip())
|
|
155
|
+
return text if return_str else text.split()
|
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
# Natural Language Toolkit: Tokenizers
|
|
2
|
+
#
|
|
3
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
4
|
+
# Author: Edward Loper <edloper@gmail.com>
|
|
5
|
+
# Michael Heilman <mheilman@cmu.edu> (re-port from http://www.cis.upenn.edu/~treebank/tokenizer.sed)
|
|
6
|
+
#
|
|
7
|
+
# URL: <http://nltk.sourceforge.net>
|
|
8
|
+
# For license information, see LICENSE.TXT
|
|
9
|
+
|
|
10
|
+
r"""
|
|
11
|
+
|
|
12
|
+
Penn Treebank Tokenizer
|
|
13
|
+
|
|
14
|
+
The Treebank tokenizer uses regular expressions to tokenize text as in Penn Treebank.
|
|
15
|
+
This implementation is a port of the tokenizer sed script written by Robert McIntyre
|
|
16
|
+
and available at http://www.cis.upenn.edu/~treebank/tokenizer.sed.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
import re
|
|
20
|
+
from nltk.tokenize.api import TokenizerI
|
|
21
|
+
from nltk.tokenize.util import align_tokens
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class MacIntyreContractions:
|
|
25
|
+
"""
|
|
26
|
+
List of contractions adapted from Robert MacIntyre's tokenizer.
|
|
27
|
+
"""
|
|
28
|
+
CONTRACTIONS2 = [r"(?i)\b(can)(?#X)(not)\b",
|
|
29
|
+
r"(?i)\b(d)(?#X)('ye)\b",
|
|
30
|
+
r"(?i)\b(gim)(?#X)(me)\b",
|
|
31
|
+
r"(?i)\b(gon)(?#X)(na)\b",
|
|
32
|
+
r"(?i)\b(got)(?#X)(ta)\b",
|
|
33
|
+
r"(?i)\b(lem)(?#X)(me)\b",
|
|
34
|
+
r"(?i)\b(mor)(?#X)('n)\b",
|
|
35
|
+
r"(?i)\b(wan)(?#X)(na)\s"]
|
|
36
|
+
CONTRACTIONS3 = [r"(?i) ('t)(?#X)(is)\b", r"(?i) ('t)(?#X)(was)\b"]
|
|
37
|
+
CONTRACTIONS4 = [r"(?i)\b(whad)(dd)(ya)\b",
|
|
38
|
+
r"(?i)\b(wha)(t)(cha)\b"]
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class TreebankWordTokenizer(TokenizerI):
|
|
42
|
+
"""
|
|
43
|
+
The Treebank tokenizer uses regular expressions to tokenize text as in Penn Treebank.
|
|
44
|
+
This is the method that is invoked by ``word_tokenize()``. It assumes that the
|
|
45
|
+
text has already been segmented into sentences, e.g. using ``sent_tokenize()``.
|
|
46
|
+
|
|
47
|
+
This tokenizer performs the following steps:
|
|
48
|
+
|
|
49
|
+
- split standard contractions, e.g. ``don't`` -> ``do n't`` and ``they'll`` -> ``they 'll``
|
|
50
|
+
- treat most punctuation characters as separate tokens
|
|
51
|
+
- split off commas and single quotes, when followed by whitespace
|
|
52
|
+
- separate periods that appear at the end of line
|
|
53
|
+
|
|
54
|
+
>>> from nltk.tokenize import TreebankWordTokenizer
|
|
55
|
+
>>> s = '''Good muffins cost $3.88\\nin New York. Please buy me\\ntwo of them.\\nThanks.'''
|
|
56
|
+
>>> TreebankWordTokenizer().tokenize(s)
|
|
57
|
+
['Good', 'muffins', 'cost', '$', '3.88', 'in', 'New', 'York.', 'Please', 'buy', 'me', 'two', 'of', 'them.', 'Thanks', '.']
|
|
58
|
+
>>> s = "They'll save and invest more."
|
|
59
|
+
>>> TreebankWordTokenizer().tokenize(s)
|
|
60
|
+
['They', "'ll", 'save', 'and', 'invest', 'more', '.']
|
|
61
|
+
>>> s = "hi, my name can't hello,"
|
|
62
|
+
>>> TreebankWordTokenizer().tokenize(s)
|
|
63
|
+
['hi', ',', 'my', 'name', 'ca', "n't", 'hello', ',']
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
# starting quotes
|
|
67
|
+
STARTING_QUOTES = [
|
|
68
|
+
(re.compile(r'^\"'), r'``'),
|
|
69
|
+
(re.compile(r'(``)'), r' \1 '),
|
|
70
|
+
(re.compile(r"([ \(\[{<])(\"|\'{2})"), r'\1 `` '),
|
|
71
|
+
]
|
|
72
|
+
|
|
73
|
+
# punctuation
|
|
74
|
+
PUNCTUATION = [
|
|
75
|
+
(re.compile(r'([:,])([^\d])'), r' \1 \2'),
|
|
76
|
+
(re.compile(r'([:,])$'), r' \1 '),
|
|
77
|
+
(re.compile(r'\.\.\.'), r' ... '),
|
|
78
|
+
(re.compile(r'[;@#$%&]'), r' \g<0> '),
|
|
79
|
+
(re.compile(r'([^\.])(\.)([\]\)}>"\']*)\s*$'), r'\1 \2\3 '), # Handles the final period.
|
|
80
|
+
(re.compile(r'[?!]'), r' \g<0> '),
|
|
81
|
+
|
|
82
|
+
(re.compile(r"([^'])' "), r"\1 ' "),
|
|
83
|
+
]
|
|
84
|
+
|
|
85
|
+
# Pads parentheses
|
|
86
|
+
PARENS_BRACKETS = (re.compile(r'[\]\[\(\)\{\}\<\>]'), r' \g<0> ')
|
|
87
|
+
|
|
88
|
+
# Optionally: Convert parentheses, brackets and converts them to PTB symbols.
|
|
89
|
+
CONVERT_PARENTHESES = [
|
|
90
|
+
(re.compile(r'\('), '-LRB-'), (re.compile(r'\)'), '-RRB-'),
|
|
91
|
+
(re.compile(r'\['), '-LSB-'), (re.compile(r'\]'), '-RSB-'),
|
|
92
|
+
(re.compile(r'\{'), '-LCB-'), (re.compile(r'\}'), '-RCB-')
|
|
93
|
+
]
|
|
94
|
+
|
|
95
|
+
DOUBLE_DASHES = (re.compile(r'--'), r' -- ')
|
|
96
|
+
|
|
97
|
+
# ending quotes
|
|
98
|
+
ENDING_QUOTES = [
|
|
99
|
+
(re.compile(r'"'), " '' "),
|
|
100
|
+
(re.compile(r'(\S)(\'\')'), r'\1 \2 '),
|
|
101
|
+
(re.compile(r"([^' ])('[sS]|'[mM]|'[dD]|') "), r"\1 \2 "),
|
|
102
|
+
(re.compile(r"([^' ])('ll|'LL|'re|'RE|'ve|'VE|n't|N'T) "), r"\1 \2 "),
|
|
103
|
+
]
|
|
104
|
+
|
|
105
|
+
# List of contractions adapted from Robert MacIntyre's tokenizer.
|
|
106
|
+
_contractions = MacIntyreContractions()
|
|
107
|
+
CONTRACTIONS2 = list(map(re.compile, _contractions.CONTRACTIONS2))
|
|
108
|
+
CONTRACTIONS3 = list(map(re.compile, _contractions.CONTRACTIONS3))
|
|
109
|
+
|
|
110
|
+
def tokenize(self, text, convert_parentheses=False, return_str=False):
|
|
111
|
+
for regexp, substitution in self.STARTING_QUOTES:
|
|
112
|
+
text = regexp.sub(substitution, text)
|
|
113
|
+
|
|
114
|
+
for regexp, substitution in self.PUNCTUATION:
|
|
115
|
+
text = regexp.sub(substitution, text)
|
|
116
|
+
|
|
117
|
+
# Handles parentheses.
|
|
118
|
+
regexp, substitution = self.PARENS_BRACKETS
|
|
119
|
+
text = regexp.sub(substitution, text)
|
|
120
|
+
# Optionally convert parentheses
|
|
121
|
+
if convert_parentheses:
|
|
122
|
+
for regexp, substitution in self.CONVERT_PARENTHESES:
|
|
123
|
+
text = regexp.sub(substitution, text)
|
|
124
|
+
|
|
125
|
+
# Handles double dash.
|
|
126
|
+
regexp, substitution = self.DOUBLE_DASHES
|
|
127
|
+
text = regexp.sub(substitution, text)
|
|
128
|
+
|
|
129
|
+
# add extra space to make things easier
|
|
130
|
+
text = " " + text + " "
|
|
131
|
+
|
|
132
|
+
for regexp, substitution in self.ENDING_QUOTES:
|
|
133
|
+
text = regexp.sub(substitution, text)
|
|
134
|
+
|
|
135
|
+
for regexp in self.CONTRACTIONS2:
|
|
136
|
+
text = regexp.sub(r' \1 \2 ', text)
|
|
137
|
+
for regexp in self.CONTRACTIONS3:
|
|
138
|
+
text = regexp.sub(r' \1 \2 ', text)
|
|
139
|
+
|
|
140
|
+
# We are not using CONTRACTIONS4 since
|
|
141
|
+
# they are also commented out in the SED scripts
|
|
142
|
+
# for regexp in self._contractions.CONTRACTIONS4:
|
|
143
|
+
# text = regexp.sub(r' \1 \2 \3 ', text)
|
|
144
|
+
|
|
145
|
+
return text if return_str else text.split()
|
|
146
|
+
|
|
147
|
+
def span_tokenize(self, text):
|
|
148
|
+
"""
|
|
149
|
+
Uses the post-hoc nltk.tokens.align_tokens to return the offset spans.
|
|
150
|
+
|
|
151
|
+
>>> from nltk.tokenize import TreebankWordTokenizer
|
|
152
|
+
>>> s = '''Good muffins cost $3.88\\nin New (York). Please (buy) me\\ntwo of them.\\n(Thanks).'''
|
|
153
|
+
>>> expected = [(0, 4), (5, 12), (13, 17), (18, 19), (19, 23),
|
|
154
|
+
... (24, 26), (27, 30), (31, 32), (32, 36), (36, 37), (37, 38),
|
|
155
|
+
... (40, 46), (47, 48), (48, 51), (51, 52), (53, 55), (56, 59),
|
|
156
|
+
... (60, 62), (63, 68), (69, 70), (70, 76), (76, 77), (77, 78)]
|
|
157
|
+
>>> list(TreebankWordTokenizer().span_tokenize(s)) == expected
|
|
158
|
+
True
|
|
159
|
+
>>> expected = ['Good', 'muffins', 'cost', '$', '3.88', 'in',
|
|
160
|
+
... 'New', '(', 'York', ')', '.', 'Please', '(', 'buy', ')',
|
|
161
|
+
... 'me', 'two', 'of', 'them.', '(', 'Thanks', ')', '.']
|
|
162
|
+
>>> [s[start:end] for start, end in TreebankWordTokenizer().span_tokenize(s)] == expected
|
|
163
|
+
True
|
|
164
|
+
|
|
165
|
+
Additional example
|
|
166
|
+
>>> from nltk.tokenize import TreebankWordTokenizer
|
|
167
|
+
>>> s = '''I said, "I'd like to buy some ''good muffins" which cost $3.88\\n each in New (York)."'''
|
|
168
|
+
>>> expected = [(0, 1), (2, 6), (6, 7), (8, 9), (9, 10), (10, 12),
|
|
169
|
+
... (13, 17), (18, 20), (21, 24), (25, 29), (30, 32), (32, 36),
|
|
170
|
+
... (37, 44), (44, 45), (46, 51), (52, 56), (57, 58), (58, 62),
|
|
171
|
+
... (64, 68), (69, 71), (72, 75), (76, 77), (77, 81), (81, 82),
|
|
172
|
+
... (82, 83), (83, 84)]
|
|
173
|
+
>>> list(TreebankWordTokenizer().span_tokenize(s)) == expected
|
|
174
|
+
True
|
|
175
|
+
>>> expected = ['I', 'said', ',', '"', 'I', "'d", 'like', 'to',
|
|
176
|
+
... 'buy', 'some', "''", "good", 'muffins', '"', 'which', 'cost',
|
|
177
|
+
... '$', '3.88', 'each', 'in', 'New', '(', 'York', ')', '.', '"']
|
|
178
|
+
>>> [s[start:end] for start, end in TreebankWordTokenizer().span_tokenize(s)] == expected
|
|
179
|
+
True
|
|
180
|
+
|
|
181
|
+
"""
|
|
182
|
+
raw_tokens = self.tokenize(text)
|
|
183
|
+
|
|
184
|
+
# Convert converted quotes back to original double quotes
|
|
185
|
+
# Do this only if original text contains double quote(s) or double
|
|
186
|
+
# single-quotes (because '' might be transformed to `` if it is
|
|
187
|
+
# treated as starting quotes).
|
|
188
|
+
if ('"' in text) or ("''" in text):
|
|
189
|
+
# Find double quotes and converted quotes
|
|
190
|
+
matched = [m.group() for m in re.finditer(r"``|'{2}|\"", text)]
|
|
191
|
+
|
|
192
|
+
# Replace converted quotes back to double quotes
|
|
193
|
+
tokens = [matched.pop(0) if tok in ['"', "``", "''"] else tok
|
|
194
|
+
for tok in raw_tokens]
|
|
195
|
+
else:
|
|
196
|
+
tokens = raw_tokens
|
|
197
|
+
|
|
198
|
+
for tok in align_tokens(tokens, text):
|
|
199
|
+
yield tok
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
class TreebankWordDetokenizer(TokenizerI):
|
|
203
|
+
"""
|
|
204
|
+
The Treebank detokenizer uses the reverse regex operations corresponding to
|
|
205
|
+
the Treebank tokenizer's regexes.
|
|
206
|
+
|
|
207
|
+
Note:
|
|
208
|
+
- There're additional assumption mades when undoing the padding of [;@#$%&]
|
|
209
|
+
punctuation symbols that isn't presupposed in the TreebankTokenizer.
|
|
210
|
+
- There're additional regexes added in reversing the parentheses tokenization,
|
|
211
|
+
- the r'([\]\)\}\>])\s([:;,.])' removes the additional right padding added
|
|
212
|
+
to the closing parentheses precedding [:;,.].
|
|
213
|
+
- It's not possible to return the original whitespaces as they were because
|
|
214
|
+
there wasn't explicit records of where '\n', '\t' or '\s' were removed at
|
|
215
|
+
the text.split() operation.
|
|
216
|
+
|
|
217
|
+
>>> from nltk.tokenize.treebank import TreebankWordTokenizer, TreebankWordDetokenizer
|
|
218
|
+
>>> s = '''Good muffins cost $3.88\\nin New York. Please buy me\\ntwo of them.\\nThanks.'''
|
|
219
|
+
>>> d = TreebankWordDetokenizer()
|
|
220
|
+
>>> t = TreebankWordTokenizer()
|
|
221
|
+
>>> toks = t.tokenize(s)
|
|
222
|
+
>>> d.detokenize(toks)
|
|
223
|
+
'Good muffins cost $3.88 in New York. Please buy me two of them. Thanks.'
|
|
224
|
+
|
|
225
|
+
The MXPOST parentheses substitution can be undone using the `convert_parentheses`
|
|
226
|
+
parameter:
|
|
227
|
+
|
|
228
|
+
>>> s = '''Good muffins cost $3.88\\nin New (York). Please (buy) me\\ntwo of them.\\n(Thanks).'''
|
|
229
|
+
>>> expected_tokens = ['Good', 'muffins', 'cost', '$', '3.88', 'in',
|
|
230
|
+
... 'New', '-LRB-', 'York', '-RRB-', '.', 'Please', '-LRB-', 'buy',
|
|
231
|
+
... '-RRB-', 'me', 'two', 'of', 'them.', '-LRB-', 'Thanks', '-RRB-', '.']
|
|
232
|
+
>>> expected_tokens == t.tokenize(s, convert_parentheses=True)
|
|
233
|
+
True
|
|
234
|
+
>>> expected_detoken = 'Good muffins cost $3.88 in New (York). Please (buy) me two of them. (Thanks).'
|
|
235
|
+
>>> expected_detoken == d.detokenize(t.tokenize(s, convert_parentheses=True), convert_parentheses=True)
|
|
236
|
+
True
|
|
237
|
+
|
|
238
|
+
During tokenization it's safe to add more spaces but during detokenization,
|
|
239
|
+
simply undoing the padding doesn't really help.
|
|
240
|
+
|
|
241
|
+
- During tokenization, left and right pad is added to [!?], when
|
|
242
|
+
detokenizing, only left shift the [!?] is needed.
|
|
243
|
+
Thus (re.compile(r'\s([?!])'), r'\g<1>')
|
|
244
|
+
|
|
245
|
+
- During tokenization [:,] are left and right padded but when detokenizing,
|
|
246
|
+
only left shift is necessary and we keep right pad after comma/colon
|
|
247
|
+
if the string after is a non-digit.
|
|
248
|
+
Thus (re.compile(r'\s([:,])\s([^\d])'), r'\1 \2')
|
|
249
|
+
|
|
250
|
+
>>> from nltk.tokenize.treebank import TreebankWordDetokenizer
|
|
251
|
+
>>> toks = ['hello', ',', 'i', 'ca', "n't", 'feel', 'my', 'feet', '!', 'Help', '!', '!']
|
|
252
|
+
>>> twd = TreebankWordDetokenizer()
|
|
253
|
+
>>> twd.detokenize(toks)
|
|
254
|
+
"hello, i can't feel my feet! Help!!"
|
|
255
|
+
|
|
256
|
+
>>> toks = ['hello', ',', 'i', "can't", 'feel', ';', 'my', 'feet', '!',
|
|
257
|
+
... 'Help', '!', '!', 'He', 'said', ':', 'Help', ',', 'help', '?', '!']
|
|
258
|
+
>>> twd.detokenize(toks)
|
|
259
|
+
"hello, i can't feel; my feet! Help!! He said: Help, help?!"
|
|
260
|
+
"""
|
|
261
|
+
_contractions = MacIntyreContractions()
|
|
262
|
+
CONTRACTIONS2 = [re.compile(pattern.replace('(?#X)', '\s'))
|
|
263
|
+
for pattern in _contractions.CONTRACTIONS2]
|
|
264
|
+
CONTRACTIONS3 = [re.compile(pattern.replace('(?#X)', '\s'))
|
|
265
|
+
for pattern in _contractions.CONTRACTIONS3]
|
|
266
|
+
|
|
267
|
+
# ending quotes
|
|
268
|
+
ENDING_QUOTES = [
|
|
269
|
+
(re.compile(r"([^' ])\s('ll|'LL|'re|'RE|'ve|'VE|n't|N'T) "), r"\1\2 "),
|
|
270
|
+
(re.compile(r"([^' ])\s('[sS]|'[mM]|'[dD]|') "), r"\1\2 "),
|
|
271
|
+
(re.compile(r'(\S)(\'\')'), r'\1\2 '),
|
|
272
|
+
(re.compile(r" '' "), '"')
|
|
273
|
+
]
|
|
274
|
+
|
|
275
|
+
# Handles double dashes
|
|
276
|
+
DOUBLE_DASHES = (re.compile(r' -- '), r'--')
|
|
277
|
+
|
|
278
|
+
# Optionally: Convert parentheses, brackets and converts them from PTB symbols.
|
|
279
|
+
CONVERT_PARENTHESES = [
|
|
280
|
+
(re.compile('-LRB-'), '('), (re.compile('-RRB-'), ')'),
|
|
281
|
+
(re.compile('-LSB-'), '['), (re.compile('-RSB-'), ']'),
|
|
282
|
+
(re.compile('-LCB-'), '{'), (re.compile('-RCB-'), '}')
|
|
283
|
+
]
|
|
284
|
+
|
|
285
|
+
# Undo padding on parentheses.
|
|
286
|
+
PARENS_BRACKETS = [(re.compile(r'\s([\[\(\{\<])\s'), r' \g<1>'),
|
|
287
|
+
(re.compile(r'\s([\]\)\}\>])\s'), r'\g<1> '),
|
|
288
|
+
(re.compile(r'([\]\)\}\>])\s([:;,.])'), r'\1\2')]
|
|
289
|
+
|
|
290
|
+
# punctuation
|
|
291
|
+
PUNCTUATION = [
|
|
292
|
+
(re.compile(r"([^'])\s'\s"), r"\1' "),
|
|
293
|
+
(re.compile(r'\s([?!])'), r'\g<1>'), # Strip left pad for [?!]
|
|
294
|
+
# (re.compile(r'\s([?!])\s'), r'\g<1>'),
|
|
295
|
+
(re.compile(r'([^\.])\s(\.)([\]\)}>"\']*)\s*$'), r'\1\2\3'),
|
|
296
|
+
# When tokenizing, [;@#$%&] are padded with whitespace regardless of
|
|
297
|
+
# whether there are spaces before or after them.
|
|
298
|
+
# But during detokenization, we need to distinguish between left/right
|
|
299
|
+
# pad, so we split this up.
|
|
300
|
+
(re.compile(r'\s([#$])\s'), r' \g<1>'), # Left pad.
|
|
301
|
+
(re.compile(r'\s([;%])\s'), r'\g<1> '), # Right pad.
|
|
302
|
+
(re.compile(r'\s([&])\s'), r' \g<1> '), # Unknown pad.
|
|
303
|
+
(re.compile(r'\s\.\.\.\s'), r'...'),
|
|
304
|
+
(re.compile(r'\s([:,])\s$'), r'\1'),
|
|
305
|
+
(re.compile(r'\s([:,])\s([^\d])'), r'\1 \2') # Keep right pad after comma/colon before non-digits.
|
|
306
|
+
# (re.compile(r'\s([:,])\s([^\d])'), r'\1\2')
|
|
307
|
+
]
|
|
308
|
+
|
|
309
|
+
# starting quotes
|
|
310
|
+
STARTING_QUOTES = [
|
|
311
|
+
(re.compile(r'([ (\[{<])\s``'), r'\1"'),
|
|
312
|
+
(re.compile(r'\s(``)\s'), r'\1'),
|
|
313
|
+
(re.compile(r'^``'), r'\"'),
|
|
314
|
+
]
|
|
315
|
+
|
|
316
|
+
def tokenize(self, tokens, convert_parentheses=False):
|
|
317
|
+
"""
|
|
318
|
+
Python port of the Moses detokenizer.
|
|
319
|
+
|
|
320
|
+
:param tokens: A list of strings, i.e. tokenized text.
|
|
321
|
+
:type tokens: list(str)
|
|
322
|
+
:return: str
|
|
323
|
+
"""
|
|
324
|
+
text = ' '.join(tokens)
|
|
325
|
+
# Reverse the contractions regexes.
|
|
326
|
+
# Note: CONTRACTIONS4 are not used in tokenization.
|
|
327
|
+
for regexp in self.CONTRACTIONS3:
|
|
328
|
+
text = regexp.sub(r'\1\2', text)
|
|
329
|
+
for regexp in self.CONTRACTIONS2:
|
|
330
|
+
text = regexp.sub(r'\1\2', text)
|
|
331
|
+
|
|
332
|
+
# Reverse the regexes applied for ending quotes.
|
|
333
|
+
for regexp, substitution in self.ENDING_QUOTES:
|
|
334
|
+
text = regexp.sub(substitution, text)
|
|
335
|
+
|
|
336
|
+
# Undo the space padding.
|
|
337
|
+
text = text.strip()
|
|
338
|
+
|
|
339
|
+
# Reverse the padding on double dashes.
|
|
340
|
+
regexp, substitution = self.DOUBLE_DASHES
|
|
341
|
+
text = regexp.sub(substitution, text)
|
|
342
|
+
|
|
343
|
+
if convert_parentheses:
|
|
344
|
+
for regexp, substitution in self.CONVERT_PARENTHESES:
|
|
345
|
+
text = regexp.sub(substitution, text)
|
|
346
|
+
|
|
347
|
+
# Reverse the padding regexes applied for parenthesis/brackets.
|
|
348
|
+
for regexp, substitution in self.PARENS_BRACKETS:
|
|
349
|
+
text = regexp.sub(substitution, text)
|
|
350
|
+
|
|
351
|
+
# Reverse the regexes applied for punctuations.
|
|
352
|
+
for regexp, substitution in self.PUNCTUATION:
|
|
353
|
+
text = regexp.sub(substitution, text)
|
|
354
|
+
|
|
355
|
+
# Reverse the regexes applied for starting quotes.
|
|
356
|
+
for regexp, substitution in self.STARTING_QUOTES:
|
|
357
|
+
text = regexp.sub(substitution, text)
|
|
358
|
+
|
|
359
|
+
return text.strip()
|
|
360
|
+
|
|
361
|
+
def detokenize(self, tokens, convert_parentheses=False):
|
|
362
|
+
""" Duck-typing the abstract *tokenize()*."""
|
|
363
|
+
return self.tokenize(tokens, convert_parentheses)
|