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
|
@@ -1,120 +1,120 @@
|
|
|
1
|
-
# Multi-Word Expression tokenizer
|
|
2
|
-
#
|
|
3
|
-
# Copyright (C) 2001-
|
|
4
|
-
# Author: Rob Malouf <rmalouf@mail.sdsu.edu>
|
|
5
|
-
# URL: <http://nltk.org/>
|
|
6
|
-
# For license information, see LICENSE.TXT
|
|
7
|
-
|
|
8
|
-
"""
|
|
9
|
-
Multi-Word Expression Tokenizer
|
|
10
|
-
|
|
11
|
-
A ``MWETokenizer`` takes a string which has already been divided into tokens and
|
|
12
|
-
retokenizes it, merging multi-word expressions into single tokens, using a lexicon
|
|
13
|
-
of MWEs:
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
>>> from nltk.tokenize import MWETokenizer
|
|
17
|
-
|
|
18
|
-
>>> tokenizer = MWETokenizer([('a', 'little'), ('a', 'little', 'bit'), ('a', 'lot')])
|
|
19
|
-
>>> tokenizer.add_mwe(('in', 'spite', 'of'))
|
|
20
|
-
|
|
21
|
-
>>> tokenizer.tokenize('Testing testing testing one two three'.split())
|
|
22
|
-
['Testing', 'testing', 'testing', 'one', 'two', 'three']
|
|
23
|
-
|
|
24
|
-
>>> tokenizer.tokenize('This is a test in spite'.split())
|
|
25
|
-
['This', 'is', 'a', 'test', 'in', 'spite']
|
|
26
|
-
|
|
27
|
-
>>> tokenizer.tokenize('In a little or a little bit or a lot in spite of'.split())
|
|
28
|
-
['In', 'a_little', 'or', 'a_little_bit', 'or', 'a_lot', 'in_spite_of']
|
|
29
|
-
|
|
30
|
-
"""
|
|
31
|
-
from nltk.util import Trie
|
|
32
|
-
|
|
33
|
-
from nltk.tokenize.api import TokenizerI
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
class MWETokenizer(TokenizerI):
|
|
37
|
-
"""A tokenizer that processes tokenized text and merges multi-word expressions
|
|
38
|
-
into single tokens.
|
|
39
|
-
"""
|
|
40
|
-
|
|
41
|
-
def __init__(self, mwes=None, separator='_'):
|
|
42
|
-
"""Initialize the multi-word tokenizer with a list of expressions and a
|
|
43
|
-
separator
|
|
44
|
-
|
|
45
|
-
:type mwes: list(list(str))
|
|
46
|
-
:param mwes: A sequence of multi-word expressions to be merged, where
|
|
47
|
-
each MWE is a sequence of strings.
|
|
48
|
-
:type separator: str
|
|
49
|
-
:param separator: String that should be inserted between words in a multi-word
|
|
50
|
-
expression token. (Default is '_')
|
|
51
|
-
|
|
52
|
-
"""
|
|
53
|
-
if not mwes:
|
|
54
|
-
mwes = []
|
|
55
|
-
self._mwes = Trie(mwes)
|
|
56
|
-
self._separator = separator
|
|
57
|
-
|
|
58
|
-
def add_mwe(self, mwe):
|
|
59
|
-
"""Add a multi-word expression to the lexicon (stored as a word trie)
|
|
60
|
-
|
|
61
|
-
We use ``util.Trie`` to represent the trie. Its form is a dict of dicts.
|
|
62
|
-
The key True marks the end of a valid MWE.
|
|
63
|
-
|
|
64
|
-
:param mwe: The multi-word expression we're adding into the word trie
|
|
65
|
-
:type mwe: tuple(str) or list(str)
|
|
66
|
-
|
|
67
|
-
:Example:
|
|
68
|
-
|
|
69
|
-
>>> tokenizer = MWETokenizer()
|
|
70
|
-
>>> tokenizer.add_mwe(('a', 'b'))
|
|
71
|
-
>>> tokenizer.add_mwe(('a', 'b', 'c'))
|
|
72
|
-
>>> tokenizer.add_mwe(('a', 'x'))
|
|
73
|
-
>>> expected = {'a': {'x': {True: None}, 'b': {True: None, 'c': {True: None}}}}
|
|
74
|
-
>>> tokenizer._mwes
|
|
75
|
-
True
|
|
76
|
-
|
|
77
|
-
"""
|
|
78
|
-
self._mwes.insert(mwe)
|
|
79
|
-
|
|
80
|
-
def tokenize(self, text):
|
|
81
|
-
"""
|
|
82
|
-
|
|
83
|
-
:param text: A list containing tokenized text
|
|
84
|
-
:type text: list(str)
|
|
85
|
-
:return: A list of the tokenized text with multi-words merged together
|
|
86
|
-
:rtype: list(str)
|
|
87
|
-
|
|
88
|
-
:Example:
|
|
89
|
-
|
|
90
|
-
>>> tokenizer = MWETokenizer([('hors', "d'oeuvre")], separator='+')
|
|
91
|
-
>>> tokenizer.tokenize("An hors d'oeuvre tonight, sir?".split())
|
|
92
|
-
['An', "hors+d'oeuvre", 'tonight,', 'sir?']
|
|
93
|
-
|
|
94
|
-
"""
|
|
95
|
-
i = 0
|
|
96
|
-
n = len(text)
|
|
97
|
-
result = []
|
|
98
|
-
|
|
99
|
-
while i < n:
|
|
100
|
-
if text[i] in self._mwes:
|
|
101
|
-
# possible MWE match
|
|
102
|
-
j = i
|
|
103
|
-
trie = self._mwes
|
|
104
|
-
while j < n and text[j] in trie:
|
|
105
|
-
trie = trie[text[j]]
|
|
106
|
-
j = j + 1
|
|
107
|
-
else:
|
|
108
|
-
if Trie.LEAF in trie:
|
|
109
|
-
# success!
|
|
110
|
-
result.append(self._separator.join(text[i:j]))
|
|
111
|
-
i = j
|
|
112
|
-
else:
|
|
113
|
-
# no match, so backtrack
|
|
114
|
-
result.append(text[i])
|
|
115
|
-
i += 1
|
|
116
|
-
else:
|
|
117
|
-
result.append(text[i])
|
|
118
|
-
i += 1
|
|
119
|
-
|
|
120
|
-
return result
|
|
1
|
+
# Multi-Word Expression tokenizer
|
|
2
|
+
#
|
|
3
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
4
|
+
# Author: Rob Malouf <rmalouf@mail.sdsu.edu>
|
|
5
|
+
# URL: <http://nltk.org/>
|
|
6
|
+
# For license information, see LICENSE.TXT
|
|
7
|
+
|
|
8
|
+
"""
|
|
9
|
+
Multi-Word Expression Tokenizer
|
|
10
|
+
|
|
11
|
+
A ``MWETokenizer`` takes a string which has already been divided into tokens and
|
|
12
|
+
retokenizes it, merging multi-word expressions into single tokens, using a lexicon
|
|
13
|
+
of MWEs:
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
>>> from nltk.tokenize import MWETokenizer
|
|
17
|
+
|
|
18
|
+
>>> tokenizer = MWETokenizer([('a', 'little'), ('a', 'little', 'bit'), ('a', 'lot')])
|
|
19
|
+
>>> tokenizer.add_mwe(('in', 'spite', 'of'))
|
|
20
|
+
|
|
21
|
+
>>> tokenizer.tokenize('Testing testing testing one two three'.split())
|
|
22
|
+
['Testing', 'testing', 'testing', 'one', 'two', 'three']
|
|
23
|
+
|
|
24
|
+
>>> tokenizer.tokenize('This is a test in spite'.split())
|
|
25
|
+
['This', 'is', 'a', 'test', 'in', 'spite']
|
|
26
|
+
|
|
27
|
+
>>> tokenizer.tokenize('In a little or a little bit or a lot in spite of'.split())
|
|
28
|
+
['In', 'a_little', 'or', 'a_little_bit', 'or', 'a_lot', 'in_spite_of']
|
|
29
|
+
|
|
30
|
+
"""
|
|
31
|
+
from nltk.util import Trie
|
|
32
|
+
|
|
33
|
+
from nltk.tokenize.api import TokenizerI
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
class MWETokenizer(TokenizerI):
|
|
37
|
+
"""A tokenizer that processes tokenized text and merges multi-word expressions
|
|
38
|
+
into single tokens.
|
|
39
|
+
"""
|
|
40
|
+
|
|
41
|
+
def __init__(self, mwes=None, separator='_'):
|
|
42
|
+
"""Initialize the multi-word tokenizer with a list of expressions and a
|
|
43
|
+
separator
|
|
44
|
+
|
|
45
|
+
:type mwes: list(list(str))
|
|
46
|
+
:param mwes: A sequence of multi-word expressions to be merged, where
|
|
47
|
+
each MWE is a sequence of strings.
|
|
48
|
+
:type separator: str
|
|
49
|
+
:param separator: String that should be inserted between words in a multi-word
|
|
50
|
+
expression token. (Default is '_')
|
|
51
|
+
|
|
52
|
+
"""
|
|
53
|
+
if not mwes:
|
|
54
|
+
mwes = []
|
|
55
|
+
self._mwes = Trie(mwes)
|
|
56
|
+
self._separator = separator
|
|
57
|
+
|
|
58
|
+
def add_mwe(self, mwe):
|
|
59
|
+
"""Add a multi-word expression to the lexicon (stored as a word trie)
|
|
60
|
+
|
|
61
|
+
We use ``util.Trie`` to represent the trie. Its form is a dict of dicts.
|
|
62
|
+
The key True marks the end of a valid MWE.
|
|
63
|
+
|
|
64
|
+
:param mwe: The multi-word expression we're adding into the word trie
|
|
65
|
+
:type mwe: tuple(str) or list(str)
|
|
66
|
+
|
|
67
|
+
:Example:
|
|
68
|
+
|
|
69
|
+
>>> tokenizer = MWETokenizer()
|
|
70
|
+
>>> tokenizer.add_mwe(('a', 'b'))
|
|
71
|
+
>>> tokenizer.add_mwe(('a', 'b', 'c'))
|
|
72
|
+
>>> tokenizer.add_mwe(('a', 'x'))
|
|
73
|
+
>>> expected = {'a': {'x': {True: None}, 'b': {True: None, 'c': {True: None}}}}
|
|
74
|
+
>>> tokenizer._mwes == expected
|
|
75
|
+
True
|
|
76
|
+
|
|
77
|
+
"""
|
|
78
|
+
self._mwes.insert(mwe)
|
|
79
|
+
|
|
80
|
+
def tokenize(self, text):
|
|
81
|
+
"""
|
|
82
|
+
|
|
83
|
+
:param text: A list containing tokenized text
|
|
84
|
+
:type text: list(str)
|
|
85
|
+
:return: A list of the tokenized text with multi-words merged together
|
|
86
|
+
:rtype: list(str)
|
|
87
|
+
|
|
88
|
+
:Example:
|
|
89
|
+
|
|
90
|
+
>>> tokenizer = MWETokenizer([('hors', "d'oeuvre")], separator='+')
|
|
91
|
+
>>> tokenizer.tokenize("An hors d'oeuvre tonight, sir?".split())
|
|
92
|
+
['An', "hors+d'oeuvre", 'tonight,', 'sir?']
|
|
93
|
+
|
|
94
|
+
"""
|
|
95
|
+
i = 0
|
|
96
|
+
n = len(text)
|
|
97
|
+
result = []
|
|
98
|
+
|
|
99
|
+
while i < n:
|
|
100
|
+
if text[i] in self._mwes:
|
|
101
|
+
# possible MWE match
|
|
102
|
+
j = i
|
|
103
|
+
trie = self._mwes
|
|
104
|
+
while j < n and text[j] in trie:
|
|
105
|
+
trie = trie[text[j]]
|
|
106
|
+
j = j + 1
|
|
107
|
+
else:
|
|
108
|
+
if Trie.LEAF in trie:
|
|
109
|
+
# success!
|
|
110
|
+
result.append(self._separator.join(text[i:j]))
|
|
111
|
+
i = j
|
|
112
|
+
else:
|
|
113
|
+
# no match, so backtrack
|
|
114
|
+
result.append(text[i])
|
|
115
|
+
i += 1
|
|
116
|
+
else:
|
|
117
|
+
result.append(text[i])
|
|
118
|
+
i += 1
|
|
119
|
+
|
|
120
|
+
return result
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Natural Language Toolkit: Python port of the mteval-v14.pl tokenizer.
|
|
3
|
+
#
|
|
4
|
+
# Copyright (C) 2001-2015 NLTK Project
|
|
5
|
+
# Author: Liling Tan (ported from ftp://jaguar.ncsl.nist.gov/mt/resources/mteval-v14.pl)
|
|
6
|
+
# Contributors: Ozan Caglayan, Wiktor Stribizew
|
|
7
|
+
#
|
|
8
|
+
# URL: <http://nltk.sourceforge.net>
|
|
9
|
+
# For license information, see LICENSE.TXT
|
|
10
|
+
|
|
11
|
+
"""
|
|
12
|
+
This is a NLTK port of the tokenizer used in the NIST BLEU evaluation script,
|
|
13
|
+
https://github.com/moses-smt/mosesdecoder/blob/master/scripts/generic/mteval-v14.pl#L926
|
|
14
|
+
which was also ported into Python in
|
|
15
|
+
https://github.com/lium-lst/nmtpy/blob/master/nmtpy/metrics/mtevalbleu.py#L162
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import unicode_literals
|
|
19
|
+
|
|
20
|
+
import io
|
|
21
|
+
import re
|
|
22
|
+
from six import text_type
|
|
23
|
+
|
|
24
|
+
from nltk.corpus import perluniprops
|
|
25
|
+
from nltk.tokenize.api import TokenizerI
|
|
26
|
+
from nltk.tokenize.util import xml_unescape
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
class NISTTokenizer(TokenizerI):
|
|
30
|
+
"""
|
|
31
|
+
This NIST tokenizer is sentence-based instead of the original
|
|
32
|
+
paragraph-based tokenization from mteval-14.pl; The sentence-based
|
|
33
|
+
tokenization is consistent with the other tokenizers available in NLTK.
|
|
34
|
+
|
|
35
|
+
>>> from six import text_type
|
|
36
|
+
>>> from nltk.tokenize.nist import NISTTokenizer
|
|
37
|
+
>>> nist = NISTTokenizer()
|
|
38
|
+
>>> s = "Good muffins cost $3.88 in New York."
|
|
39
|
+
>>> expected_lower = [u'good', u'muffins', u'cost', u'$', u'3.88', u'in', u'new', u'york', u'.']
|
|
40
|
+
>>> expected_cased = [u'Good', u'muffins', u'cost', u'$', u'3.88', u'in', u'New', u'York', u'.']
|
|
41
|
+
>>> nist.tokenize(s, lowercase=False) == expected_cased
|
|
42
|
+
True
|
|
43
|
+
>>> nist.tokenize(s, lowercase=True) == expected_lower # Lowercased.
|
|
44
|
+
True
|
|
45
|
+
|
|
46
|
+
The international_tokenize() is the preferred function when tokenizing
|
|
47
|
+
non-european text, e.g.
|
|
48
|
+
|
|
49
|
+
>>> from nltk.tokenize.nist import NISTTokenizer
|
|
50
|
+
>>> nist = NISTTokenizer()
|
|
51
|
+
|
|
52
|
+
# Input strings.
|
|
53
|
+
>>> albb = u'Alibaba Group Holding Limited (Chinese: 阿里巴巴集团控股 有限公司) us a Chinese e-commerce company...'
|
|
54
|
+
>>> amz = u'Amazon.com, Inc. (/ˈæməzɒn/) is an American electronic commerce...'
|
|
55
|
+
>>> rkt = u'Rakuten, Inc. (楽天株式会社 Rakuten Kabushiki-gaisha) is a Japanese electronic commerce and Internet company based in Tokyo.'
|
|
56
|
+
|
|
57
|
+
# Expected tokens.
|
|
58
|
+
>>> expected_albb = [u'Alibaba', u'Group', u'Holding', u'Limited', u'(', u'Chinese', u':', u'\u963f\u91cc\u5df4\u5df4\u96c6\u56e2\u63a7\u80a1', u'\u6709\u9650\u516c\u53f8', u')']
|
|
59
|
+
>>> expected_amz = [u'Amazon', u'.', u'com', u',', u'Inc', u'.', u'(', u'/', u'\u02c8\xe6', u'm']
|
|
60
|
+
>>> expected_rkt = [u'Rakuten', u',', u'Inc', u'.', u'(', u'\u697d\u5929\u682a\u5f0f\u4f1a\u793e', u'Rakuten', u'Kabushiki', u'-', u'gaisha']
|
|
61
|
+
|
|
62
|
+
>>> nist.international_tokenize(albb)[:10] == expected_albb
|
|
63
|
+
True
|
|
64
|
+
>>> nist.international_tokenize(amz)[:10] == expected_amz
|
|
65
|
+
True
|
|
66
|
+
>>> nist.international_tokenize(rkt)[:10] == expected_rkt
|
|
67
|
+
True
|
|
68
|
+
|
|
69
|
+
# Doctest for patching issue #1926
|
|
70
|
+
>>> sent = u'this is a foo\u2604sentence.'
|
|
71
|
+
>>> expected_sent = [u'this', u'is', u'a', u'foo', u'\u2604', u'sentence', u'.']
|
|
72
|
+
>>> nist.international_tokenize(sent) == expected_sent
|
|
73
|
+
True
|
|
74
|
+
"""
|
|
75
|
+
# Strip "skipped" tags
|
|
76
|
+
STRIP_SKIP = re.compile('<skipped>'), ''
|
|
77
|
+
# Strip end-of-line hyphenation and join lines
|
|
78
|
+
STRIP_EOL_HYPHEN = re.compile(u'\u2028'), ' '
|
|
79
|
+
# Tokenize punctuation.
|
|
80
|
+
PUNCT = re.compile('([\{-\~\[-\` -\&\(-\+\:-\@\/])'), ' \\1 '
|
|
81
|
+
# Tokenize period and comma unless preceded by a digit.
|
|
82
|
+
PERIOD_COMMA_PRECEED = re.compile('([^0-9])([\.,])'), '\\1 \\2 '
|
|
83
|
+
# Tokenize period and comma unless followed by a digit.
|
|
84
|
+
PERIOD_COMMA_FOLLOW = re.compile('([\.,])([^0-9])'), ' \\1 \\2'
|
|
85
|
+
# Tokenize dash when preceded by a digit
|
|
86
|
+
DASH_PRECEED_DIGIT = re.compile('([0-9])(-)'), '\\1 \\2 '
|
|
87
|
+
|
|
88
|
+
LANG_DEPENDENT_REGEXES = [PUNCT, PERIOD_COMMA_PRECEED,
|
|
89
|
+
PERIOD_COMMA_FOLLOW, DASH_PRECEED_DIGIT]
|
|
90
|
+
|
|
91
|
+
# Perluniprops characters used in NIST tokenizer.
|
|
92
|
+
pup_number = text_type(''.join(set(perluniprops.chars('Number')))) # i.e. \p{N}
|
|
93
|
+
pup_punct = text_type(''.join(set(perluniprops.chars('Punctuation')))) # i.e. \p{P}
|
|
94
|
+
pup_symbol = text_type(''.join(set(perluniprops.chars('Symbol')))) # i.e. \p{S}
|
|
95
|
+
|
|
96
|
+
# Python regexes needs to escape some special symbols, see
|
|
97
|
+
# see https://stackoverflow.com/q/45670950/610569
|
|
98
|
+
number_regex = re.sub(r'[]^\\-]', r'\\\g<0>', pup_number)
|
|
99
|
+
punct_regex = re.sub(r'[]^\\-]', r'\\\g<0>', pup_punct)
|
|
100
|
+
symbol_regex = re.sub(r'[]^\\-]', r'\\\g<0>', pup_symbol)
|
|
101
|
+
|
|
102
|
+
# Note: In the original perl implementation, \p{Z} and \p{Zl} were used to
|
|
103
|
+
# (i) strip trailing and heading spaces and
|
|
104
|
+
# (ii) de-deuplicate spaces.
|
|
105
|
+
# In Python, this would do: ' '.join(str.strip().split())
|
|
106
|
+
# Thus, the next two lines were commented out.
|
|
107
|
+
#Line_Separator = text_type(''.join(perluniprops.chars('Line_Separator'))) # i.e. \p{Zl}
|
|
108
|
+
#Separator = text_type(''.join(perluniprops.chars('Separator'))) # i.e. \p{Z}
|
|
109
|
+
|
|
110
|
+
# Pads non-ascii strings with space.
|
|
111
|
+
NONASCII = re.compile('([\x00-\x7f]+)'), r' \1 '
|
|
112
|
+
# Tokenize any punctuation unless followed AND preceded by a digit.
|
|
113
|
+
PUNCT_1 = re.compile(u"([{n}])([{p}])".format(n=number_regex, p=punct_regex)), '\\1 \\2 '
|
|
114
|
+
PUNCT_2 = re.compile(u"([{p}])([{n}])".format(n=number_regex, p=punct_regex)), ' \\1 \\2'
|
|
115
|
+
# Tokenize symbols
|
|
116
|
+
SYMBOLS = re.compile(u"([{s}])".format(s=symbol_regex)), ' \\1 '
|
|
117
|
+
|
|
118
|
+
INTERNATIONAL_REGEXES = [NONASCII, PUNCT_1, PUNCT_2, SYMBOLS]
|
|
119
|
+
|
|
120
|
+
def lang_independent_sub(self, text):
|
|
121
|
+
"""Performs the language independent string substituitions. """
|
|
122
|
+
# It's a strange order of regexes.
|
|
123
|
+
# It'll be better to unescape after STRIP_EOL_HYPHEN
|
|
124
|
+
# but let's keep it close to the original NIST implementation.
|
|
125
|
+
regexp, substitution = self.STRIP_SKIP
|
|
126
|
+
text = regexp.sub(substitution, text)
|
|
127
|
+
text = xml_unescape(text)
|
|
128
|
+
regexp, substitution = self.STRIP_EOL_HYPHEN
|
|
129
|
+
text = regexp.sub(substitution, text)
|
|
130
|
+
return text
|
|
131
|
+
|
|
132
|
+
def tokenize(self, text, lowercase=False,
|
|
133
|
+
western_lang=True, return_str=False):
|
|
134
|
+
text = text_type(text)
|
|
135
|
+
# Language independent regex.
|
|
136
|
+
text = self.lang_independent_sub(text)
|
|
137
|
+
# Language dependent regex.
|
|
138
|
+
if western_lang:
|
|
139
|
+
# Pad string with whitespace.
|
|
140
|
+
text = ' ' + text + ' '
|
|
141
|
+
if lowercase:
|
|
142
|
+
text = text.lower()
|
|
143
|
+
for regexp, substitution in self.LANG_DEPENDENT_REGEXES:
|
|
144
|
+
text = regexp.sub(substitution, text)
|
|
145
|
+
# Remove contiguous whitespaces.
|
|
146
|
+
text = ' '.join(text.split())
|
|
147
|
+
# Finally, strips heading and trailing spaces
|
|
148
|
+
# and converts output string into unicode.
|
|
149
|
+
text = text_type(text.strip())
|
|
150
|
+
return text if return_str else text.split()
|
|
151
|
+
|
|
152
|
+
def international_tokenize(self, text, lowercase=False,
|
|
153
|
+
split_non_ascii=True,
|
|
154
|
+
return_str=False):
|
|
155
|
+
text = text_type(text)
|
|
156
|
+
# Different from the 'normal' tokenize(), STRIP_EOL_HYPHEN is applied
|
|
157
|
+
# first before unescaping.
|
|
158
|
+
regexp, substitution = self.STRIP_SKIP
|
|
159
|
+
text = regexp.sub(substitution, text)
|
|
160
|
+
regexp, substitution = self.STRIP_EOL_HYPHEN
|
|
161
|
+
text = regexp.sub(substitution, text)
|
|
162
|
+
text = xml_unescape(text)
|
|
163
|
+
|
|
164
|
+
if lowercase:
|
|
165
|
+
text = text.lower()
|
|
166
|
+
|
|
167
|
+
for regexp, substitution in self.INTERNATIONAL_REGEXES:
|
|
168
|
+
text = regexp.sub(substitution, text)
|
|
169
|
+
|
|
170
|
+
# Make sure that there's only one space only between words.
|
|
171
|
+
# Strip leading and trailing spaces.
|
|
172
|
+
text = ' '.join(text.strip().split())
|
|
173
|
+
return text if return_str else text.split()
|