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,193 +1,193 @@
|
|
|
1
|
-
# -*- coding: utf-8 -*-
|
|
2
|
-
# Natural Language Toolkit: Language ID module using TextCat algorithm
|
|
3
|
-
#
|
|
4
|
-
# Copyright (C) 2001-
|
|
5
|
-
# Author: Avital Pekker <avital.pekker@utoronto.ca>
|
|
6
|
-
#
|
|
7
|
-
# URL: <http://nltk.org/>
|
|
8
|
-
# For license information, see LICENSE.TXT
|
|
9
|
-
|
|
10
|
-
"""
|
|
11
|
-
A module for language identification using the TextCat algorithm.
|
|
12
|
-
An implementation of the text categorization algorithm
|
|
13
|
-
presented in Cavnar, W. B. and J. M. Trenkle,
|
|
14
|
-
"N-Gram-Based Text Categorization".
|
|
15
|
-
|
|
16
|
-
The algorithm takes advantage of Zipf's law and uses
|
|
17
|
-
n-gram frequencies to profile languages and text-yet to
|
|
18
|
-
be identified-then compares using a distance measure.
|
|
19
|
-
|
|
20
|
-
Language n-grams are provided by the "An Crubadan"
|
|
21
|
-
project. A corpus reader was created seperately to read
|
|
22
|
-
those files.
|
|
23
|
-
|
|
24
|
-
For details regarding the algorithm, see:
|
|
25
|
-
http://www.let.rug.nl/~vannoord/TextCat/textcat.pdf
|
|
26
|
-
|
|
27
|
-
For details about An Crubadan, see:
|
|
28
|
-
http://borel.slu.edu/crubadan/index.html
|
|
29
|
-
"""
|
|
30
|
-
|
|
31
|
-
# Ensure that literal strings default to unicode rather than str.
|
|
32
|
-
from __future__ import print_function, unicode_literals
|
|
33
|
-
|
|
34
|
-
from nltk.compat import PY3
|
|
35
|
-
from nltk.util import trigrams
|
|
36
|
-
|
|
37
|
-
if PY3:
|
|
38
|
-
from sys import maxsize
|
|
39
|
-
else:
|
|
40
|
-
from sys import maxint
|
|
41
|
-
|
|
42
|
-
# Note: this is NOT "re" you're likely used to. The regex module
|
|
43
|
-
# is an alternative to the standard re module that supports
|
|
44
|
-
# Unicode codepoint properties with the \p{} syntax.
|
|
45
|
-
# You may have to "pip install regx"
|
|
46
|
-
try:
|
|
47
|
-
import regex as re
|
|
48
|
-
except ImportError:
|
|
49
|
-
re = None
|
|
50
|
-
######################################################################
|
|
51
|
-
## Language identification using TextCat
|
|
52
|
-
######################################################################
|
|
53
|
-
|
|
54
|
-
class TextCat(object):
|
|
55
|
-
|
|
56
|
-
_corpus = None
|
|
57
|
-
fingerprints = {}
|
|
58
|
-
_START_CHAR = "<"
|
|
59
|
-
_END_CHAR = ">"
|
|
60
|
-
|
|
61
|
-
last_distances = {}
|
|
62
|
-
|
|
63
|
-
def __init__(self):
|
|
64
|
-
if not re:
|
|
65
|
-
raise EnvironmentError("classify.textcat requires the regex module that "
|
|
66
|
-
"supports unicode. Try '$ pip install regex' and "
|
|
67
|
-
"see https://pypi.python.org/pypi/regex for "
|
|
68
|
-
"further details.")
|
|
69
|
-
|
|
70
|
-
from nltk.corpus import crubadan
|
|
71
|
-
self._corpus = crubadan
|
|
72
|
-
# Load all language ngrams into cache
|
|
73
|
-
for lang in self._corpus.langs():
|
|
74
|
-
self._corpus.lang_freq(lang)
|
|
75
|
-
|
|
76
|
-
def remove_punctuation(self, text):
|
|
77
|
-
''' Get rid of punctuation except apostrophes '''
|
|
78
|
-
return re.sub(r"[^\P{P}\']+", "", text)
|
|
79
|
-
|
|
80
|
-
def profile(self, text):
|
|
81
|
-
''' Create FreqDist of trigrams within text '''
|
|
82
|
-
from nltk import word_tokenize, FreqDist
|
|
83
|
-
|
|
84
|
-
clean_text = self.remove_punctuation(text)
|
|
85
|
-
tokens = word_tokenize(clean_text)
|
|
86
|
-
|
|
87
|
-
fingerprint = FreqDist()
|
|
88
|
-
for t in tokens:
|
|
89
|
-
token_trigram_tuples = trigrams(self._START_CHAR + t + self._END_CHAR)
|
|
90
|
-
token_trigrams = [''.join(tri) for tri in token_trigram_tuples]
|
|
91
|
-
|
|
92
|
-
for cur_trigram in token_trigrams:
|
|
93
|
-
if cur_trigram in fingerprint:
|
|
94
|
-
fingerprint[cur_trigram] += 1
|
|
95
|
-
else:
|
|
96
|
-
fingerprint[cur_trigram] = 1
|
|
97
|
-
|
|
98
|
-
return fingerprint
|
|
99
|
-
|
|
100
|
-
def calc_dist(self, lang, trigram, text_profile):
|
|
101
|
-
''' Calculate the "out-of-place" measure between the
|
|
102
|
-
text and language profile for a single trigram '''
|
|
103
|
-
|
|
104
|
-
lang_fd = self._corpus.lang_freq(lang)
|
|
105
|
-
dist = 0
|
|
106
|
-
|
|
107
|
-
if trigram in lang_fd:
|
|
108
|
-
idx_lang_profile = list(lang_fd.keys()).index(trigram)
|
|
109
|
-
idx_text = list(text_profile.keys()).index(trigram)
|
|
110
|
-
|
|
111
|
-
#print(idx_lang_profile, ", ", idx_text)
|
|
112
|
-
dist = abs(idx_lang_profile - idx_text)
|
|
113
|
-
else:
|
|
114
|
-
# Arbitrary but should be larger than
|
|
115
|
-
# any possible trigram file length
|
|
116
|
-
# in terms of total lines
|
|
117
|
-
if PY3:
|
|
118
|
-
dist = maxsize
|
|
119
|
-
else:
|
|
120
|
-
dist = maxint
|
|
121
|
-
|
|
122
|
-
return dist
|
|
123
|
-
|
|
124
|
-
def lang_dists(self, text):
|
|
125
|
-
''' Calculate the "out-of-place" measure between
|
|
126
|
-
the text and all languages '''
|
|
127
|
-
|
|
128
|
-
distances = {}
|
|
129
|
-
profile = self.profile(text)
|
|
130
|
-
# For all the languages
|
|
131
|
-
for lang in self._corpus._all_lang_freq.keys():
|
|
132
|
-
# Calculate distance metric for every trigram in
|
|
133
|
-
# input text to be identified
|
|
134
|
-
lang_dist = 0
|
|
135
|
-
for trigram in profile:
|
|
136
|
-
lang_dist += self.calc_dist(lang, trigram, profile)
|
|
137
|
-
|
|
138
|
-
distances[lang] = lang_dist
|
|
139
|
-
|
|
140
|
-
return distances
|
|
141
|
-
|
|
142
|
-
def guess_language(self, text):
|
|
143
|
-
''' Find the language with the min distance
|
|
144
|
-
to the text and return its ISO 639-3 code '''
|
|
145
|
-
self.last_distances = self.lang_dists(text)
|
|
146
|
-
|
|
147
|
-
return min(self.last_distances, key=self.last_distances.get)
|
|
148
|
-
#################################################')
|
|
149
|
-
|
|
150
|
-
def demo():
|
|
151
|
-
from nltk.corpus import udhr
|
|
152
|
-
|
|
153
|
-
langs = ['Kurdish-UTF8', 'Abkhaz-UTF8', 'Farsi_Persian-UTF8',
|
|
154
|
-
'Hindi-UTF8', 'Hawaiian-UTF8', 'Russian-UTF8', 'Vietnamese-UTF8',
|
|
155
|
-
'Serbian_Srpski-UTF8','Esperanto-UTF8']
|
|
156
|
-
|
|
157
|
-
friendly = {'kmr':'Northern Kurdish',
|
|
158
|
-
'abk':'Abkhazian',
|
|
159
|
-
'pes':'Iranian Persian',
|
|
160
|
-
'hin':'Hindi',
|
|
161
|
-
'haw':'Hawaiian',
|
|
162
|
-
'rus':'Russian',
|
|
163
|
-
'vie':'Vietnamese',
|
|
164
|
-
'srp':'Serbian',
|
|
165
|
-
'epo':'Esperanto'}
|
|
166
|
-
|
|
167
|
-
tc = TextCat()
|
|
168
|
-
|
|
169
|
-
for cur_lang in langs:
|
|
170
|
-
# Get raw data from UDHR corpus
|
|
171
|
-
raw_sentences = udhr.sents(cur_lang)
|
|
172
|
-
rows = len(raw_sentences) - 1
|
|
173
|
-
cols = list(map(len, raw_sentences))
|
|
174
|
-
|
|
175
|
-
sample = ''
|
|
176
|
-
|
|
177
|
-
# Generate a sample text of the language
|
|
178
|
-
for i in range(0, rows):
|
|
179
|
-
cur_sent = ''
|
|
180
|
-
for j in range(0, cols[i]):
|
|
181
|
-
cur_sent += ' ' + raw_sentences[i][j]
|
|
182
|
-
|
|
183
|
-
sample += cur_sent
|
|
184
|
-
|
|
185
|
-
# Try to detect what it is
|
|
186
|
-
print('Language snippet: ' + sample[0:140] + '...')
|
|
187
|
-
guess = tc.guess_language(sample)
|
|
188
|
-
print('Language detection: %s (%s)' % (guess, friendly[guess]))
|
|
189
|
-
print('#' * 140)
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
if __name__ == '__main__':
|
|
193
|
-
demo()
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Natural Language Toolkit: Language ID module using TextCat algorithm
|
|
3
|
+
#
|
|
4
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
5
|
+
# Author: Avital Pekker <avital.pekker@utoronto.ca>
|
|
6
|
+
#
|
|
7
|
+
# URL: <http://nltk.org/>
|
|
8
|
+
# For license information, see LICENSE.TXT
|
|
9
|
+
|
|
10
|
+
"""
|
|
11
|
+
A module for language identification using the TextCat algorithm.
|
|
12
|
+
An implementation of the text categorization algorithm
|
|
13
|
+
presented in Cavnar, W. B. and J. M. Trenkle,
|
|
14
|
+
"N-Gram-Based Text Categorization".
|
|
15
|
+
|
|
16
|
+
The algorithm takes advantage of Zipf's law and uses
|
|
17
|
+
n-gram frequencies to profile languages and text-yet to
|
|
18
|
+
be identified-then compares using a distance measure.
|
|
19
|
+
|
|
20
|
+
Language n-grams are provided by the "An Crubadan"
|
|
21
|
+
project. A corpus reader was created seperately to read
|
|
22
|
+
those files.
|
|
23
|
+
|
|
24
|
+
For details regarding the algorithm, see:
|
|
25
|
+
http://www.let.rug.nl/~vannoord/TextCat/textcat.pdf
|
|
26
|
+
|
|
27
|
+
For details about An Crubadan, see:
|
|
28
|
+
http://borel.slu.edu/crubadan/index.html
|
|
29
|
+
"""
|
|
30
|
+
|
|
31
|
+
# Ensure that literal strings default to unicode rather than str.
|
|
32
|
+
from __future__ import print_function, unicode_literals
|
|
33
|
+
|
|
34
|
+
from nltk.compat import PY3
|
|
35
|
+
from nltk.util import trigrams
|
|
36
|
+
|
|
37
|
+
if PY3:
|
|
38
|
+
from sys import maxsize
|
|
39
|
+
else:
|
|
40
|
+
from sys import maxint
|
|
41
|
+
|
|
42
|
+
# Note: this is NOT "re" you're likely used to. The regex module
|
|
43
|
+
# is an alternative to the standard re module that supports
|
|
44
|
+
# Unicode codepoint properties with the \p{} syntax.
|
|
45
|
+
# You may have to "pip install regx"
|
|
46
|
+
try:
|
|
47
|
+
import regex as re
|
|
48
|
+
except ImportError:
|
|
49
|
+
re = None
|
|
50
|
+
######################################################################
|
|
51
|
+
## Language identification using TextCat
|
|
52
|
+
######################################################################
|
|
53
|
+
|
|
54
|
+
class TextCat(object):
|
|
55
|
+
|
|
56
|
+
_corpus = None
|
|
57
|
+
fingerprints = {}
|
|
58
|
+
_START_CHAR = "<"
|
|
59
|
+
_END_CHAR = ">"
|
|
60
|
+
|
|
61
|
+
last_distances = {}
|
|
62
|
+
|
|
63
|
+
def __init__(self):
|
|
64
|
+
if not re:
|
|
65
|
+
raise EnvironmentError("classify.textcat requires the regex module that "
|
|
66
|
+
"supports unicode. Try '$ pip install regex' and "
|
|
67
|
+
"see https://pypi.python.org/pypi/regex for "
|
|
68
|
+
"further details.")
|
|
69
|
+
|
|
70
|
+
from nltk.corpus import crubadan
|
|
71
|
+
self._corpus = crubadan
|
|
72
|
+
# Load all language ngrams into cache
|
|
73
|
+
for lang in self._corpus.langs():
|
|
74
|
+
self._corpus.lang_freq(lang)
|
|
75
|
+
|
|
76
|
+
def remove_punctuation(self, text):
|
|
77
|
+
''' Get rid of punctuation except apostrophes '''
|
|
78
|
+
return re.sub(r"[^\P{P}\']+", "", text)
|
|
79
|
+
|
|
80
|
+
def profile(self, text):
|
|
81
|
+
''' Create FreqDist of trigrams within text '''
|
|
82
|
+
from nltk import word_tokenize, FreqDist
|
|
83
|
+
|
|
84
|
+
clean_text = self.remove_punctuation(text)
|
|
85
|
+
tokens = word_tokenize(clean_text)
|
|
86
|
+
|
|
87
|
+
fingerprint = FreqDist()
|
|
88
|
+
for t in tokens:
|
|
89
|
+
token_trigram_tuples = trigrams(self._START_CHAR + t + self._END_CHAR)
|
|
90
|
+
token_trigrams = [''.join(tri) for tri in token_trigram_tuples]
|
|
91
|
+
|
|
92
|
+
for cur_trigram in token_trigrams:
|
|
93
|
+
if cur_trigram in fingerprint:
|
|
94
|
+
fingerprint[cur_trigram] += 1
|
|
95
|
+
else:
|
|
96
|
+
fingerprint[cur_trigram] = 1
|
|
97
|
+
|
|
98
|
+
return fingerprint
|
|
99
|
+
|
|
100
|
+
def calc_dist(self, lang, trigram, text_profile):
|
|
101
|
+
''' Calculate the "out-of-place" measure between the
|
|
102
|
+
text and language profile for a single trigram '''
|
|
103
|
+
|
|
104
|
+
lang_fd = self._corpus.lang_freq(lang)
|
|
105
|
+
dist = 0
|
|
106
|
+
|
|
107
|
+
if trigram in lang_fd:
|
|
108
|
+
idx_lang_profile = list(lang_fd.keys()).index(trigram)
|
|
109
|
+
idx_text = list(text_profile.keys()).index(trigram)
|
|
110
|
+
|
|
111
|
+
#print(idx_lang_profile, ", ", idx_text)
|
|
112
|
+
dist = abs(idx_lang_profile - idx_text)
|
|
113
|
+
else:
|
|
114
|
+
# Arbitrary but should be larger than
|
|
115
|
+
# any possible trigram file length
|
|
116
|
+
# in terms of total lines
|
|
117
|
+
if PY3:
|
|
118
|
+
dist = maxsize
|
|
119
|
+
else:
|
|
120
|
+
dist = maxint
|
|
121
|
+
|
|
122
|
+
return dist
|
|
123
|
+
|
|
124
|
+
def lang_dists(self, text):
|
|
125
|
+
''' Calculate the "out-of-place" measure between
|
|
126
|
+
the text and all languages '''
|
|
127
|
+
|
|
128
|
+
distances = {}
|
|
129
|
+
profile = self.profile(text)
|
|
130
|
+
# For all the languages
|
|
131
|
+
for lang in self._corpus._all_lang_freq.keys():
|
|
132
|
+
# Calculate distance metric for every trigram in
|
|
133
|
+
# input text to be identified
|
|
134
|
+
lang_dist = 0
|
|
135
|
+
for trigram in profile:
|
|
136
|
+
lang_dist += self.calc_dist(lang, trigram, profile)
|
|
137
|
+
|
|
138
|
+
distances[lang] = lang_dist
|
|
139
|
+
|
|
140
|
+
return distances
|
|
141
|
+
|
|
142
|
+
def guess_language(self, text):
|
|
143
|
+
''' Find the language with the min distance
|
|
144
|
+
to the text and return its ISO 639-3 code '''
|
|
145
|
+
self.last_distances = self.lang_dists(text)
|
|
146
|
+
|
|
147
|
+
return min(self.last_distances, key=self.last_distances.get)
|
|
148
|
+
#################################################')
|
|
149
|
+
|
|
150
|
+
def demo():
|
|
151
|
+
from nltk.corpus import udhr
|
|
152
|
+
|
|
153
|
+
langs = ['Kurdish-UTF8', 'Abkhaz-UTF8', 'Farsi_Persian-UTF8',
|
|
154
|
+
'Hindi-UTF8', 'Hawaiian-UTF8', 'Russian-UTF8', 'Vietnamese-UTF8',
|
|
155
|
+
'Serbian_Srpski-UTF8','Esperanto-UTF8']
|
|
156
|
+
|
|
157
|
+
friendly = {'kmr':'Northern Kurdish',
|
|
158
|
+
'abk':'Abkhazian',
|
|
159
|
+
'pes':'Iranian Persian',
|
|
160
|
+
'hin':'Hindi',
|
|
161
|
+
'haw':'Hawaiian',
|
|
162
|
+
'rus':'Russian',
|
|
163
|
+
'vie':'Vietnamese',
|
|
164
|
+
'srp':'Serbian',
|
|
165
|
+
'epo':'Esperanto'}
|
|
166
|
+
|
|
167
|
+
tc = TextCat()
|
|
168
|
+
|
|
169
|
+
for cur_lang in langs:
|
|
170
|
+
# Get raw data from UDHR corpus
|
|
171
|
+
raw_sentences = udhr.sents(cur_lang)
|
|
172
|
+
rows = len(raw_sentences) - 1
|
|
173
|
+
cols = list(map(len, raw_sentences))
|
|
174
|
+
|
|
175
|
+
sample = ''
|
|
176
|
+
|
|
177
|
+
# Generate a sample text of the language
|
|
178
|
+
for i in range(0, rows):
|
|
179
|
+
cur_sent = ''
|
|
180
|
+
for j in range(0, cols[i]):
|
|
181
|
+
cur_sent += ' ' + raw_sentences[i][j]
|
|
182
|
+
|
|
183
|
+
sample += cur_sent
|
|
184
|
+
|
|
185
|
+
# Try to detect what it is
|
|
186
|
+
print('Language snippet: ' + sample[0:140] + '...')
|
|
187
|
+
guess = tc.guess_language(sample)
|
|
188
|
+
print('Language detection: %s (%s)' % (guess, friendly[guess]))
|
|
189
|
+
print('#' * 140)
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
if __name__ == '__main__':
|
|
193
|
+
demo()
|