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,521 +1,528 @@
|
|
|
1
|
-
# Natural Language Toolkit: CONLL Corpus Reader
|
|
2
|
-
#
|
|
3
|
-
# Copyright (C) 2001-
|
|
4
|
-
# Author: Steven Bird <stevenbird1@gmail.com>
|
|
5
|
-
# Edward Loper <edloper@gmail.com>
|
|
6
|
-
# URL: <http://nltk.org/>
|
|
7
|
-
# For license information, see LICENSE.TXT
|
|
8
|
-
|
|
9
|
-
"""
|
|
10
|
-
Read CoNLL-style chunk fileids.
|
|
11
|
-
"""
|
|
12
|
-
|
|
13
|
-
from __future__ import unicode_literals
|
|
14
|
-
|
|
15
|
-
import os
|
|
16
|
-
import codecs
|
|
17
|
-
import textwrap
|
|
18
|
-
|
|
19
|
-
from
|
|
20
|
-
|
|
21
|
-
from nltk
|
|
22
|
-
from nltk.
|
|
23
|
-
|
|
24
|
-
from nltk.
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
@todo:
|
|
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
|
-
self.
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
self.
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
def
|
|
111
|
-
self._require(self.WORDS, self.POS)
|
|
112
|
-
def get_tagged_words(grid):
|
|
113
|
-
return self._get_tagged_words(grid, tagset)
|
|
114
|
-
return LazyMap(get_tagged_words,
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
self._require(self.WORDS, self.POS
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
self._require(self.WORDS, self.POS, self.
|
|
135
|
-
if
|
|
136
|
-
def
|
|
137
|
-
return self.
|
|
138
|
-
return LazyMap(
|
|
139
|
-
|
|
140
|
-
def
|
|
141
|
-
self._require(self.
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
"""
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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
|
-
def
|
|
233
|
-
|
|
234
|
-
|
|
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
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
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
|
-
def
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
instance."""
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
for
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
for
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
def
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
#
|
|
484
|
-
for inst in self:
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
s += '%-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
return wordnum
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
1
|
+
# Natural Language Toolkit: CONLL Corpus Reader
|
|
2
|
+
#
|
|
3
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
4
|
+
# Author: Steven Bird <stevenbird1@gmail.com>
|
|
5
|
+
# Edward Loper <edloper@gmail.com>
|
|
6
|
+
# URL: <http://nltk.org/>
|
|
7
|
+
# For license information, see LICENSE.TXT
|
|
8
|
+
|
|
9
|
+
"""
|
|
10
|
+
Read CoNLL-style chunk fileids.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
from __future__ import unicode_literals
|
|
14
|
+
|
|
15
|
+
import os
|
|
16
|
+
import codecs
|
|
17
|
+
import textwrap
|
|
18
|
+
|
|
19
|
+
from six import string_types
|
|
20
|
+
|
|
21
|
+
from nltk import compat
|
|
22
|
+
from nltk.tree import Tree
|
|
23
|
+
from nltk.util import LazyMap, LazyConcatenation
|
|
24
|
+
from nltk.tag import map_tag
|
|
25
|
+
|
|
26
|
+
from nltk.corpus.reader.util import *
|
|
27
|
+
from nltk.corpus.reader.api import *
|
|
28
|
+
|
|
29
|
+
class ConllCorpusReader(CorpusReader):
|
|
30
|
+
"""
|
|
31
|
+
A corpus reader for CoNLL-style files. These files consist of a
|
|
32
|
+
series of sentences, separated by blank lines. Each sentence is
|
|
33
|
+
encoded using a table (or "grid") of values, where each line
|
|
34
|
+
corresponds to a single word, and each column corresponds to an
|
|
35
|
+
annotation type. The set of columns used by CoNLL-style files can
|
|
36
|
+
vary from corpus to corpus; the ``ConllCorpusReader`` constructor
|
|
37
|
+
therefore takes an argument, ``columntypes``, which is used to
|
|
38
|
+
specify the columns that are used by a given corpus. By default
|
|
39
|
+
columns are split by consecutive whitespaces, with the
|
|
40
|
+
``separator`` argument you can set a string to split by (e.g.
|
|
41
|
+
``\'\t\'``).
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
@todo: Add support for reading from corpora where different
|
|
45
|
+
parallel files contain different columns.
|
|
46
|
+
@todo: Possibly add caching of the grid corpus view? This would
|
|
47
|
+
allow the same grid view to be used by different data access
|
|
48
|
+
methods (eg words() and parsed_sents() could both share the
|
|
49
|
+
same grid corpus view object).
|
|
50
|
+
@todo: Better support for -DOCSTART-. Currently, we just ignore
|
|
51
|
+
it, but it could be used to define methods that retrieve a
|
|
52
|
+
document at a time (eg parsed_documents()).
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
#/////////////////////////////////////////////////////////////////
|
|
56
|
+
# Column Types
|
|
57
|
+
#/////////////////////////////////////////////////////////////////
|
|
58
|
+
|
|
59
|
+
WORDS = 'words' #: column type for words
|
|
60
|
+
POS = 'pos' #: column type for part-of-speech tags
|
|
61
|
+
TREE = 'tree' #: column type for parse trees
|
|
62
|
+
CHUNK = 'chunk' #: column type for chunk structures
|
|
63
|
+
NE = 'ne' #: column type for named entities
|
|
64
|
+
SRL = 'srl' #: column type for semantic role labels
|
|
65
|
+
IGNORE = 'ignore' #: column type for column that should be ignored
|
|
66
|
+
|
|
67
|
+
#: A list of all column types supported by the conll corpus reader.
|
|
68
|
+
COLUMN_TYPES = (WORDS, POS, TREE, CHUNK, NE, SRL, IGNORE)
|
|
69
|
+
|
|
70
|
+
#/////////////////////////////////////////////////////////////////
|
|
71
|
+
# Constructor
|
|
72
|
+
#/////////////////////////////////////////////////////////////////
|
|
73
|
+
|
|
74
|
+
def __init__(self, root, fileids, columntypes,
|
|
75
|
+
chunk_types=None, root_label='S', pos_in_tree=False,
|
|
76
|
+
srl_includes_roleset=True, encoding='utf8',
|
|
77
|
+
tree_class=Tree, tagset=None, separator=None):
|
|
78
|
+
for columntype in columntypes:
|
|
79
|
+
if columntype not in self.COLUMN_TYPES:
|
|
80
|
+
raise ValueError('Bad column type %r' % columntype)
|
|
81
|
+
if isinstance(chunk_types, string_types):
|
|
82
|
+
chunk_types = [chunk_types]
|
|
83
|
+
self._chunk_types = chunk_types
|
|
84
|
+
self._colmap = dict((c,i) for (i,c) in enumerate(columntypes))
|
|
85
|
+
self._pos_in_tree = pos_in_tree
|
|
86
|
+
self._root_label = root_label # for chunks
|
|
87
|
+
self._srl_includes_roleset = srl_includes_roleset
|
|
88
|
+
self._tree_class = tree_class
|
|
89
|
+
CorpusReader.__init__(self, root, fileids, encoding)
|
|
90
|
+
self._tagset = tagset
|
|
91
|
+
self.sep = separator
|
|
92
|
+
|
|
93
|
+
#/////////////////////////////////////////////////////////////////
|
|
94
|
+
# Data Access Methods
|
|
95
|
+
#/////////////////////////////////////////////////////////////////
|
|
96
|
+
|
|
97
|
+
def raw(self, fileids=None):
|
|
98
|
+
if fileids is None: fileids = self._fileids
|
|
99
|
+
elif isinstance(fileids, string_types): fileids = [fileids]
|
|
100
|
+
return concat([self.open(f).read() for f in fileids])
|
|
101
|
+
|
|
102
|
+
def words(self, fileids=None):
|
|
103
|
+
self._require(self.WORDS)
|
|
104
|
+
return LazyConcatenation(LazyMap(self._get_words, self._grids(fileids)))
|
|
105
|
+
|
|
106
|
+
def sents(self, fileids=None):
|
|
107
|
+
self._require(self.WORDS)
|
|
108
|
+
return LazyMap(self._get_words, self._grids(fileids))
|
|
109
|
+
|
|
110
|
+
def tagged_words(self, fileids=None, tagset=None):
|
|
111
|
+
self._require(self.WORDS, self.POS)
|
|
112
|
+
def get_tagged_words(grid):
|
|
113
|
+
return self._get_tagged_words(grid, tagset)
|
|
114
|
+
return LazyConcatenation(LazyMap(get_tagged_words,
|
|
115
|
+
self._grids(fileids)))
|
|
116
|
+
|
|
117
|
+
def tagged_sents(self, fileids=None, tagset=None):
|
|
118
|
+
self._require(self.WORDS, self.POS)
|
|
119
|
+
def get_tagged_words(grid):
|
|
120
|
+
return self._get_tagged_words(grid, tagset)
|
|
121
|
+
return LazyMap(get_tagged_words, self._grids(fileids))
|
|
122
|
+
|
|
123
|
+
def chunked_words(self, fileids=None, chunk_types=None,
|
|
124
|
+
tagset=None):
|
|
125
|
+
self._require(self.WORDS, self.POS, self.CHUNK)
|
|
126
|
+
if chunk_types is None: chunk_types = self._chunk_types
|
|
127
|
+
def get_chunked_words(grid): # capture chunk_types as local var
|
|
128
|
+
return self._get_chunked_words(grid, chunk_types, tagset)
|
|
129
|
+
return LazyConcatenation(LazyMap(get_chunked_words,
|
|
130
|
+
self._grids(fileids)))
|
|
131
|
+
|
|
132
|
+
def chunked_sents(self, fileids=None, chunk_types=None,
|
|
133
|
+
tagset=None):
|
|
134
|
+
self._require(self.WORDS, self.POS, self.CHUNK)
|
|
135
|
+
if chunk_types is None: chunk_types = self._chunk_types
|
|
136
|
+
def get_chunked_words(grid): # capture chunk_types as local var
|
|
137
|
+
return self._get_chunked_words(grid, chunk_types, tagset)
|
|
138
|
+
return LazyMap(get_chunked_words, self._grids(fileids))
|
|
139
|
+
|
|
140
|
+
def parsed_sents(self, fileids=None, pos_in_tree=None, tagset=None):
|
|
141
|
+
self._require(self.WORDS, self.POS, self.TREE)
|
|
142
|
+
if pos_in_tree is None: pos_in_tree = self._pos_in_tree
|
|
143
|
+
def get_parsed_sent(grid): # capture pos_in_tree as local var
|
|
144
|
+
return self._get_parsed_sent(grid, pos_in_tree, tagset)
|
|
145
|
+
return LazyMap(get_parsed_sent, self._grids(fileids))
|
|
146
|
+
|
|
147
|
+
def srl_spans(self, fileids=None):
|
|
148
|
+
self._require(self.SRL)
|
|
149
|
+
return LazyMap(self._get_srl_spans, self._grids(fileids))
|
|
150
|
+
|
|
151
|
+
def srl_instances(self, fileids=None, pos_in_tree=None, flatten=True):
|
|
152
|
+
self._require(self.WORDS, self.POS, self.TREE, self.SRL)
|
|
153
|
+
if pos_in_tree is None: pos_in_tree = self._pos_in_tree
|
|
154
|
+
def get_srl_instances(grid): # capture pos_in_tree as local var
|
|
155
|
+
return self._get_srl_instances(grid, pos_in_tree)
|
|
156
|
+
result = LazyMap(get_srl_instances, self._grids(fileids))
|
|
157
|
+
if flatten: result = LazyConcatenation(result)
|
|
158
|
+
return result
|
|
159
|
+
|
|
160
|
+
def iob_words(self, fileids=None, tagset=None):
|
|
161
|
+
"""
|
|
162
|
+
:return: a list of word/tag/IOB tuples
|
|
163
|
+
:rtype: list(tuple)
|
|
164
|
+
:param fileids: the list of fileids that make up this corpus
|
|
165
|
+
:type fileids: None or str or list
|
|
166
|
+
"""
|
|
167
|
+
self._require(self.WORDS, self.POS, self.CHUNK)
|
|
168
|
+
def get_iob_words(grid):
|
|
169
|
+
return self._get_iob_words(grid, tagset)
|
|
170
|
+
return LazyConcatenation(LazyMap(get_iob_words, self._grids(fileids)))
|
|
171
|
+
|
|
172
|
+
def iob_sents(self, fileids=None, tagset=None):
|
|
173
|
+
"""
|
|
174
|
+
:return: a list of lists of word/tag/IOB tuples
|
|
175
|
+
:rtype: list(list)
|
|
176
|
+
:param fileids: the list of fileids that make up this corpus
|
|
177
|
+
:type fileids: None or str or list
|
|
178
|
+
"""
|
|
179
|
+
self._require(self.WORDS, self.POS, self.CHUNK)
|
|
180
|
+
def get_iob_words(grid):
|
|
181
|
+
return self._get_iob_words(grid, tagset)
|
|
182
|
+
return LazyMap(get_iob_words, self._grids(fileids))
|
|
183
|
+
|
|
184
|
+
#/////////////////////////////////////////////////////////////////
|
|
185
|
+
# Grid Reading
|
|
186
|
+
#/////////////////////////////////////////////////////////////////
|
|
187
|
+
|
|
188
|
+
def _grids(self, fileids=None):
|
|
189
|
+
# n.b.: we could cache the object returned here (keyed on
|
|
190
|
+
# fileids), which would let us reuse the same corpus view for
|
|
191
|
+
# different things (eg srl and parse trees).
|
|
192
|
+
return concat([StreamBackedCorpusView(fileid, self._read_grid_block,
|
|
193
|
+
encoding=enc)
|
|
194
|
+
for (fileid, enc) in self.abspaths(fileids, True)])
|
|
195
|
+
|
|
196
|
+
def _read_grid_block(self, stream):
|
|
197
|
+
grids = []
|
|
198
|
+
for block in read_blankline_block(stream):
|
|
199
|
+
block = block.strip()
|
|
200
|
+
if not block: continue
|
|
201
|
+
|
|
202
|
+
grid = [line.split(self.sep) for line in block.split('\n')]
|
|
203
|
+
|
|
204
|
+
# If there's a docstart row, then discard. ([xx] eventually it
|
|
205
|
+
# would be good to actually use it)
|
|
206
|
+
if grid[0][self._colmap.get('words', 0)] == '-DOCSTART-':
|
|
207
|
+
del grid[0]
|
|
208
|
+
|
|
209
|
+
# Check that the grid is consistent.
|
|
210
|
+
for row in grid:
|
|
211
|
+
if len(row) != len(grid[0]):
|
|
212
|
+
raise ValueError('Inconsistent number of columns:\n%s'
|
|
213
|
+
% block)
|
|
214
|
+
grids.append(grid)
|
|
215
|
+
return grids
|
|
216
|
+
|
|
217
|
+
#/////////////////////////////////////////////////////////////////
|
|
218
|
+
# Transforms
|
|
219
|
+
#/////////////////////////////////////////////////////////////////
|
|
220
|
+
# given a grid, transform it into some representation (e.g.,
|
|
221
|
+
# a list of words or a parse tree).
|
|
222
|
+
|
|
223
|
+
def _get_words(self, grid):
|
|
224
|
+
return self._get_column(grid, self._colmap['words'])
|
|
225
|
+
|
|
226
|
+
def _get_tagged_words(self, grid, tagset=None):
|
|
227
|
+
pos_tags = self._get_column(grid, self._colmap['pos'])
|
|
228
|
+
if tagset and tagset != self._tagset:
|
|
229
|
+
pos_tags = [map_tag(self._tagset, tagset, t) for t in pos_tags]
|
|
230
|
+
return list(zip(self._get_column(grid, self._colmap['words']), pos_tags))
|
|
231
|
+
|
|
232
|
+
def _get_iob_words(self, grid, tagset=None):
|
|
233
|
+
pos_tags = self._get_column(grid, self._colmap['pos'])
|
|
234
|
+
if tagset and tagset != self._tagset:
|
|
235
|
+
pos_tags = [map_tag(self._tagset, tagset, t) for t in pos_tags]
|
|
236
|
+
return list(zip(self._get_column(grid, self._colmap['words']), pos_tags,
|
|
237
|
+
self._get_column(grid, self._colmap['chunk'])))
|
|
238
|
+
|
|
239
|
+
def _get_chunked_words(self, grid, chunk_types, tagset=None):
|
|
240
|
+
# n.b.: this method is very similar to conllstr2tree.
|
|
241
|
+
words = self._get_column(grid, self._colmap['words'])
|
|
242
|
+
pos_tags = self._get_column(grid, self._colmap['pos'])
|
|
243
|
+
if tagset and tagset != self._tagset:
|
|
244
|
+
pos_tags = [map_tag(self._tagset, tagset, t) for t in pos_tags]
|
|
245
|
+
chunk_tags = self._get_column(grid, self._colmap['chunk'])
|
|
246
|
+
|
|
247
|
+
stack = [Tree(self._root_label, [])]
|
|
248
|
+
|
|
249
|
+
for (word, pos_tag, chunk_tag) in zip(words, pos_tags, chunk_tags):
|
|
250
|
+
if chunk_tag == 'O':
|
|
251
|
+
state, chunk_type = 'O', ''
|
|
252
|
+
else:
|
|
253
|
+
(state, chunk_type) = chunk_tag.split('-')
|
|
254
|
+
# If it's a chunk we don't care about, treat it as O.
|
|
255
|
+
if chunk_types is not None and chunk_type not in chunk_types:
|
|
256
|
+
state = 'O'
|
|
257
|
+
# Treat a mismatching I like a B.
|
|
258
|
+
if state == 'I' and chunk_type != stack[-1].label():
|
|
259
|
+
state = 'B'
|
|
260
|
+
# For B or I: close any open chunks
|
|
261
|
+
if state in 'BO' and len(stack) == 2:
|
|
262
|
+
stack.pop()
|
|
263
|
+
# For B: start a new chunk.
|
|
264
|
+
if state == 'B':
|
|
265
|
+
new_chunk = Tree(chunk_type, [])
|
|
266
|
+
stack[-1].append(new_chunk)
|
|
267
|
+
stack.append(new_chunk)
|
|
268
|
+
# Add the word token.
|
|
269
|
+
stack[-1].append((word, pos_tag))
|
|
270
|
+
|
|
271
|
+
return stack[0]
|
|
272
|
+
|
|
273
|
+
def _get_parsed_sent(self, grid, pos_in_tree, tagset=None):
|
|
274
|
+
words = self._get_column(grid, self._colmap['words'])
|
|
275
|
+
pos_tags = self._get_column(grid, self._colmap['pos'])
|
|
276
|
+
if tagset and tagset != self._tagset:
|
|
277
|
+
pos_tags = [map_tag(self._tagset, tagset, t) for t in pos_tags]
|
|
278
|
+
parse_tags = self._get_column(grid, self._colmap['tree'])
|
|
279
|
+
|
|
280
|
+
treestr = ''
|
|
281
|
+
for (word, pos_tag, parse_tag) in zip(words, pos_tags, parse_tags):
|
|
282
|
+
if word == '(': word = '-LRB-'
|
|
283
|
+
if word == ')': word = '-RRB-'
|
|
284
|
+
if pos_tag == '(': pos_tag = '-LRB-'
|
|
285
|
+
if pos_tag == ')': pos_tag = '-RRB-'
|
|
286
|
+
(left, right) = parse_tag.split('*')
|
|
287
|
+
right = right.count(')')*')' # only keep ')'.
|
|
288
|
+
treestr += '%s (%s %s) %s' % (left, pos_tag, word, right)
|
|
289
|
+
try:
|
|
290
|
+
tree = self._tree_class.fromstring(treestr)
|
|
291
|
+
except (ValueError, IndexError):
|
|
292
|
+
tree = self._tree_class.fromstring('(%s %s)' %
|
|
293
|
+
(self._root_label, treestr))
|
|
294
|
+
|
|
295
|
+
if not pos_in_tree:
|
|
296
|
+
for subtree in tree.subtrees():
|
|
297
|
+
for i, child in enumerate(subtree):
|
|
298
|
+
if (isinstance(child, Tree) and len(child)==1 and
|
|
299
|
+
isinstance(child[0], string_types)):
|
|
300
|
+
subtree[i] = (child[0], child.label())
|
|
301
|
+
|
|
302
|
+
return tree
|
|
303
|
+
|
|
304
|
+
def _get_srl_spans(self, grid):
|
|
305
|
+
"""
|
|
306
|
+
list of list of (start, end), tag) tuples
|
|
307
|
+
"""
|
|
308
|
+
if self._srl_includes_roleset:
|
|
309
|
+
predicates = self._get_column(grid, self._colmap['srl']+1)
|
|
310
|
+
start_col = self._colmap['srl']+2
|
|
311
|
+
else:
|
|
312
|
+
predicates = self._get_column(grid, self._colmap['srl'])
|
|
313
|
+
start_col = self._colmap['srl']+1
|
|
314
|
+
|
|
315
|
+
# Count how many predicates there are. This tells us how many
|
|
316
|
+
# columns to expect for SRL data.
|
|
317
|
+
num_preds = len([p for p in predicates if p != '-'])
|
|
318
|
+
|
|
319
|
+
spanlists = []
|
|
320
|
+
for i in range(num_preds):
|
|
321
|
+
col = self._get_column(grid, start_col+i)
|
|
322
|
+
spanlist = []
|
|
323
|
+
stack = []
|
|
324
|
+
for wordnum, srl_tag in enumerate(col):
|
|
325
|
+
(left, right) = srl_tag.split('*')
|
|
326
|
+
for tag in left.split('('):
|
|
327
|
+
if tag:
|
|
328
|
+
stack.append((tag, wordnum))
|
|
329
|
+
for i in range(right.count(')')):
|
|
330
|
+
(tag, start) = stack.pop()
|
|
331
|
+
spanlist.append( ((start, wordnum+1), tag) )
|
|
332
|
+
spanlists.append(spanlist)
|
|
333
|
+
|
|
334
|
+
return spanlists
|
|
335
|
+
|
|
336
|
+
def _get_srl_instances(self, grid, pos_in_tree):
|
|
337
|
+
tree = self._get_parsed_sent(grid, pos_in_tree)
|
|
338
|
+
spanlists = self._get_srl_spans(grid)
|
|
339
|
+
if self._srl_includes_roleset:
|
|
340
|
+
predicates = self._get_column(grid, self._colmap['srl']+1)
|
|
341
|
+
rolesets = self._get_column(grid, self._colmap['srl'])
|
|
342
|
+
else:
|
|
343
|
+
predicates = self._get_column(grid, self._colmap['srl'])
|
|
344
|
+
rolesets = [None] * len(predicates)
|
|
345
|
+
|
|
346
|
+
instances = ConllSRLInstanceList(tree)
|
|
347
|
+
for wordnum, predicate in enumerate(predicates):
|
|
348
|
+
if predicate == '-': continue
|
|
349
|
+
# Decide which spanlist to use. Don't assume that they're
|
|
350
|
+
# sorted in the same order as the predicates (even though
|
|
351
|
+
# they usually are).
|
|
352
|
+
for spanlist in spanlists:
|
|
353
|
+
for (start, end), tag in spanlist:
|
|
354
|
+
if wordnum in range(start,end) and tag in ('V', 'C-V'):
|
|
355
|
+
break
|
|
356
|
+
else: continue
|
|
357
|
+
break
|
|
358
|
+
else:
|
|
359
|
+
raise ValueError('No srl column found for %r' % predicate)
|
|
360
|
+
instances.append(ConllSRLInstance(tree, wordnum, predicate,
|
|
361
|
+
rolesets[wordnum], spanlist))
|
|
362
|
+
|
|
363
|
+
return instances
|
|
364
|
+
|
|
365
|
+
#/////////////////////////////////////////////////////////////////
|
|
366
|
+
# Helper Methods
|
|
367
|
+
#/////////////////////////////////////////////////////////////////
|
|
368
|
+
|
|
369
|
+
def _require(self, *columntypes):
|
|
370
|
+
for columntype in columntypes:
|
|
371
|
+
if columntype not in self._colmap:
|
|
372
|
+
raise ValueError('This corpus does not contain a %s '
|
|
373
|
+
'column.' % columntype)
|
|
374
|
+
|
|
375
|
+
@staticmethod
|
|
376
|
+
def _get_column(grid, column_index):
|
|
377
|
+
return [grid[i][column_index] for i in range(len(grid))]
|
|
378
|
+
|
|
379
|
+
|
|
380
|
+
@compat.python_2_unicode_compatible
|
|
381
|
+
class ConllSRLInstance(object):
|
|
382
|
+
"""
|
|
383
|
+
An SRL instance from a CoNLL corpus, which identifies and
|
|
384
|
+
providing labels for the arguments of a single verb.
|
|
385
|
+
"""
|
|
386
|
+
# [xx] add inst.core_arguments, inst.argm_arguments?
|
|
387
|
+
|
|
388
|
+
def __init__(self, tree, verb_head, verb_stem, roleset, tagged_spans):
|
|
389
|
+
self.verb = []
|
|
390
|
+
"""A list of the word indices of the words that compose the
|
|
391
|
+
verb whose arguments are identified by this instance.
|
|
392
|
+
This will contain multiple word indices when multi-word
|
|
393
|
+
verbs are used (e.g. 'turn on')."""
|
|
394
|
+
|
|
395
|
+
self.verb_head = verb_head
|
|
396
|
+
"""The word index of the head word of the verb whose arguments
|
|
397
|
+
are identified by this instance. E.g., for a sentence that
|
|
398
|
+
uses the verb 'turn on,' ``verb_head`` will be the word index
|
|
399
|
+
of the word 'turn'."""
|
|
400
|
+
|
|
401
|
+
self.verb_stem = verb_stem
|
|
402
|
+
|
|
403
|
+
self.roleset = roleset
|
|
404
|
+
|
|
405
|
+
self.arguments = []
|
|
406
|
+
"""A list of ``(argspan, argid)`` tuples, specifying the location
|
|
407
|
+
and type for each of the arguments identified by this
|
|
408
|
+
instance. ``argspan`` is a tuple ``start, end``, indicating
|
|
409
|
+
that the argument consists of the ``words[start:end]``."""
|
|
410
|
+
|
|
411
|
+
self.tagged_spans = tagged_spans
|
|
412
|
+
"""A list of ``(span, id)`` tuples, specifying the location and
|
|
413
|
+
type for each of the arguments, as well as the verb pieces,
|
|
414
|
+
that make up this instance."""
|
|
415
|
+
|
|
416
|
+
self.tree = tree
|
|
417
|
+
"""The parse tree for the sentence containing this instance."""
|
|
418
|
+
|
|
419
|
+
self.words = tree.leaves()
|
|
420
|
+
"""A list of the words in the sentence containing this
|
|
421
|
+
instance."""
|
|
422
|
+
|
|
423
|
+
# Fill in the self.verb and self.arguments values.
|
|
424
|
+
for (start, end), tag in tagged_spans:
|
|
425
|
+
if tag in ('V', 'C-V'):
|
|
426
|
+
self.verb += list(range(start, end))
|
|
427
|
+
else:
|
|
428
|
+
self.arguments.append( ((start, end), tag) )
|
|
429
|
+
|
|
430
|
+
def __repr__(self):
|
|
431
|
+
plural = len(self.arguments)!=1 and 's' or ''
|
|
432
|
+
return '<ConllSRLInstance for %r with %d argument%s>' % (
|
|
433
|
+
(self.verb_stem, len(self.arguments), plural))
|
|
434
|
+
|
|
435
|
+
def pprint(self):
|
|
436
|
+
verbstr = ' '.join(self.words[i][0] for i in self.verb)
|
|
437
|
+
hdr = 'SRL for %r (stem=%r):\n' % (verbstr, self.verb_stem)
|
|
438
|
+
s = ''
|
|
439
|
+
for i, word in enumerate(self.words):
|
|
440
|
+
if isinstance(word, tuple): word = word[0]
|
|
441
|
+
for (start, end), argid in self.arguments:
|
|
442
|
+
if i == start: s += '[%s ' % argid
|
|
443
|
+
if i == end: s += '] '
|
|
444
|
+
if i in self.verb: word = '<<%s>>' % word
|
|
445
|
+
s += word + ' '
|
|
446
|
+
return hdr + textwrap.fill(s.replace(' ]', ']'),
|
|
447
|
+
initial_indent=' ',
|
|
448
|
+
subsequent_indent=' ')
|
|
449
|
+
|
|
450
|
+
@compat.python_2_unicode_compatible
|
|
451
|
+
class ConllSRLInstanceList(list):
|
|
452
|
+
"""
|
|
453
|
+
Set of instances for a single sentence
|
|
454
|
+
"""
|
|
455
|
+
def __init__(self, tree, instances=()):
|
|
456
|
+
self.tree = tree
|
|
457
|
+
list.__init__(self, instances)
|
|
458
|
+
|
|
459
|
+
def __str__(self):
|
|
460
|
+
return self.pprint()
|
|
461
|
+
|
|
462
|
+
def pprint(self, include_tree=False):
|
|
463
|
+
# Sanity check: trees should be the same
|
|
464
|
+
for inst in self:
|
|
465
|
+
if inst.tree != self.tree:
|
|
466
|
+
raise ValueError('Tree mismatch!')
|
|
467
|
+
|
|
468
|
+
# If desired, add trees:
|
|
469
|
+
if include_tree:
|
|
470
|
+
words = self.tree.leaves()
|
|
471
|
+
pos = [None] * len(words)
|
|
472
|
+
synt = ['*'] * len(words)
|
|
473
|
+
self._tree2conll(self.tree, 0, words, pos, synt)
|
|
474
|
+
|
|
475
|
+
s = ''
|
|
476
|
+
for i in range(len(words)):
|
|
477
|
+
# optional tree columns
|
|
478
|
+
if include_tree:
|
|
479
|
+
s += '%-20s ' % words[i]
|
|
480
|
+
s += '%-8s ' % pos[i]
|
|
481
|
+
s += '%15s*%-8s ' % tuple(synt[i].split('*'))
|
|
482
|
+
|
|
483
|
+
# verb head column
|
|
484
|
+
for inst in self:
|
|
485
|
+
if i == inst.verb_head:
|
|
486
|
+
s += '%-20s ' % inst.verb_stem
|
|
487
|
+
break
|
|
488
|
+
else:
|
|
489
|
+
s += '%-20s ' % '-'
|
|
490
|
+
# Remaining columns: self
|
|
491
|
+
for inst in self:
|
|
492
|
+
argstr = '*'
|
|
493
|
+
for (start, end), argid in inst.tagged_spans:
|
|
494
|
+
if i==start: argstr = '(%s%s' % (argid, argstr)
|
|
495
|
+
if i==(end-1): argstr += ')'
|
|
496
|
+
s += '%-12s ' % argstr
|
|
497
|
+
s += '\n'
|
|
498
|
+
return s
|
|
499
|
+
|
|
500
|
+
def _tree2conll(self, tree, wordnum, words, pos, synt):
|
|
501
|
+
assert isinstance(tree, Tree)
|
|
502
|
+
if len(tree) == 1 and isinstance(tree[0], string_types):
|
|
503
|
+
pos[wordnum] = tree.label()
|
|
504
|
+
assert words[wordnum] == tree[0]
|
|
505
|
+
return wordnum+1
|
|
506
|
+
elif len(tree) == 1 and isinstance(tree[0], tuple):
|
|
507
|
+
assert len(tree[0]) == 2
|
|
508
|
+
pos[wordnum], pos[wordnum] = tree[0]
|
|
509
|
+
return wordnum+1
|
|
510
|
+
else:
|
|
511
|
+
synt[wordnum] = '(%s%s' % (tree.label(), synt[wordnum])
|
|
512
|
+
for child in tree:
|
|
513
|
+
wordnum = self._tree2conll(child, wordnum, words,
|
|
514
|
+
pos, synt)
|
|
515
|
+
synt[wordnum-1] += ')'
|
|
516
|
+
return wordnum
|
|
517
|
+
|
|
518
|
+
class ConllChunkCorpusReader(ConllCorpusReader):
|
|
519
|
+
"""
|
|
520
|
+
A ConllCorpusReader whose data file contains three columns: words,
|
|
521
|
+
pos, and chunk.
|
|
522
|
+
"""
|
|
523
|
+
def __init__(self, root, fileids, chunk_types, encoding='utf8',
|
|
524
|
+
tagset=None, separator=None):
|
|
525
|
+
ConllCorpusReader.__init__(
|
|
526
|
+
self, root, fileids, ('words', 'pos', 'chunk'),
|
|
527
|
+
chunk_types=chunk_types, encoding=encoding,
|
|
528
|
+
tagset=tagset, separator=separator)
|