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,494 +1,522 @@
|
|
|
1
|
-
# CHILDES XML Corpus Reader
|
|
2
|
-
|
|
3
|
-
# Copyright (C) 2001-
|
|
4
|
-
# Author: Tomonori Nagano <tnagano@gc.cuny.edu>
|
|
5
|
-
# Alexis Dimitriadis <A.Dimitriadis@uu.nl>
|
|
6
|
-
# URL: <http://nltk.org/>
|
|
7
|
-
# For license information, see LICENSE.TXT
|
|
8
|
-
|
|
9
|
-
"""
|
|
10
|
-
Corpus reader for the XML version of the CHILDES corpus.
|
|
11
|
-
"""
|
|
12
|
-
from __future__ import print_function
|
|
13
|
-
|
|
14
|
-
__docformat__ = 'epytext en'
|
|
15
|
-
|
|
16
|
-
import re
|
|
17
|
-
from collections import defaultdict
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
from nltk.
|
|
21
|
-
|
|
22
|
-
from nltk.corpus.reader.util import concat
|
|
23
|
-
from nltk.corpus.reader.xmldocs import XMLCorpusReader, ElementTree
|
|
24
|
-
|
|
25
|
-
# to resolve the namespace issue
|
|
26
|
-
NS = 'http://www.talkbank.org/ns/talkbank'
|
|
27
|
-
|
|
28
|
-
class CHILDESCorpusReader(XMLCorpusReader):
|
|
29
|
-
"""
|
|
30
|
-
Corpus reader for the XML version of the CHILDES corpus.
|
|
31
|
-
The CHILDES corpus is available at ``http://childes.psy.cmu.edu/``. The XML
|
|
32
|
-
version of CHILDES is located at ``http://childes.psy.cmu.edu/data-xml/``.
|
|
33
|
-
Copy the needed parts of the CHILDES XML corpus into the NLTK data directory
|
|
34
|
-
(``nltk_data/corpora/CHILDES/``).
|
|
35
|
-
|
|
36
|
-
For access to the file text use the usual nltk functions,
|
|
37
|
-
``words()``, ``sents()``, ``tagged_words()`` and ``tagged_sents()``.
|
|
38
|
-
"""
|
|
39
|
-
def __init__(self, root, fileids, lazy=True):
|
|
40
|
-
XMLCorpusReader.__init__(self, root, fileids)
|
|
41
|
-
self._lazy = lazy
|
|
42
|
-
|
|
43
|
-
def words(self, fileids=None, speaker='ALL', stem=False,
|
|
44
|
-
relation=False, strip_space=True, replace=False):
|
|
45
|
-
"""
|
|
46
|
-
:return: the given file(s) as a list of words
|
|
47
|
-
:rtype: list(str)
|
|
48
|
-
|
|
49
|
-
:param speaker: If specified, select specific speaker(s) defined
|
|
50
|
-
in the corpus. Default is 'ALL' (all participants). Common choices
|
|
51
|
-
are 'CHI' (the child), 'MOT' (mother), ['CHI','MOT'] (exclude
|
|
52
|
-
researchers)
|
|
53
|
-
:param stem: If true, then use word stems instead of word strings.
|
|
54
|
-
:param relation: If true, then return tuples of (stem, index,
|
|
55
|
-
dependent_index)
|
|
56
|
-
:param strip_space: If true, then strip trailing spaces from word
|
|
57
|
-
tokens. Otherwise, leave the spaces on the tokens.
|
|
58
|
-
:param replace: If true, then use the replaced (intended) word instead
|
|
59
|
-
of the original word (e.g., 'wat' will be replaced with 'watch')
|
|
60
|
-
"""
|
|
61
|
-
sent=None
|
|
62
|
-
pos=False
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
:
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
:param
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
:param
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
:
|
|
107
|
-
|
|
108
|
-
:param
|
|
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
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
return
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
:rtype: list
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
return
|
|
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
|
-
return
|
|
213
|
-
|
|
214
|
-
def
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
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
|
-
else:
|
|
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
|
-
|
|
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
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
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
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
1
|
+
# CHILDES XML Corpus Reader
|
|
2
|
+
|
|
3
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
4
|
+
# Author: Tomonori Nagano <tnagano@gc.cuny.edu>
|
|
5
|
+
# Alexis Dimitriadis <A.Dimitriadis@uu.nl>
|
|
6
|
+
# URL: <http://nltk.org/>
|
|
7
|
+
# For license information, see LICENSE.TXT
|
|
8
|
+
|
|
9
|
+
"""
|
|
10
|
+
Corpus reader for the XML version of the CHILDES corpus.
|
|
11
|
+
"""
|
|
12
|
+
from __future__ import print_function, division
|
|
13
|
+
|
|
14
|
+
__docformat__ = 'epytext en'
|
|
15
|
+
|
|
16
|
+
import re
|
|
17
|
+
from collections import defaultdict
|
|
18
|
+
from six import string_types
|
|
19
|
+
|
|
20
|
+
from nltk.util import flatten, LazyMap, LazyConcatenation
|
|
21
|
+
|
|
22
|
+
from nltk.corpus.reader.util import concat
|
|
23
|
+
from nltk.corpus.reader.xmldocs import XMLCorpusReader, ElementTree
|
|
24
|
+
|
|
25
|
+
# to resolve the namespace issue
|
|
26
|
+
NS = 'http://www.talkbank.org/ns/talkbank'
|
|
27
|
+
|
|
28
|
+
class CHILDESCorpusReader(XMLCorpusReader):
|
|
29
|
+
"""
|
|
30
|
+
Corpus reader for the XML version of the CHILDES corpus.
|
|
31
|
+
The CHILDES corpus is available at ``http://childes.psy.cmu.edu/``. The XML
|
|
32
|
+
version of CHILDES is located at ``http://childes.psy.cmu.edu/data-xml/``.
|
|
33
|
+
Copy the needed parts of the CHILDES XML corpus into the NLTK data directory
|
|
34
|
+
(``nltk_data/corpora/CHILDES/``).
|
|
35
|
+
|
|
36
|
+
For access to the file text use the usual nltk functions,
|
|
37
|
+
``words()``, ``sents()``, ``tagged_words()`` and ``tagged_sents()``.
|
|
38
|
+
"""
|
|
39
|
+
def __init__(self, root, fileids, lazy=True):
|
|
40
|
+
XMLCorpusReader.__init__(self, root, fileids)
|
|
41
|
+
self._lazy = lazy
|
|
42
|
+
|
|
43
|
+
def words(self, fileids=None, speaker='ALL', stem=False,
|
|
44
|
+
relation=False, strip_space=True, replace=False):
|
|
45
|
+
"""
|
|
46
|
+
:return: the given file(s) as a list of words
|
|
47
|
+
:rtype: list(str)
|
|
48
|
+
|
|
49
|
+
:param speaker: If specified, select specific speaker(s) defined
|
|
50
|
+
in the corpus. Default is 'ALL' (all participants). Common choices
|
|
51
|
+
are 'CHI' (the child), 'MOT' (mother), ['CHI','MOT'] (exclude
|
|
52
|
+
researchers)
|
|
53
|
+
:param stem: If true, then use word stems instead of word strings.
|
|
54
|
+
:param relation: If true, then return tuples of (stem, index,
|
|
55
|
+
dependent_index)
|
|
56
|
+
:param strip_space: If true, then strip trailing spaces from word
|
|
57
|
+
tokens. Otherwise, leave the spaces on the tokens.
|
|
58
|
+
:param replace: If true, then use the replaced (intended) word instead
|
|
59
|
+
of the original word (e.g., 'wat' will be replaced with 'watch')
|
|
60
|
+
"""
|
|
61
|
+
sent=None
|
|
62
|
+
pos=False
|
|
63
|
+
if not self._lazy:
|
|
64
|
+
return [self._get_words(fileid, speaker, sent, stem, relation,
|
|
65
|
+
pos, strip_space, replace) for fileid in self.abspaths(fileids)]
|
|
66
|
+
|
|
67
|
+
get_words = lambda fileid: self._get_words(fileid, speaker, sent, stem, relation,
|
|
68
|
+
pos, strip_space, replace)
|
|
69
|
+
return LazyConcatenation(LazyMap(get_words, self.abspaths(fileids)))
|
|
70
|
+
|
|
71
|
+
def tagged_words(self, fileids=None, speaker='ALL', stem=False,
|
|
72
|
+
relation=False, strip_space=True, replace=False):
|
|
73
|
+
"""
|
|
74
|
+
:return: the given file(s) as a list of tagged
|
|
75
|
+
words and punctuation symbols, encoded as tuples
|
|
76
|
+
``(word,tag)``.
|
|
77
|
+
:rtype: list(tuple(str,str))
|
|
78
|
+
|
|
79
|
+
:param speaker: If specified, select specific speaker(s) defined
|
|
80
|
+
in the corpus. Default is 'ALL' (all participants). Common choices
|
|
81
|
+
are 'CHI' (the child), 'MOT' (mother), ['CHI','MOT'] (exclude
|
|
82
|
+
researchers)
|
|
83
|
+
:param stem: If true, then use word stems instead of word strings.
|
|
84
|
+
:param relation: If true, then return tuples of (stem, index,
|
|
85
|
+
dependent_index)
|
|
86
|
+
:param strip_space: If true, then strip trailing spaces from word
|
|
87
|
+
tokens. Otherwise, leave the spaces on the tokens.
|
|
88
|
+
:param replace: If true, then use the replaced (intended) word instead
|
|
89
|
+
of the original word (e.g., 'wat' will be replaced with 'watch')
|
|
90
|
+
"""
|
|
91
|
+
sent=None
|
|
92
|
+
pos=True
|
|
93
|
+
if not self._lazy:
|
|
94
|
+
return [self._get_words(fileid, speaker, sent, stem, relation,
|
|
95
|
+
pos, strip_space, replace) for fileid in self.abspaths(fileids)]
|
|
96
|
+
|
|
97
|
+
get_words = lambda fileid: self._get_words(fileid, speaker, sent, stem, relation,
|
|
98
|
+
pos, strip_space, replace)
|
|
99
|
+
return LazyConcatenation(LazyMap(get_words, self.abspaths(fileids)))
|
|
100
|
+
|
|
101
|
+
def sents(self, fileids=None, speaker='ALL', stem=False,
|
|
102
|
+
relation=None, strip_space=True, replace=False):
|
|
103
|
+
"""
|
|
104
|
+
:return: the given file(s) as a list of sentences or utterances, each
|
|
105
|
+
encoded as a list of word strings.
|
|
106
|
+
:rtype: list(list(str))
|
|
107
|
+
|
|
108
|
+
:param speaker: If specified, select specific speaker(s) defined
|
|
109
|
+
in the corpus. Default is 'ALL' (all participants). Common choices
|
|
110
|
+
are 'CHI' (the child), 'MOT' (mother), ['CHI','MOT'] (exclude
|
|
111
|
+
researchers)
|
|
112
|
+
:param stem: If true, then use word stems instead of word strings.
|
|
113
|
+
:param relation: If true, then return tuples of ``(str,pos,relation_list)``.
|
|
114
|
+
If there is manually-annotated relation info, it will return
|
|
115
|
+
tuples of ``(str,pos,test_relation_list,str,pos,gold_relation_list)``
|
|
116
|
+
:param strip_space: If true, then strip trailing spaces from word
|
|
117
|
+
tokens. Otherwise, leave the spaces on the tokens.
|
|
118
|
+
:param replace: If true, then use the replaced (intended) word instead
|
|
119
|
+
of the original word (e.g., 'wat' will be replaced with 'watch')
|
|
120
|
+
"""
|
|
121
|
+
sent=True
|
|
122
|
+
pos=False
|
|
123
|
+
if not self._lazy:
|
|
124
|
+
return [self._get_words(fileid, speaker, sent, stem, relation,
|
|
125
|
+
pos, strip_space, replace) for fileid in self.abspaths(fileids)]
|
|
126
|
+
|
|
127
|
+
get_words = lambda fileid: self._get_words(fileid, speaker, sent, stem, relation,
|
|
128
|
+
pos, strip_space, replace)
|
|
129
|
+
return LazyConcatenation(LazyMap(get_words, self.abspaths(fileids)))
|
|
130
|
+
|
|
131
|
+
def tagged_sents(self, fileids=None, speaker='ALL', stem=False,
|
|
132
|
+
relation=None, strip_space=True, replace=False):
|
|
133
|
+
"""
|
|
134
|
+
:return: the given file(s) as a list of
|
|
135
|
+
sentences, each encoded as a list of ``(word,tag)`` tuples.
|
|
136
|
+
:rtype: list(list(tuple(str,str)))
|
|
137
|
+
|
|
138
|
+
:param speaker: If specified, select specific speaker(s) defined
|
|
139
|
+
in the corpus. Default is 'ALL' (all participants). Common choices
|
|
140
|
+
are 'CHI' (the child), 'MOT' (mother), ['CHI','MOT'] (exclude
|
|
141
|
+
researchers)
|
|
142
|
+
:param stem: If true, then use word stems instead of word strings.
|
|
143
|
+
:param relation: If true, then return tuples of ``(str,pos,relation_list)``.
|
|
144
|
+
If there is manually-annotated relation info, it will return
|
|
145
|
+
tuples of ``(str,pos,test_relation_list,str,pos,gold_relation_list)``
|
|
146
|
+
:param strip_space: If true, then strip trailing spaces from word
|
|
147
|
+
tokens. Otherwise, leave the spaces on the tokens.
|
|
148
|
+
:param replace: If true, then use the replaced (intended) word instead
|
|
149
|
+
of the original word (e.g., 'wat' will be replaced with 'watch')
|
|
150
|
+
"""
|
|
151
|
+
sent=True
|
|
152
|
+
pos=True
|
|
153
|
+
if not self._lazy:
|
|
154
|
+
return [self._get_words(fileid, speaker, sent, stem, relation,
|
|
155
|
+
pos, strip_space, replace) for fileid in self.abspaths(fileids)]
|
|
156
|
+
|
|
157
|
+
get_words = lambda fileid: self._get_words(fileid, speaker, sent, stem, relation,
|
|
158
|
+
pos, strip_space, replace)
|
|
159
|
+
return LazyConcatenation(LazyMap(get_words, self.abspaths(fileids)))
|
|
160
|
+
|
|
161
|
+
def corpus(self, fileids=None):
|
|
162
|
+
"""
|
|
163
|
+
:return: the given file(s) as a dict of ``(corpus_property_key, value)``
|
|
164
|
+
:rtype: list(dict)
|
|
165
|
+
"""
|
|
166
|
+
if not self._lazy:
|
|
167
|
+
return [self._get_corpus(fileid) for fileid in self.abspaths(fileids)]
|
|
168
|
+
return LazyMap(self._get_corpus, self.abspaths(fileids))
|
|
169
|
+
|
|
170
|
+
def _get_corpus(self, fileid):
|
|
171
|
+
results = dict()
|
|
172
|
+
xmldoc = ElementTree.parse(fileid).getroot()
|
|
173
|
+
for key, value in xmldoc.items():
|
|
174
|
+
results[key] = value
|
|
175
|
+
return results
|
|
176
|
+
|
|
177
|
+
def participants(self, fileids=None):
|
|
178
|
+
"""
|
|
179
|
+
:return: the given file(s) as a dict of
|
|
180
|
+
``(participant_property_key, value)``
|
|
181
|
+
:rtype: list(dict)
|
|
182
|
+
"""
|
|
183
|
+
if not self._lazy:
|
|
184
|
+
return [self._get_participants(fileid) for fileid in self.abspaths(fileids)]
|
|
185
|
+
return LazyMap(self._get_participants, self.abspaths(fileids))
|
|
186
|
+
|
|
187
|
+
def _get_participants(self, fileid):
|
|
188
|
+
# multidimensional dicts
|
|
189
|
+
def dictOfDicts():
|
|
190
|
+
return defaultdict(dictOfDicts)
|
|
191
|
+
|
|
192
|
+
xmldoc = ElementTree.parse(fileid).getroot()
|
|
193
|
+
# getting participants' data
|
|
194
|
+
pat = dictOfDicts()
|
|
195
|
+
for participant in xmldoc.findall('.//{%s}Participants/{%s}participant'
|
|
196
|
+
% (NS,NS)):
|
|
197
|
+
for (key,value) in participant.items():
|
|
198
|
+
pat[participant.get('id')][key] = value
|
|
199
|
+
return pat
|
|
200
|
+
|
|
201
|
+
def age(self, fileids=None, speaker='CHI', month=False):
|
|
202
|
+
"""
|
|
203
|
+
:return: the given file(s) as string or int
|
|
204
|
+
:rtype: list or int
|
|
205
|
+
|
|
206
|
+
:param month: If true, return months instead of year-month-date
|
|
207
|
+
"""
|
|
208
|
+
if not self._lazy:
|
|
209
|
+
return [self._get_age(fileid, speaker, month)
|
|
210
|
+
for fileid in self.abspaths(fileids)]
|
|
211
|
+
get_age = lambda fileid: self._get_age(fileid, speaker, month)
|
|
212
|
+
return LazyMap(get_age, self.abspaths(fileids))
|
|
213
|
+
|
|
214
|
+
def _get_age(self, fileid, speaker, month):
|
|
215
|
+
xmldoc = ElementTree.parse(fileid).getroot()
|
|
216
|
+
for pat in xmldoc.findall('.//{%s}Participants/{%s}participant'
|
|
217
|
+
% (NS,NS)):
|
|
218
|
+
try:
|
|
219
|
+
if pat.get('id') == speaker:
|
|
220
|
+
age = pat.get('age')
|
|
221
|
+
if month:
|
|
222
|
+
age = self.convert_age(age)
|
|
223
|
+
return age
|
|
224
|
+
# some files don't have age data
|
|
225
|
+
except (TypeError, AttributeError) as e:
|
|
226
|
+
return None
|
|
227
|
+
|
|
228
|
+
def convert_age(self, age_year):
|
|
229
|
+
"Caclculate age in months from a string in CHILDES format"
|
|
230
|
+
m = re.match("P(\d+)Y(\d+)M?(\d?\d?)D?",age_year)
|
|
231
|
+
age_month = int(m.group(1))*12 + int(m.group(2))
|
|
232
|
+
try:
|
|
233
|
+
if int(m.group(3)) > 15:
|
|
234
|
+
age_month += 1
|
|
235
|
+
# some corpora don't have age information?
|
|
236
|
+
except ValueError as e:
|
|
237
|
+
pass
|
|
238
|
+
return age_month
|
|
239
|
+
|
|
240
|
+
def MLU(self, fileids=None, speaker='CHI'):
|
|
241
|
+
"""
|
|
242
|
+
:return: the given file(s) as a floating number
|
|
243
|
+
:rtype: list(float)
|
|
244
|
+
"""
|
|
245
|
+
if not self._lazy:
|
|
246
|
+
return [self._getMLU(fileid, speaker=speaker)
|
|
247
|
+
for fileid in self.abspaths(fileids)]
|
|
248
|
+
get_MLU = lambda fileid: self._getMLU(fileid, speaker=speaker)
|
|
249
|
+
return LazyMap(get_MLU, self.abspaths(fileids))
|
|
250
|
+
|
|
251
|
+
def _getMLU(self, fileid, speaker):
|
|
252
|
+
sents = self._get_words(fileid, speaker=speaker, sent=True, stem=True,
|
|
253
|
+
relation=False, pos=True, strip_space=True, replace=True)
|
|
254
|
+
results = []
|
|
255
|
+
lastSent = []
|
|
256
|
+
numFillers = 0
|
|
257
|
+
sentDiscount = 0
|
|
258
|
+
for sent in sents:
|
|
259
|
+
posList = [pos for (word,pos) in sent]
|
|
260
|
+
# if any part of the sentence is intelligible
|
|
261
|
+
if any(pos == 'unk' for pos in posList):
|
|
262
|
+
next
|
|
263
|
+
# if the sentence is null
|
|
264
|
+
elif sent == []:
|
|
265
|
+
next
|
|
266
|
+
# if the sentence is the same as the last sent
|
|
267
|
+
elif sent == lastSent:
|
|
268
|
+
next
|
|
269
|
+
else:
|
|
270
|
+
results.append([word for (word,pos) in sent])
|
|
271
|
+
# count number of fillers
|
|
272
|
+
if len(set(['co',None]).intersection(posList)) > 0:
|
|
273
|
+
numFillers += posList.count('co')
|
|
274
|
+
numFillers += posList.count(None)
|
|
275
|
+
sentDiscount += 1
|
|
276
|
+
lastSent = sent
|
|
277
|
+
try:
|
|
278
|
+
thisWordList = flatten(results)
|
|
279
|
+
# count number of morphemes
|
|
280
|
+
# (e.g., 'read' = 1 morpheme but 'read-PAST' is 2 morphemes)
|
|
281
|
+
numWords = len(flatten([word.split('-')
|
|
282
|
+
for word in thisWordList])) - numFillers
|
|
283
|
+
numSents = len(results) - sentDiscount
|
|
284
|
+
mlu = numWords/numSents
|
|
285
|
+
except ZeroDivisionError:
|
|
286
|
+
mlu = 0
|
|
287
|
+
# return {'mlu':mlu,'wordNum':numWords,'sentNum':numSents}
|
|
288
|
+
return mlu
|
|
289
|
+
|
|
290
|
+
def _get_words(self, fileid, speaker, sent, stem, relation, pos,
|
|
291
|
+
strip_space, replace):
|
|
292
|
+
if isinstance(speaker, string_types) and speaker != 'ALL': # ensure we have a list of speakers
|
|
293
|
+
speaker = [ speaker ]
|
|
294
|
+
xmldoc = ElementTree.parse(fileid).getroot()
|
|
295
|
+
# processing each xml doc
|
|
296
|
+
results = []
|
|
297
|
+
for xmlsent in xmldoc.findall('.//{%s}u' % NS):
|
|
298
|
+
sents = []
|
|
299
|
+
# select speakers
|
|
300
|
+
if speaker == 'ALL' or xmlsent.get('who') in speaker:
|
|
301
|
+
for xmlword in xmlsent.findall('.//{%s}w' % NS):
|
|
302
|
+
infl = None ; suffixStem = None; suffixTag = None
|
|
303
|
+
# getting replaced words
|
|
304
|
+
if replace and xmlsent.find('.//{%s}w/{%s}replacement'
|
|
305
|
+
% (NS,NS)):
|
|
306
|
+
xmlword = xmlsent.find('.//{%s}w/{%s}replacement/{%s}w'
|
|
307
|
+
% (NS,NS,NS))
|
|
308
|
+
elif replace and xmlsent.find('.//{%s}w/{%s}wk' % (NS,NS)):
|
|
309
|
+
xmlword = xmlsent.find('.//{%s}w/{%s}wk' % (NS,NS))
|
|
310
|
+
# get text
|
|
311
|
+
if xmlword.text:
|
|
312
|
+
word = xmlword.text
|
|
313
|
+
else:
|
|
314
|
+
word = ''
|
|
315
|
+
# strip tailing space
|
|
316
|
+
if strip_space:
|
|
317
|
+
word = word.strip()
|
|
318
|
+
# stem
|
|
319
|
+
if relation or stem:
|
|
320
|
+
try:
|
|
321
|
+
xmlstem = xmlword.find('.//{%s}stem' % NS)
|
|
322
|
+
word = xmlstem.text
|
|
323
|
+
except AttributeError as e:
|
|
324
|
+
pass
|
|
325
|
+
# if there is an inflection
|
|
326
|
+
try:
|
|
327
|
+
xmlinfl = xmlword.find('.//{%s}mor/{%s}mw/{%s}mk'
|
|
328
|
+
% (NS,NS,NS))
|
|
329
|
+
word += '-' + xmlinfl.text
|
|
330
|
+
except:
|
|
331
|
+
pass
|
|
332
|
+
# if there is a suffix
|
|
333
|
+
try:
|
|
334
|
+
xmlsuffix = xmlword.find('.//{%s}mor/{%s}mor-post/{%s}mw/{%s}stem'
|
|
335
|
+
% (NS,NS,NS,NS))
|
|
336
|
+
suffixStem = xmlsuffix.text
|
|
337
|
+
except AttributeError:
|
|
338
|
+
suffixStem = ""
|
|
339
|
+
if suffixStem:
|
|
340
|
+
word += "~"+suffixStem
|
|
341
|
+
# pos
|
|
342
|
+
if relation or pos:
|
|
343
|
+
try:
|
|
344
|
+
xmlpos = xmlword.findall(".//{%s}c" % NS)
|
|
345
|
+
xmlpos2 = xmlword.findall(".//{%s}s" % NS)
|
|
346
|
+
if xmlpos2 != []:
|
|
347
|
+
tag = xmlpos[0].text+":"+xmlpos2[0].text
|
|
348
|
+
else:
|
|
349
|
+
tag = xmlpos[0].text
|
|
350
|
+
except (AttributeError,IndexError) as e:
|
|
351
|
+
tag = ""
|
|
352
|
+
try:
|
|
353
|
+
xmlsuffixpos = xmlword.findall('.//{%s}mor/{%s}mor-post/{%s}mw/{%s}pos/{%s}c'
|
|
354
|
+
% (NS,NS,NS,NS,NS))
|
|
355
|
+
xmlsuffixpos2 = xmlword.findall('.//{%s}mor/{%s}mor-post/{%s}mw/{%s}pos/{%s}s'
|
|
356
|
+
% (NS,NS,NS,NS,NS))
|
|
357
|
+
if xmlsuffixpos2:
|
|
358
|
+
suffixTag = xmlsuffixpos[0].text+":"+xmlsuffixpos2[0].text
|
|
359
|
+
else:
|
|
360
|
+
suffixTag = xmlsuffixpos[0].text
|
|
361
|
+
except:
|
|
362
|
+
pass
|
|
363
|
+
if suffixTag:
|
|
364
|
+
tag += "~"+suffixTag
|
|
365
|
+
word = (word, tag)
|
|
366
|
+
# relational
|
|
367
|
+
# the gold standard is stored in
|
|
368
|
+
# <mor></mor><mor type="trn"><gra type="grt">
|
|
369
|
+
if relation == True:
|
|
370
|
+
for xmlstem_rel in xmlword.findall('.//{%s}mor/{%s}gra'
|
|
371
|
+
% (NS,NS)):
|
|
372
|
+
if not xmlstem_rel.get('type') == 'grt':
|
|
373
|
+
word = (word[0], word[1],
|
|
374
|
+
xmlstem_rel.get('index')
|
|
375
|
+
+ "|" + xmlstem_rel.get('head')
|
|
376
|
+
+ "|" + xmlstem_rel.get('relation'))
|
|
377
|
+
else:
|
|
378
|
+
word = (word[0], word[1], word[2],
|
|
379
|
+
word[0], word[1],
|
|
380
|
+
xmlstem_rel.get('index')
|
|
381
|
+
+ "|" + xmlstem_rel.get('head')
|
|
382
|
+
+ "|" + xmlstem_rel.get('relation'))
|
|
383
|
+
try:
|
|
384
|
+
for xmlpost_rel in xmlword.findall('.//{%s}mor/{%s}mor-post/{%s}gra'
|
|
385
|
+
% (NS,NS,NS)):
|
|
386
|
+
if not xmlpost_rel.get('type') == 'grt':
|
|
387
|
+
suffixStem = (suffixStem[0],
|
|
388
|
+
suffixStem[1],
|
|
389
|
+
xmlpost_rel.get('index')
|
|
390
|
+
+ "|" + xmlpost_rel.get('head')
|
|
391
|
+
+ "|" + xmlpost_rel.get('relation'))
|
|
392
|
+
else:
|
|
393
|
+
suffixStem = (suffixStem[0], suffixStem[1],
|
|
394
|
+
suffixStem[2], suffixStem[0],
|
|
395
|
+
suffixStem[1],
|
|
396
|
+
xmlpost_rel.get('index')
|
|
397
|
+
+ "|" + xmlpost_rel.get('head')
|
|
398
|
+
+ "|" + xmlpost_rel.get('relation'))
|
|
399
|
+
except:
|
|
400
|
+
pass
|
|
401
|
+
sents.append(word)
|
|
402
|
+
if sent or relation:
|
|
403
|
+
results.append(sents)
|
|
404
|
+
else:
|
|
405
|
+
results.extend(sents)
|
|
406
|
+
return LazyMap(lambda x: x, results)
|
|
407
|
+
|
|
408
|
+
|
|
409
|
+
# Ready-to-use browser opener
|
|
410
|
+
|
|
411
|
+
"""
|
|
412
|
+
The base URL for viewing files on the childes website. This
|
|
413
|
+
shouldn't need to be changed, unless CHILDES changes the configuration
|
|
414
|
+
of their server or unless the user sets up their own corpus webserver.
|
|
415
|
+
"""
|
|
416
|
+
childes_url_base = r'http://childes.psy.cmu.edu/browser/index.php?url='
|
|
417
|
+
|
|
418
|
+
|
|
419
|
+
def webview_file(self, fileid, urlbase=None):
|
|
420
|
+
"""Map a corpus file to its web version on the CHILDES website,
|
|
421
|
+
and open it in a web browser.
|
|
422
|
+
|
|
423
|
+
The complete URL to be used is:
|
|
424
|
+
childes.childes_url_base + urlbase + fileid.replace('.xml', '.cha')
|
|
425
|
+
|
|
426
|
+
If no urlbase is passed, we try to calculate it. This
|
|
427
|
+
requires that the childes corpus was set up to mirror the
|
|
428
|
+
folder hierarchy under childes.psy.cmu.edu/data-xml/, e.g.:
|
|
429
|
+
nltk_data/corpora/childes/Eng-USA/Cornell/??? or
|
|
430
|
+
nltk_data/corpora/childes/Romance/Spanish/Aguirre/???
|
|
431
|
+
|
|
432
|
+
The function first looks (as a special case) if "Eng-USA" is
|
|
433
|
+
on the path consisting of <corpus root>+fileid; then if
|
|
434
|
+
"childes", possibly followed by "data-xml", appears. If neither
|
|
435
|
+
one is found, we use the unmodified fileid and hope for the best.
|
|
436
|
+
If this is not right, specify urlbase explicitly, e.g., if the
|
|
437
|
+
corpus root points to the Cornell folder, urlbase='Eng-USA/Cornell'.
|
|
438
|
+
"""
|
|
439
|
+
|
|
440
|
+
import webbrowser, re
|
|
441
|
+
|
|
442
|
+
if urlbase:
|
|
443
|
+
path = urlbase+"/"+fileid
|
|
444
|
+
else:
|
|
445
|
+
full = self.root + "/" + fileid
|
|
446
|
+
full = re.sub(r'\\', '/', full)
|
|
447
|
+
if '/childes/' in full.lower():
|
|
448
|
+
# Discard /data-xml/ if present
|
|
449
|
+
path = re.findall(r'(?i)/childes(?:/data-xml)?/(.*)\.xml', full)[0]
|
|
450
|
+
elif 'eng-usa' in full.lower():
|
|
451
|
+
path = 'Eng-USA/' + re.findall(r'/(?i)Eng-USA/(.*)\.xml', full)[0]
|
|
452
|
+
else:
|
|
453
|
+
path = fileid
|
|
454
|
+
|
|
455
|
+
# Strip ".xml" and add ".cha", as necessary:
|
|
456
|
+
if path.endswith('.xml'):
|
|
457
|
+
path = path[:-4]
|
|
458
|
+
|
|
459
|
+
if not path.endswith('.cha'):
|
|
460
|
+
path = path+'.cha'
|
|
461
|
+
|
|
462
|
+
url = self.childes_url_base + path
|
|
463
|
+
|
|
464
|
+
webbrowser.open_new_tab(url)
|
|
465
|
+
print("Opening in browser:", url)
|
|
466
|
+
# Pausing is a good idea, but it's up to the user...
|
|
467
|
+
# raw_input("Hit Return to continue")
|
|
468
|
+
|
|
469
|
+
|
|
470
|
+
|
|
471
|
+
def demo(corpus_root=None):
|
|
472
|
+
"""
|
|
473
|
+
The CHILDES corpus should be manually downloaded and saved
|
|
474
|
+
to ``[NLTK_Data_Dir]/corpora/childes/``
|
|
475
|
+
"""
|
|
476
|
+
if not corpus_root:
|
|
477
|
+
from nltk.data import find
|
|
478
|
+
corpus_root = find('corpora/childes/data-xml/Eng-USA/')
|
|
479
|
+
|
|
480
|
+
try:
|
|
481
|
+
childes = CHILDESCorpusReader(corpus_root, '.*.xml')
|
|
482
|
+
# describe all corpus
|
|
483
|
+
for file in childes.fileids()[:5]:
|
|
484
|
+
corpus = ''
|
|
485
|
+
corpus_id = ''
|
|
486
|
+
for (key,value) in childes.corpus(file)[0].items():
|
|
487
|
+
if key == "Corpus": corpus = value
|
|
488
|
+
if key == "Id": corpus_id = value
|
|
489
|
+
print('Reading', corpus,corpus_id,' .....')
|
|
490
|
+
print("words:", childes.words(file)[:7],"...")
|
|
491
|
+
print("words with replaced words:", childes.words(file, replace=True)[:7]," ...")
|
|
492
|
+
print("words with pos tags:", childes.tagged_words(file)[:7]," ...")
|
|
493
|
+
print("words (only MOT):", childes.words(file, speaker='MOT')[:7], "...")
|
|
494
|
+
print("words (only CHI):", childes.words(file, speaker='CHI')[:7], "...")
|
|
495
|
+
print("stemmed words:", childes.words(file, stem=True)[:7]," ...")
|
|
496
|
+
print("words with relations and pos-tag:", childes.words(file, relation=True)[:5]," ...")
|
|
497
|
+
print("sentence:", childes.sents(file)[:2]," ...")
|
|
498
|
+
for (participant, values) in childes.participants(file)[0].items():
|
|
499
|
+
for (key, value) in values.items():
|
|
500
|
+
print("\tparticipant", participant, key, ":", value)
|
|
501
|
+
print("num of sent:", len(childes.sents(file)))
|
|
502
|
+
print("num of morphemes:", len(childes.words(file, stem=True)))
|
|
503
|
+
print("age:", childes.age(file))
|
|
504
|
+
print("age in month:", childes.age(file, month=True))
|
|
505
|
+
print("MLU:", childes.MLU(file))
|
|
506
|
+
print()
|
|
507
|
+
|
|
508
|
+
except LookupError as e:
|
|
509
|
+
print("""The CHILDES corpus, or the parts you need, should be manually
|
|
510
|
+
downloaded from http://childes.psy.cmu.edu/data-xml/ and saved at
|
|
511
|
+
[NLTK_Data_Dir]/corpora/childes/
|
|
512
|
+
Alternately, you can call the demo with the path to a portion of the CHILDES corpus, e.g.:
|
|
513
|
+
demo('/path/to/childes/data-xml/Eng-USA/")
|
|
514
|
+
""")
|
|
515
|
+
#corpus_root_http = urllib2.urlopen('http://childes.psy.cmu.edu/data-xml/Eng-USA/Bates.zip')
|
|
516
|
+
#corpus_root_http_bates = zipfile.ZipFile(cStringIO.StringIO(corpus_root_http.read()))
|
|
517
|
+
##this fails
|
|
518
|
+
#childes = CHILDESCorpusReader(corpus_root_http_bates,corpus_root_http_bates.namelist())
|
|
519
|
+
|
|
520
|
+
|
|
521
|
+
if __name__ == "__main__":
|
|
522
|
+
demo()
|