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,387 +1,392 @@
|
|
|
1
|
-
# Natural Language Toolkit: XML Corpus Reader
|
|
2
|
-
#
|
|
3
|
-
# Copyright (C) 2001-
|
|
4
|
-
# Author: Steven Bird <stevenbird1@gmail.com>
|
|
5
|
-
# URL: <http://nltk.org/>
|
|
6
|
-
# For license information, see LICENSE.TXT
|
|
7
|
-
|
|
8
|
-
"""
|
|
9
|
-
Corpus reader for corpora whose documents are xml files.
|
|
10
|
-
|
|
11
|
-
(note -- not named 'xml' to avoid conflicting w/ standard xml package)
|
|
12
|
-
"""
|
|
13
|
-
from __future__ import print_function, unicode_literals
|
|
14
|
-
|
|
15
|
-
import codecs
|
|
16
|
-
|
|
17
|
-
# Use the c version of ElementTree, which is faster, if possible:
|
|
18
|
-
try: from xml.etree import cElementTree as ElementTree
|
|
19
|
-
except ImportError: from xml.etree import ElementTree
|
|
20
|
-
|
|
21
|
-
from
|
|
22
|
-
|
|
23
|
-
from nltk.
|
|
24
|
-
from nltk.
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
from nltk.corpus.reader.
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
:
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
XML
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
- ``'foo
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
#:
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
``
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
:
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
s = infile.readline()
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
if
|
|
175
|
-
return
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
:
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
#:
|
|
223
|
-
#:
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
#
|
|
232
|
-
(?P<
|
|
233
|
-
(?P<
|
|
234
|
-
(?P<
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
#
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
if
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
#
|
|
315
|
-
|
|
316
|
-
if
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
context.
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
#
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
1
|
+
# Natural Language Toolkit: XML Corpus Reader
|
|
2
|
+
#
|
|
3
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
4
|
+
# Author: Steven Bird <stevenbird1@gmail.com>
|
|
5
|
+
# URL: <http://nltk.org/>
|
|
6
|
+
# For license information, see LICENSE.TXT
|
|
7
|
+
|
|
8
|
+
"""
|
|
9
|
+
Corpus reader for corpora whose documents are xml files.
|
|
10
|
+
|
|
11
|
+
(note -- not named 'xml' to avoid conflicting w/ standard xml package)
|
|
12
|
+
"""
|
|
13
|
+
from __future__ import print_function, unicode_literals
|
|
14
|
+
|
|
15
|
+
import codecs
|
|
16
|
+
|
|
17
|
+
# Use the c version of ElementTree, which is faster, if possible:
|
|
18
|
+
try: from xml.etree import cElementTree as ElementTree
|
|
19
|
+
except ImportError: from xml.etree import ElementTree
|
|
20
|
+
|
|
21
|
+
from six import string_types
|
|
22
|
+
|
|
23
|
+
from nltk.data import SeekableUnicodeStreamReader
|
|
24
|
+
from nltk.tokenize import WordPunctTokenizer
|
|
25
|
+
from nltk.internals import ElementWrapper
|
|
26
|
+
|
|
27
|
+
from nltk.corpus.reader.api import CorpusReader
|
|
28
|
+
from nltk.corpus.reader.util import *
|
|
29
|
+
|
|
30
|
+
class XMLCorpusReader(CorpusReader):
|
|
31
|
+
"""
|
|
32
|
+
Corpus reader for corpora whose documents are xml files.
|
|
33
|
+
|
|
34
|
+
Note that the ``XMLCorpusReader`` constructor does not take an
|
|
35
|
+
``encoding`` argument, because the unicode encoding is specified by
|
|
36
|
+
the XML files themselves. See the XML specs for more info.
|
|
37
|
+
"""
|
|
38
|
+
def __init__(self, root, fileids, wrap_etree=False):
|
|
39
|
+
self._wrap_etree = wrap_etree
|
|
40
|
+
CorpusReader.__init__(self, root, fileids)
|
|
41
|
+
|
|
42
|
+
def xml(self, fileid=None):
|
|
43
|
+
# Make sure we have exactly one file -- no concatenating XML.
|
|
44
|
+
if fileid is None and len(self._fileids) == 1:
|
|
45
|
+
fileid = self._fileids[0]
|
|
46
|
+
if not isinstance(fileid, string_types):
|
|
47
|
+
raise TypeError('Expected a single file identifier string')
|
|
48
|
+
# Read the XML in using ElementTree.
|
|
49
|
+
elt = ElementTree.parse(self.abspath(fileid).open()).getroot()
|
|
50
|
+
# If requested, wrap it.
|
|
51
|
+
if self._wrap_etree:
|
|
52
|
+
elt = ElementWrapper(elt)
|
|
53
|
+
# Return the ElementTree element.
|
|
54
|
+
return elt
|
|
55
|
+
|
|
56
|
+
def words(self, fileid=None):
|
|
57
|
+
"""
|
|
58
|
+
Returns all of the words and punctuation symbols in the specified file
|
|
59
|
+
that were in text nodes -- ie, tags are ignored. Like the xml() method,
|
|
60
|
+
fileid can only specify one file.
|
|
61
|
+
|
|
62
|
+
:return: the given file's text nodes as a list of words and punctuation symbols
|
|
63
|
+
:rtype: list(str)
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
elt = self.xml(fileid)
|
|
67
|
+
encoding = self.encoding(fileid)
|
|
68
|
+
word_tokenizer=WordPunctTokenizer()
|
|
69
|
+
iterator = elt.getiterator()
|
|
70
|
+
out = []
|
|
71
|
+
|
|
72
|
+
for node in iterator:
|
|
73
|
+
text = node.text
|
|
74
|
+
if text is not None:
|
|
75
|
+
if isinstance(text, bytes):
|
|
76
|
+
text = text.decode(encoding)
|
|
77
|
+
toks = word_tokenizer.tokenize(text)
|
|
78
|
+
out.extend(toks)
|
|
79
|
+
return out
|
|
80
|
+
|
|
81
|
+
def raw(self, fileids=None):
|
|
82
|
+
if fileids is None: fileids = self._fileids
|
|
83
|
+
elif isinstance(fileids, string_types): fileids = [fileids]
|
|
84
|
+
return concat([self.open(f).read() for f in fileids])
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class XMLCorpusView(StreamBackedCorpusView):
|
|
88
|
+
"""
|
|
89
|
+
A corpus view that selects out specified elements from an XML
|
|
90
|
+
file, and provides a flat list-like interface for accessing them.
|
|
91
|
+
(Note: ``XMLCorpusView`` is not used by ``XMLCorpusReader`` itself,
|
|
92
|
+
but may be used by subclasses of ``XMLCorpusReader``.)
|
|
93
|
+
|
|
94
|
+
Every XML corpus view has a "tag specification", indicating what
|
|
95
|
+
XML elements should be included in the view; and each (non-nested)
|
|
96
|
+
element that matches this specification corresponds to one item in
|
|
97
|
+
the view. Tag specifications are regular expressions over tag
|
|
98
|
+
paths, where a tag path is a list of element tag names, separated
|
|
99
|
+
by '/', indicating the ancestry of the element. Some examples:
|
|
100
|
+
|
|
101
|
+
- ``'foo'``: A top-level element whose tag is ``foo``.
|
|
102
|
+
- ``'foo/bar'``: An element whose tag is ``bar`` and whose parent
|
|
103
|
+
is a top-level element whose tag is ``foo``.
|
|
104
|
+
- ``'.*/foo'``: An element whose tag is ``foo``, appearing anywhere
|
|
105
|
+
in the xml tree.
|
|
106
|
+
- ``'.*/(foo|bar)'``: An wlement whose tag is ``foo`` or ``bar``,
|
|
107
|
+
appearing anywhere in the xml tree.
|
|
108
|
+
|
|
109
|
+
The view items are generated from the selected XML elements via
|
|
110
|
+
the method ``handle_elt()``. By default, this method returns the
|
|
111
|
+
element as-is (i.e., as an ElementTree object); but it can be
|
|
112
|
+
overridden, either via subclassing or via the ``elt_handler``
|
|
113
|
+
constructor parameter.
|
|
114
|
+
"""
|
|
115
|
+
|
|
116
|
+
#: If true, then display debugging output to stdout when reading
|
|
117
|
+
#: blocks.
|
|
118
|
+
_DEBUG = False
|
|
119
|
+
|
|
120
|
+
#: The number of characters read at a time by this corpus reader.
|
|
121
|
+
_BLOCK_SIZE = 1024
|
|
122
|
+
|
|
123
|
+
def __init__(self, fileid, tagspec, elt_handler=None):
|
|
124
|
+
"""
|
|
125
|
+
Create a new corpus view based on a specified XML file.
|
|
126
|
+
|
|
127
|
+
Note that the ``XMLCorpusView`` constructor does not take an
|
|
128
|
+
``encoding`` argument, because the unicode encoding is
|
|
129
|
+
specified by the XML files themselves.
|
|
130
|
+
|
|
131
|
+
:type tagspec: str
|
|
132
|
+
:param tagspec: A tag specification, indicating what XML
|
|
133
|
+
elements should be included in the view. Each non-nested
|
|
134
|
+
element that matches this specification corresponds to one
|
|
135
|
+
item in the view.
|
|
136
|
+
|
|
137
|
+
:param elt_handler: A function used to transform each element
|
|
138
|
+
to a value for the view. If no handler is specified, then
|
|
139
|
+
``self.handle_elt()`` is called, which returns the element
|
|
140
|
+
as an ElementTree object. The signature of elt_handler is::
|
|
141
|
+
|
|
142
|
+
elt_handler(elt, tagspec) -> value
|
|
143
|
+
"""
|
|
144
|
+
if elt_handler: self.handle_elt = elt_handler
|
|
145
|
+
|
|
146
|
+
self._tagspec = re.compile(tagspec+r'\Z')
|
|
147
|
+
"""The tag specification for this corpus view."""
|
|
148
|
+
|
|
149
|
+
self._tag_context = {0: ()}
|
|
150
|
+
"""A dictionary mapping from file positions (as returned by
|
|
151
|
+
``stream.seek()`` to XML contexts. An XML context is a
|
|
152
|
+
tuple of XML tag names, indicating which tags have not yet
|
|
153
|
+
been closed."""
|
|
154
|
+
|
|
155
|
+
encoding = self._detect_encoding(fileid)
|
|
156
|
+
StreamBackedCorpusView.__init__(self, fileid, encoding=encoding)
|
|
157
|
+
|
|
158
|
+
def _detect_encoding(self, fileid):
|
|
159
|
+
if isinstance(fileid, PathPointer):
|
|
160
|
+
try:
|
|
161
|
+
infile = fileid.open()
|
|
162
|
+
s = infile.readline()
|
|
163
|
+
finally:
|
|
164
|
+
infile.close()
|
|
165
|
+
else:
|
|
166
|
+
with open(fileid, 'rb') as infile:
|
|
167
|
+
s = infile.readline()
|
|
168
|
+
if s.startswith(codecs.BOM_UTF16_BE):
|
|
169
|
+
return 'utf-16-be'
|
|
170
|
+
if s.startswith(codecs.BOM_UTF16_LE):
|
|
171
|
+
return 'utf-16-le'
|
|
172
|
+
if s.startswith(codecs.BOM_UTF32_BE):
|
|
173
|
+
return 'utf-32-be'
|
|
174
|
+
if s.startswith(codecs.BOM_UTF32_LE):
|
|
175
|
+
return 'utf-32-le'
|
|
176
|
+
if s.startswith(codecs.BOM_UTF8):
|
|
177
|
+
return 'utf-8'
|
|
178
|
+
m = re.match(br'\s*<\?xml\b.*\bencoding="([^"]+)"', s)
|
|
179
|
+
if m:
|
|
180
|
+
return m.group(1).decode()
|
|
181
|
+
m = re.match(br"\s*<\?xml\b.*\bencoding='([^']+)'", s)
|
|
182
|
+
if m:
|
|
183
|
+
return m.group(1).decode()
|
|
184
|
+
# No encoding found -- what should the default be?
|
|
185
|
+
return 'utf-8'
|
|
186
|
+
|
|
187
|
+
def handle_elt(self, elt, context):
|
|
188
|
+
"""
|
|
189
|
+
Convert an element into an appropriate value for inclusion in
|
|
190
|
+
the view. Unless overridden by a subclass or by the
|
|
191
|
+
``elt_handler`` constructor argument, this method simply
|
|
192
|
+
returns ``elt``.
|
|
193
|
+
|
|
194
|
+
:return: The view value corresponding to ``elt``.
|
|
195
|
+
|
|
196
|
+
:type elt: ElementTree
|
|
197
|
+
:param elt: The element that should be converted.
|
|
198
|
+
|
|
199
|
+
:type context: str
|
|
200
|
+
:param context: A string composed of element tags separated by
|
|
201
|
+
forward slashes, indicating the XML context of the given
|
|
202
|
+
element. For example, the string ``'foo/bar/baz'``
|
|
203
|
+
indicates that the element is a ``baz`` element whose
|
|
204
|
+
parent is a ``bar`` element and whose grandparent is a
|
|
205
|
+
top-level ``foo`` element.
|
|
206
|
+
"""
|
|
207
|
+
return elt
|
|
208
|
+
|
|
209
|
+
#: A regular expression that matches XML fragments that do not
|
|
210
|
+
#: contain any un-closed tags.
|
|
211
|
+
_VALID_XML_RE = re.compile(r"""
|
|
212
|
+
[^<]*
|
|
213
|
+
(
|
|
214
|
+
((<!--.*?-->) | # comment
|
|
215
|
+
(<![CDATA[.*?]]) | # raw character data
|
|
216
|
+
(<!DOCTYPE\s+[^\[]*(\[[^\]]*])?\s*>) | # doctype decl
|
|
217
|
+
(<[^!>][^>]*>)) # tag or PI
|
|
218
|
+
[^<]*)*
|
|
219
|
+
\Z""",
|
|
220
|
+
re.DOTALL|re.VERBOSE)
|
|
221
|
+
|
|
222
|
+
#: A regular expression used to extract the tag name from a start tag,
|
|
223
|
+
#: end tag, or empty-elt tag string.
|
|
224
|
+
_XML_TAG_NAME = re.compile('<\s*/?\s*([^\s>]+)')
|
|
225
|
+
|
|
226
|
+
#: A regular expression used to find all start-tags, end-tags, and
|
|
227
|
+
#: emtpy-elt tags in an XML file. This regexp is more lenient than
|
|
228
|
+
#: the XML spec -- e.g., it allows spaces in some places where the
|
|
229
|
+
#: spec does not.
|
|
230
|
+
_XML_PIECE = re.compile(r"""
|
|
231
|
+
# Include these so we can skip them:
|
|
232
|
+
(?P<COMMENT> <!--.*?--> )|
|
|
233
|
+
(?P<CDATA> <![CDATA[.*?]]> )|
|
|
234
|
+
(?P<PI> <\?.*?\?> )|
|
|
235
|
+
(?P<DOCTYPE> <!DOCTYPE\s+[^\[^>]*(\[[^\]]*])?\s*>)|
|
|
236
|
+
# These are the ones we actually care about:
|
|
237
|
+
(?P<EMPTY_ELT_TAG> <\s*[^>/\?!\s][^>]*/\s*> )|
|
|
238
|
+
(?P<START_TAG> <\s*[^>/\?!\s][^>]*> )|
|
|
239
|
+
(?P<END_TAG> <\s*/[^>/\?!\s][^>]*> )""",
|
|
240
|
+
re.DOTALL|re.VERBOSE)
|
|
241
|
+
|
|
242
|
+
def _read_xml_fragment(self, stream):
|
|
243
|
+
"""
|
|
244
|
+
Read a string from the given stream that does not contain any
|
|
245
|
+
un-closed tags. In particular, this function first reads a
|
|
246
|
+
block from the stream of size ``self._BLOCK_SIZE``. It then
|
|
247
|
+
checks if that block contains an un-closed tag. If it does,
|
|
248
|
+
then this function either backtracks to the last '<', or reads
|
|
249
|
+
another block.
|
|
250
|
+
"""
|
|
251
|
+
fragment = ''
|
|
252
|
+
|
|
253
|
+
if isinstance(stream, SeekableUnicodeStreamReader):
|
|
254
|
+
startpos = stream.tell()
|
|
255
|
+
while True:
|
|
256
|
+
# Read a block and add it to the fragment.
|
|
257
|
+
xml_block = stream.read(self._BLOCK_SIZE)
|
|
258
|
+
fragment += xml_block
|
|
259
|
+
|
|
260
|
+
# Do we have a well-formed xml fragment?
|
|
261
|
+
if self._VALID_XML_RE.match(fragment):
|
|
262
|
+
return fragment
|
|
263
|
+
|
|
264
|
+
# Do we have a fragment that will never be well-formed?
|
|
265
|
+
if re.search('[<>]', fragment).group(0) == '>':
|
|
266
|
+
pos = stream.tell() - (
|
|
267
|
+
len(fragment)-re.search('[<>]', fragment).end())
|
|
268
|
+
raise ValueError('Unexpected ">" near char %s' % pos)
|
|
269
|
+
|
|
270
|
+
# End of file?
|
|
271
|
+
if not xml_block:
|
|
272
|
+
raise ValueError('Unexpected end of file: tag not closed')
|
|
273
|
+
|
|
274
|
+
# If not, then we must be in the middle of a <..tag..>.
|
|
275
|
+
# If appropriate, backtrack to the most recent '<'
|
|
276
|
+
# character.
|
|
277
|
+
last_open_bracket = fragment.rfind('<')
|
|
278
|
+
if last_open_bracket > 0:
|
|
279
|
+
if self._VALID_XML_RE.match(fragment[:last_open_bracket]):
|
|
280
|
+
if isinstance(stream, SeekableUnicodeStreamReader):
|
|
281
|
+
stream.seek(startpos)
|
|
282
|
+
stream.char_seek_forward(last_open_bracket)
|
|
283
|
+
else:
|
|
284
|
+
stream.seek(-(len(fragment)-last_open_bracket), 1)
|
|
285
|
+
return fragment[:last_open_bracket]
|
|
286
|
+
|
|
287
|
+
# Otherwise, read another block. (i.e., return to the
|
|
288
|
+
# top of the loop.)
|
|
289
|
+
|
|
290
|
+
def read_block(self, stream, tagspec=None, elt_handler=None):
|
|
291
|
+
"""
|
|
292
|
+
Read from ``stream`` until we find at least one element that
|
|
293
|
+
matches ``tagspec``, and return the result of applying
|
|
294
|
+
``elt_handler`` to each element found.
|
|
295
|
+
"""
|
|
296
|
+
if tagspec is None: tagspec = self._tagspec
|
|
297
|
+
if elt_handler is None: elt_handler = self.handle_elt
|
|
298
|
+
|
|
299
|
+
# Use a stack of strings to keep track of our context:
|
|
300
|
+
context = list(self._tag_context.get(stream.tell()))
|
|
301
|
+
assert context is not None # check this -- could it ever happen?
|
|
302
|
+
|
|
303
|
+
elts = []
|
|
304
|
+
|
|
305
|
+
elt_start = None # where does the elt start
|
|
306
|
+
elt_depth = None # what context depth
|
|
307
|
+
elt_text = ''
|
|
308
|
+
|
|
309
|
+
while elts==[] or elt_start is not None:
|
|
310
|
+
if isinstance(stream, SeekableUnicodeStreamReader):
|
|
311
|
+
startpos = stream.tell()
|
|
312
|
+
xml_fragment = self._read_xml_fragment(stream)
|
|
313
|
+
|
|
314
|
+
# End of file.
|
|
315
|
+
if not xml_fragment:
|
|
316
|
+
if elt_start is None: break
|
|
317
|
+
else: raise ValueError('Unexpected end of file')
|
|
318
|
+
|
|
319
|
+
# Process each <tag> in the xml fragment.
|
|
320
|
+
for piece in self._XML_PIECE.finditer(xml_fragment):
|
|
321
|
+
if self._DEBUG:
|
|
322
|
+
print('%25s %s' % ('/'.join(context)[-20:], piece.group()))
|
|
323
|
+
|
|
324
|
+
if piece.group('START_TAG'):
|
|
325
|
+
name = self._XML_TAG_NAME.match(piece.group()).group(1)
|
|
326
|
+
# Keep context up-to-date.
|
|
327
|
+
context.append(name)
|
|
328
|
+
# Is this one of the elts we're looking for?
|
|
329
|
+
if elt_start is None:
|
|
330
|
+
if re.match(tagspec, '/'.join(context)):
|
|
331
|
+
elt_start = piece.start()
|
|
332
|
+
elt_depth = len(context)
|
|
333
|
+
|
|
334
|
+
elif piece.group('END_TAG'):
|
|
335
|
+
name = self._XML_TAG_NAME.match(piece.group()).group(1)
|
|
336
|
+
# sanity checks:
|
|
337
|
+
if not context:
|
|
338
|
+
raise ValueError('Unmatched tag </%s>' % name)
|
|
339
|
+
if name != context[-1]:
|
|
340
|
+
raise ValueError('Unmatched tag <%s>...</%s>' %
|
|
341
|
+
(context[-1], name))
|
|
342
|
+
# Is this the end of an element?
|
|
343
|
+
if elt_start is not None and elt_depth == len(context):
|
|
344
|
+
elt_text += xml_fragment[elt_start:piece.end()]
|
|
345
|
+
elts.append( (elt_text, '/'.join(context)) )
|
|
346
|
+
elt_start = elt_depth = None
|
|
347
|
+
elt_text = ''
|
|
348
|
+
# Keep context up-to-date
|
|
349
|
+
context.pop()
|
|
350
|
+
|
|
351
|
+
elif piece.group('EMPTY_ELT_TAG'):
|
|
352
|
+
name = self._XML_TAG_NAME.match(piece.group()).group(1)
|
|
353
|
+
if elt_start is None:
|
|
354
|
+
if re.match(tagspec, '/'.join(context)+'/'+name):
|
|
355
|
+
elts.append((piece.group(),
|
|
356
|
+
'/'.join(context)+'/'+name))
|
|
357
|
+
|
|
358
|
+
if elt_start is not None:
|
|
359
|
+
# If we haven't found any elements yet, then keep
|
|
360
|
+
# looping until we do.
|
|
361
|
+
if elts == []:
|
|
362
|
+
elt_text += xml_fragment[elt_start:]
|
|
363
|
+
elt_start = 0
|
|
364
|
+
|
|
365
|
+
# If we've found at least one element, then try
|
|
366
|
+
# backtracking to the start of the element that we're
|
|
367
|
+
# inside of.
|
|
368
|
+
else:
|
|
369
|
+
# take back the last start-tag, and return what
|
|
370
|
+
# we've gotten so far (elts is non-empty).
|
|
371
|
+
if self._DEBUG:
|
|
372
|
+
print(' '*36+'(backtrack)')
|
|
373
|
+
if isinstance(stream, SeekableUnicodeStreamReader):
|
|
374
|
+
stream.seek(startpos)
|
|
375
|
+
stream.char_seek_forward(elt_start)
|
|
376
|
+
else:
|
|
377
|
+
stream.seek(-(len(xml_fragment)-elt_start), 1)
|
|
378
|
+
context = context[:elt_depth-1]
|
|
379
|
+
elt_start = elt_depth = None
|
|
380
|
+
elt_text = ''
|
|
381
|
+
|
|
382
|
+
# Update the _tag_context dict.
|
|
383
|
+
pos = stream.tell()
|
|
384
|
+
if pos in self._tag_context:
|
|
385
|
+
assert tuple(context) == self._tag_context[pos]
|
|
386
|
+
else:
|
|
387
|
+
self._tag_context[pos] = tuple(context)
|
|
388
|
+
|
|
389
|
+
return [elt_handler(ElementTree.fromstring(
|
|
390
|
+
elt.encode('ascii', 'xmlcharrefreplace')),
|
|
391
|
+
context)
|
|
392
|
+
for (elt, context) in elts]
|