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,445 +1,443 @@
|
|
|
1
|
-
# coding: utf-8
|
|
2
|
-
# Natural Language Toolkit: vader
|
|
3
|
-
#
|
|
4
|
-
# Copyright (C) 2001-
|
|
5
|
-
# Author: C.J. Hutto <Clayton.Hutto@gtri.gatech.edu>
|
|
6
|
-
# Ewan Klein <ewan@inf.ed.ac.uk> (modifications)
|
|
7
|
-
# Pierpaolo Pantone <24alsecondo@gmail.com> (modifications)
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
#
|
|
11
|
-
#
|
|
12
|
-
#
|
|
13
|
-
#
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
import
|
|
25
|
-
import
|
|
26
|
-
import re
|
|
27
|
-
import string
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
["
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"
|
|
53
|
-
"
|
|
54
|
-
"
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"
|
|
66
|
-
"
|
|
67
|
-
"
|
|
68
|
-
"
|
|
69
|
-
"
|
|
70
|
-
"
|
|
71
|
-
"
|
|
72
|
-
"
|
|
73
|
-
"
|
|
74
|
-
"
|
|
75
|
-
"
|
|
76
|
-
"
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
"""
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
if include_nt:
|
|
95
|
-
for word in input_words:
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
if
|
|
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
|
-
self.
|
|
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
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
valence
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
#
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
if start_i ==
|
|
263
|
-
s = s*0.
|
|
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
|
-
bi = words_and_emoticons.index('
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
sentiments.
|
|
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
|
-
valence = valence*
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
valence = valence*
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
qm_count
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
qm_amplifier =
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
if sentiment_score
|
|
402
|
-
|
|
403
|
-
if sentiment_score
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
sum_s
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
pos_sum
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
"
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
return sentiment_dict
|
|
1
|
+
# coding: utf-8
|
|
2
|
+
# Natural Language Toolkit: vader
|
|
3
|
+
#
|
|
4
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
5
|
+
# Author: C.J. Hutto <Clayton.Hutto@gtri.gatech.edu>
|
|
6
|
+
# Ewan Klein <ewan@inf.ed.ac.uk> (modifications)
|
|
7
|
+
# Pierpaolo Pantone <24alsecondo@gmail.com> (modifications)
|
|
8
|
+
# George Berry <geb97@cornell.edu> (modifications)
|
|
9
|
+
# URL: <http://nltk.org/>
|
|
10
|
+
# For license information, see LICENSE.TXT
|
|
11
|
+
#
|
|
12
|
+
# Modifications to the original VADER code have been made in order to
|
|
13
|
+
# integrate it into NLTK. These have involved changes to
|
|
14
|
+
# ensure Python 3 compatibility, and refactoring to achieve greater modularity.
|
|
15
|
+
|
|
16
|
+
"""
|
|
17
|
+
If you use the VADER sentiment analysis tools, please cite:
|
|
18
|
+
|
|
19
|
+
Hutto, C.J. & Gilbert, E.E. (2014). VADER: A Parsimonious Rule-based Model for
|
|
20
|
+
Sentiment Analysis of Social Media Text. Eighth International Conference on
|
|
21
|
+
Weblogs and Social Media (ICWSM-14). Ann Arbor, MI, June 2014.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
import codecs
|
|
25
|
+
import math
|
|
26
|
+
import re
|
|
27
|
+
import string
|
|
28
|
+
from itertools import product
|
|
29
|
+
import nltk.data
|
|
30
|
+
from .util import pairwise
|
|
31
|
+
|
|
32
|
+
##Constants##
|
|
33
|
+
|
|
34
|
+
# (empirically derived mean sentiment intensity rating increase for booster words)
|
|
35
|
+
B_INCR = 0.293
|
|
36
|
+
B_DECR = -0.293
|
|
37
|
+
|
|
38
|
+
# (empirically derived mean sentiment intensity rating increase for using
|
|
39
|
+
# ALLCAPs to emphasize a word)
|
|
40
|
+
C_INCR = 0.733
|
|
41
|
+
|
|
42
|
+
N_SCALAR = -0.74
|
|
43
|
+
|
|
44
|
+
# for removing punctuation
|
|
45
|
+
REGEX_REMOVE_PUNCTUATION = re.compile('[{0}]'.format(re.escape(string.punctuation)))
|
|
46
|
+
|
|
47
|
+
PUNC_LIST = [".", "!", "?", ",", ";", ":", "-", "'", "\"",
|
|
48
|
+
"!!", "!!!", "??", "???", "?!?", "!?!", "?!?!", "!?!?"]
|
|
49
|
+
NEGATE = {"aint", "arent", "cannot", "cant", "couldnt", "darent", "didnt", "doesnt",
|
|
50
|
+
"ain't", "aren't", "can't", "couldn't", "daren't", "didn't", "doesn't",
|
|
51
|
+
"dont", "hadnt", "hasnt", "havent", "isnt", "mightnt", "mustnt", "neither",
|
|
52
|
+
"don't", "hadn't", "hasn't", "haven't", "isn't", "mightn't", "mustn't",
|
|
53
|
+
"neednt", "needn't", "never", "none", "nope", "nor", "not", "nothing", "nowhere",
|
|
54
|
+
"oughtnt", "shant", "shouldnt", "uhuh", "wasnt", "werent",
|
|
55
|
+
"oughtn't", "shan't", "shouldn't", "uh-uh", "wasn't", "weren't",
|
|
56
|
+
"without", "wont", "wouldnt", "won't", "wouldn't", "rarely", "seldom", "despite"}
|
|
57
|
+
|
|
58
|
+
# booster/dampener 'intensifiers' or 'degree adverbs'
|
|
59
|
+
# http://en.wiktionary.org/wiki/Category:English_degree_adverbs
|
|
60
|
+
|
|
61
|
+
BOOSTER_DICT = \
|
|
62
|
+
{"absolutely": B_INCR, "amazingly": B_INCR, "awfully": B_INCR, "completely": B_INCR, "considerably": B_INCR,
|
|
63
|
+
"decidedly": B_INCR, "deeply": B_INCR, "effing": B_INCR, "enormously": B_INCR,
|
|
64
|
+
"entirely": B_INCR, "especially": B_INCR, "exceptionally": B_INCR, "extremely": B_INCR,
|
|
65
|
+
"fabulously": B_INCR, "flipping": B_INCR, "flippin": B_INCR,
|
|
66
|
+
"fricking": B_INCR, "frickin": B_INCR, "frigging": B_INCR, "friggin": B_INCR, "fully": B_INCR, "fucking": B_INCR,
|
|
67
|
+
"greatly": B_INCR, "hella": B_INCR, "highly": B_INCR, "hugely": B_INCR, "incredibly": B_INCR,
|
|
68
|
+
"intensely": B_INCR, "majorly": B_INCR, "more": B_INCR, "most": B_INCR, "particularly": B_INCR,
|
|
69
|
+
"purely": B_INCR, "quite": B_INCR, "really": B_INCR, "remarkably": B_INCR,
|
|
70
|
+
"so": B_INCR, "substantially": B_INCR,
|
|
71
|
+
"thoroughly": B_INCR, "totally": B_INCR, "tremendously": B_INCR,
|
|
72
|
+
"uber": B_INCR, "unbelievably": B_INCR, "unusually": B_INCR, "utterly": B_INCR,
|
|
73
|
+
"very": B_INCR,
|
|
74
|
+
"almost": B_DECR, "barely": B_DECR, "hardly": B_DECR, "just enough": B_DECR,
|
|
75
|
+
"kind of": B_DECR, "kinda": B_DECR, "kindof": B_DECR, "kind-of": B_DECR,
|
|
76
|
+
"less": B_DECR, "little": B_DECR, "marginally": B_DECR, "occasionally": B_DECR, "partly": B_DECR,
|
|
77
|
+
"scarcely": B_DECR, "slightly": B_DECR, "somewhat": B_DECR,
|
|
78
|
+
"sort of": B_DECR, "sorta": B_DECR, "sortof": B_DECR, "sort-of": B_DECR}
|
|
79
|
+
|
|
80
|
+
# check for special case idioms using a sentiment-laden keyword known to SAGE
|
|
81
|
+
SPECIAL_CASE_IDIOMS = {"the shit": 3, "the bomb": 3, "bad ass": 1.5, "yeah right": -2,
|
|
82
|
+
"cut the mustard": 2, "kiss of death": -1.5, "hand to mouth": -2}
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
##Static methods##
|
|
86
|
+
|
|
87
|
+
def negated(input_words, include_nt=True):
|
|
88
|
+
"""
|
|
89
|
+
Determine if input contains negation words
|
|
90
|
+
"""
|
|
91
|
+
neg_words = NEGATE
|
|
92
|
+
if any(word.lower() in neg_words for word in input_words):
|
|
93
|
+
return True
|
|
94
|
+
if include_nt:
|
|
95
|
+
if any("n't" in word.lower() for word in input_words):
|
|
96
|
+
return True
|
|
97
|
+
for first, second in pairwise(input_words):
|
|
98
|
+
if second.lower() == "least" and first.lower() != 'at':
|
|
99
|
+
return True
|
|
100
|
+
return False
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def normalize(score, alpha=15):
|
|
104
|
+
"""
|
|
105
|
+
Normalize the score to be between -1 and 1 using an alpha that
|
|
106
|
+
approximates the max expected value
|
|
107
|
+
"""
|
|
108
|
+
norm_score = score/math.sqrt((score*score) + alpha)
|
|
109
|
+
return norm_score
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def allcap_differential(words):
|
|
113
|
+
"""
|
|
114
|
+
Check whether just some words in the input are ALL CAPS
|
|
115
|
+
|
|
116
|
+
:param list words: The words to inspect
|
|
117
|
+
:returns: `True` if some but not all items in `words` are ALL CAPS
|
|
118
|
+
"""
|
|
119
|
+
is_different = False
|
|
120
|
+
allcap_words = 0
|
|
121
|
+
for word in words:
|
|
122
|
+
if word.isupper():
|
|
123
|
+
allcap_words += 1
|
|
124
|
+
cap_differential = len(words) - allcap_words
|
|
125
|
+
if cap_differential > 0 and cap_differential < len(words):
|
|
126
|
+
is_different = True
|
|
127
|
+
return is_different
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def scalar_inc_dec(word, valence, is_cap_diff):
|
|
131
|
+
"""
|
|
132
|
+
Check if the preceding words increase, decrease, or negate/nullify the
|
|
133
|
+
valence
|
|
134
|
+
"""
|
|
135
|
+
scalar = 0.0
|
|
136
|
+
word_lower = word.lower()
|
|
137
|
+
if word_lower in BOOSTER_DICT:
|
|
138
|
+
scalar = BOOSTER_DICT[word_lower]
|
|
139
|
+
if valence < 0:
|
|
140
|
+
scalar *= -1
|
|
141
|
+
#check if booster/dampener word is in ALLCAPS (while others aren't)
|
|
142
|
+
if word.isupper() and is_cap_diff:
|
|
143
|
+
if valence > 0:
|
|
144
|
+
scalar += C_INCR
|
|
145
|
+
else: scalar -= C_INCR
|
|
146
|
+
return scalar
|
|
147
|
+
|
|
148
|
+
class SentiText(object):
|
|
149
|
+
"""
|
|
150
|
+
Identify sentiment-relevant string-level properties of input text.
|
|
151
|
+
"""
|
|
152
|
+
def __init__(self, text):
|
|
153
|
+
if not isinstance(text, str):
|
|
154
|
+
text = str(text.encode('utf-8'))
|
|
155
|
+
self.text = text
|
|
156
|
+
self.words_and_emoticons = self._words_and_emoticons()
|
|
157
|
+
# doesn't separate words from\
|
|
158
|
+
# adjacent punctuation (keeps emoticons & contractions)
|
|
159
|
+
self.is_cap_diff = allcap_differential(self.words_and_emoticons)
|
|
160
|
+
|
|
161
|
+
def _words_plus_punc(self):
|
|
162
|
+
"""
|
|
163
|
+
Returns mapping of form:
|
|
164
|
+
{
|
|
165
|
+
'cat,': 'cat',
|
|
166
|
+
',cat': 'cat',
|
|
167
|
+
}
|
|
168
|
+
"""
|
|
169
|
+
no_punc_text = REGEX_REMOVE_PUNCTUATION.sub('', self.text)
|
|
170
|
+
# removes punctuation (but loses emoticons & contractions)
|
|
171
|
+
words_only = no_punc_text.split()
|
|
172
|
+
# remove singletons
|
|
173
|
+
words_only = set( w for w in words_only if len(w) > 1 )
|
|
174
|
+
# the product gives ('cat', ',') and (',', 'cat')
|
|
175
|
+
punc_before = {''.join(p): p[1] for p in product(PUNC_LIST, words_only)}
|
|
176
|
+
punc_after = {''.join(p): p[0] for p in product(words_only, PUNC_LIST)}
|
|
177
|
+
words_punc_dict = punc_before
|
|
178
|
+
words_punc_dict.update(punc_after)
|
|
179
|
+
return words_punc_dict
|
|
180
|
+
|
|
181
|
+
def _words_and_emoticons(self):
|
|
182
|
+
"""
|
|
183
|
+
Removes leading and trailing puncutation
|
|
184
|
+
Leaves contractions and most emoticons
|
|
185
|
+
Does not preserve punc-plus-letter emoticons (e.g. :D)
|
|
186
|
+
"""
|
|
187
|
+
wes = self.text.split()
|
|
188
|
+
words_punc_dict = self._words_plus_punc()
|
|
189
|
+
wes = [we for we in wes if len(we) > 1]
|
|
190
|
+
for i, we in enumerate(wes):
|
|
191
|
+
if we in words_punc_dict:
|
|
192
|
+
wes[i] = words_punc_dict[we]
|
|
193
|
+
return wes
|
|
194
|
+
|
|
195
|
+
class SentimentIntensityAnalyzer(object):
|
|
196
|
+
"""
|
|
197
|
+
Give a sentiment intensity score to sentences.
|
|
198
|
+
"""
|
|
199
|
+
def __init__(self, lexicon_file="sentiment/vader_lexicon.zip/vader_lexicon/vader_lexicon.txt"):
|
|
200
|
+
self.lexicon_file = nltk.data.load(lexicon_file)
|
|
201
|
+
self.lexicon = self.make_lex_dict()
|
|
202
|
+
|
|
203
|
+
def make_lex_dict(self):
|
|
204
|
+
"""
|
|
205
|
+
Convert lexicon file to a dictionary
|
|
206
|
+
"""
|
|
207
|
+
lex_dict = {}
|
|
208
|
+
for line in self.lexicon_file.split('\n'):
|
|
209
|
+
(word, measure) = line.strip().split('\t')[0:2]
|
|
210
|
+
lex_dict[word] = float(measure)
|
|
211
|
+
return lex_dict
|
|
212
|
+
|
|
213
|
+
def polarity_scores(self, text):
|
|
214
|
+
"""
|
|
215
|
+
Return a float for sentiment strength based on the input text.
|
|
216
|
+
Positive values are positive valence, negative value are negative
|
|
217
|
+
valence.
|
|
218
|
+
"""
|
|
219
|
+
sentitext = SentiText(text)
|
|
220
|
+
#text, words_and_emoticons, is_cap_diff = self.preprocess(text)
|
|
221
|
+
|
|
222
|
+
sentiments = []
|
|
223
|
+
words_and_emoticons = sentitext.words_and_emoticons
|
|
224
|
+
for item in words_and_emoticons:
|
|
225
|
+
valence = 0
|
|
226
|
+
i = words_and_emoticons.index(item)
|
|
227
|
+
if (i < len(words_and_emoticons) - 1 and item.lower() == "kind" and \
|
|
228
|
+
words_and_emoticons[i+1].lower() == "of") or \
|
|
229
|
+
item.lower() in BOOSTER_DICT:
|
|
230
|
+
sentiments.append(valence)
|
|
231
|
+
continue
|
|
232
|
+
|
|
233
|
+
sentiments = self.sentiment_valence(valence, sentitext, item, i, sentiments)
|
|
234
|
+
|
|
235
|
+
sentiments = self._but_check(words_and_emoticons, sentiments)
|
|
236
|
+
|
|
237
|
+
return self.score_valence(sentiments, text)
|
|
238
|
+
|
|
239
|
+
def sentiment_valence(self, valence, sentitext, item, i, sentiments):
|
|
240
|
+
is_cap_diff = sentitext.is_cap_diff
|
|
241
|
+
words_and_emoticons = sentitext.words_and_emoticons
|
|
242
|
+
item_lowercase = item.lower()
|
|
243
|
+
if item_lowercase in self.lexicon:
|
|
244
|
+
#get the sentiment valence
|
|
245
|
+
valence = self.lexicon[item_lowercase]
|
|
246
|
+
|
|
247
|
+
#check if sentiment laden word is in ALL CAPS (while others aren't)
|
|
248
|
+
if item.isupper() and is_cap_diff:
|
|
249
|
+
if valence > 0:
|
|
250
|
+
valence += C_INCR
|
|
251
|
+
else:
|
|
252
|
+
valence -= C_INCR
|
|
253
|
+
|
|
254
|
+
for start_i in range(0,3):
|
|
255
|
+
if i > start_i and words_and_emoticons[i-(start_i+1)].lower() not in self.lexicon:
|
|
256
|
+
# dampen the scalar modifier of preceding words and emoticons
|
|
257
|
+
# (excluding the ones that immediately preceed the item) based
|
|
258
|
+
# on their distance from the current item.
|
|
259
|
+
s = scalar_inc_dec(words_and_emoticons[i-(start_i+1)], valence, is_cap_diff)
|
|
260
|
+
if start_i == 1 and s != 0:
|
|
261
|
+
s = s*0.95
|
|
262
|
+
if start_i == 2 and s != 0:
|
|
263
|
+
s = s*0.9
|
|
264
|
+
valence = valence+s
|
|
265
|
+
valence = self._never_check(valence, words_and_emoticons, start_i, i)
|
|
266
|
+
if start_i == 2:
|
|
267
|
+
valence = self._idioms_check(valence, words_and_emoticons, i)
|
|
268
|
+
|
|
269
|
+
# future work: consider other sentiment-laden idioms
|
|
270
|
+
# other_idioms =
|
|
271
|
+
# {"back handed": -2, "blow smoke": -2, "blowing smoke": -2,
|
|
272
|
+
# "upper hand": 1, "break a leg": 2,
|
|
273
|
+
# "cooking with gas": 2, "in the black": 2, "in the red": -2,
|
|
274
|
+
# "on the ball": 2,"under the weather": -2}
|
|
275
|
+
|
|
276
|
+
valence = self._least_check(valence, words_and_emoticons, i)
|
|
277
|
+
|
|
278
|
+
sentiments.append(valence)
|
|
279
|
+
return sentiments
|
|
280
|
+
|
|
281
|
+
def _least_check(self, valence, words_and_emoticons, i):
|
|
282
|
+
# check for negation case using "least"
|
|
283
|
+
if i > 1 and words_and_emoticons[i-1].lower() not in self.lexicon \
|
|
284
|
+
and words_and_emoticons[i-1].lower() == "least":
|
|
285
|
+
if words_and_emoticons[i-2].lower() != "at" and words_and_emoticons[i-2].lower() != "very":
|
|
286
|
+
valence = valence*N_SCALAR
|
|
287
|
+
elif i > 0 and words_and_emoticons[i-1].lower() not in self.lexicon \
|
|
288
|
+
and words_and_emoticons[i-1].lower() == "least":
|
|
289
|
+
valence = valence*N_SCALAR
|
|
290
|
+
return valence
|
|
291
|
+
|
|
292
|
+
def _but_check(self, words_and_emoticons, sentiments):
|
|
293
|
+
# check for modification in sentiment due to contrastive conjunction 'but'
|
|
294
|
+
if 'but' in words_and_emoticons or 'BUT' in words_and_emoticons:
|
|
295
|
+
try:
|
|
296
|
+
bi = words_and_emoticons.index('but')
|
|
297
|
+
except ValueError:
|
|
298
|
+
bi = words_and_emoticons.index('BUT')
|
|
299
|
+
for sentiment in sentiments:
|
|
300
|
+
si = sentiments.index(sentiment)
|
|
301
|
+
if si < bi:
|
|
302
|
+
sentiments.pop(si)
|
|
303
|
+
sentiments.insert(si, sentiment*0.5)
|
|
304
|
+
elif si > bi:
|
|
305
|
+
sentiments.pop(si)
|
|
306
|
+
sentiments.insert(si, sentiment*1.5)
|
|
307
|
+
return sentiments
|
|
308
|
+
|
|
309
|
+
def _idioms_check(self, valence, words_and_emoticons, i):
|
|
310
|
+
onezero = "{0} {1}".format(words_and_emoticons[i-1], words_and_emoticons[i])
|
|
311
|
+
|
|
312
|
+
twoonezero = "{0} {1} {2}".format(words_and_emoticons[i-2],
|
|
313
|
+
words_and_emoticons[i-1], words_and_emoticons[i])
|
|
314
|
+
|
|
315
|
+
twoone = "{0} {1}".format(words_and_emoticons[i-2], words_and_emoticons[i-1])
|
|
316
|
+
|
|
317
|
+
threetwoone = "{0} {1} {2}".format(words_and_emoticons[i-3],
|
|
318
|
+
words_and_emoticons[i-2], words_and_emoticons[i-1])
|
|
319
|
+
|
|
320
|
+
threetwo = "{0} {1}".format(words_and_emoticons[i-3], words_and_emoticons[i-2])
|
|
321
|
+
|
|
322
|
+
sequences = [onezero, twoonezero, twoone, threetwoone, threetwo]
|
|
323
|
+
|
|
324
|
+
for seq in sequences:
|
|
325
|
+
if seq in SPECIAL_CASE_IDIOMS:
|
|
326
|
+
valence = SPECIAL_CASE_IDIOMS[seq]
|
|
327
|
+
break
|
|
328
|
+
|
|
329
|
+
if len(words_and_emoticons)-1 > i:
|
|
330
|
+
zeroone = "{0} {1}".format(words_and_emoticons[i], words_and_emoticons[i+1])
|
|
331
|
+
if zeroone in SPECIAL_CASE_IDIOMS:
|
|
332
|
+
valence = SPECIAL_CASE_IDIOMS[zeroone]
|
|
333
|
+
if len(words_and_emoticons)-1 > i+1:
|
|
334
|
+
zeroonetwo = "{0} {1} {2}".format(words_and_emoticons[i], words_and_emoticons[i+1], words_and_emoticons[i+2])
|
|
335
|
+
if zeroonetwo in SPECIAL_CASE_IDIOMS:
|
|
336
|
+
valence = SPECIAL_CASE_IDIOMS[zeroonetwo]
|
|
337
|
+
|
|
338
|
+
# check for booster/dampener bi-grams such as 'sort of' or 'kind of'
|
|
339
|
+
if threetwo in BOOSTER_DICT or twoone in BOOSTER_DICT:
|
|
340
|
+
valence = valence+B_DECR
|
|
341
|
+
return valence
|
|
342
|
+
|
|
343
|
+
def _never_check(self, valence, words_and_emoticons, start_i, i):
|
|
344
|
+
if start_i == 0:
|
|
345
|
+
if negated([words_and_emoticons[i-1]]):
|
|
346
|
+
valence = valence*N_SCALAR
|
|
347
|
+
if start_i == 1:
|
|
348
|
+
if words_and_emoticons[i-2] == "never" and\
|
|
349
|
+
(words_and_emoticons[i-1] == "so" or
|
|
350
|
+
words_and_emoticons[i-1] == "this"):
|
|
351
|
+
valence = valence*1.5
|
|
352
|
+
elif negated([words_and_emoticons[i-(start_i+1)]]):
|
|
353
|
+
valence = valence*N_SCALAR
|
|
354
|
+
if start_i == 2:
|
|
355
|
+
if words_and_emoticons[i-3] == "never" and \
|
|
356
|
+
(words_and_emoticons[i-2] == "so" or words_and_emoticons[i-2] == "this") or \
|
|
357
|
+
(words_and_emoticons[i-1] == "so" or words_and_emoticons[i-1] == "this"):
|
|
358
|
+
valence = valence*1.25
|
|
359
|
+
elif negated([words_and_emoticons[i-(start_i+1)]]):
|
|
360
|
+
valence = valence*N_SCALAR
|
|
361
|
+
return valence
|
|
362
|
+
|
|
363
|
+
def _punctuation_emphasis(self, sum_s, text):
|
|
364
|
+
# add emphasis from exclamation points and question marks
|
|
365
|
+
ep_amplifier = self._amplify_ep(text)
|
|
366
|
+
qm_amplifier = self._amplify_qm(text)
|
|
367
|
+
punct_emph_amplifier = ep_amplifier+qm_amplifier
|
|
368
|
+
return punct_emph_amplifier
|
|
369
|
+
|
|
370
|
+
def _amplify_ep(self, text):
|
|
371
|
+
# check for added emphasis resulting from exclamation points (up to 4 of them)
|
|
372
|
+
ep_count = text.count("!")
|
|
373
|
+
if ep_count > 4:
|
|
374
|
+
ep_count = 4
|
|
375
|
+
# (empirically derived mean sentiment intensity rating increase for
|
|
376
|
+
# exclamation points)
|
|
377
|
+
ep_amplifier = ep_count*0.292
|
|
378
|
+
return ep_amplifier
|
|
379
|
+
|
|
380
|
+
def _amplify_qm(self, text):
|
|
381
|
+
# check for added emphasis resulting from question marks (2 or 3+)
|
|
382
|
+
qm_count = text.count("?")
|
|
383
|
+
qm_amplifier = 0
|
|
384
|
+
if qm_count > 1:
|
|
385
|
+
if qm_count <= 3:
|
|
386
|
+
# (empirically derived mean sentiment intensity rating increase for
|
|
387
|
+
# question marks)
|
|
388
|
+
qm_amplifier = qm_count*0.18
|
|
389
|
+
else:
|
|
390
|
+
qm_amplifier = 0.96
|
|
391
|
+
return qm_amplifier
|
|
392
|
+
|
|
393
|
+
def _sift_sentiment_scores(self, sentiments):
|
|
394
|
+
# want separate positive versus negative sentiment scores
|
|
395
|
+
pos_sum = 0.0
|
|
396
|
+
neg_sum = 0.0
|
|
397
|
+
neu_count = 0
|
|
398
|
+
for sentiment_score in sentiments:
|
|
399
|
+
if sentiment_score > 0:
|
|
400
|
+
pos_sum += (float(sentiment_score) +1) # compensates for neutral words that are counted as 1
|
|
401
|
+
if sentiment_score < 0:
|
|
402
|
+
neg_sum += (float(sentiment_score) -1) # when used with math.fabs(), compensates for neutrals
|
|
403
|
+
if sentiment_score == 0:
|
|
404
|
+
neu_count += 1
|
|
405
|
+
return pos_sum, neg_sum, neu_count
|
|
406
|
+
|
|
407
|
+
def score_valence(self, sentiments, text):
|
|
408
|
+
if sentiments:
|
|
409
|
+
sum_s = float(sum(sentiments))
|
|
410
|
+
# compute and add emphasis from punctuation in text
|
|
411
|
+
punct_emph_amplifier = self._punctuation_emphasis(sum_s, text)
|
|
412
|
+
if sum_s > 0:
|
|
413
|
+
sum_s += punct_emph_amplifier
|
|
414
|
+
elif sum_s < 0:
|
|
415
|
+
sum_s -= punct_emph_amplifier
|
|
416
|
+
|
|
417
|
+
compound = normalize(sum_s)
|
|
418
|
+
# discriminate between positive, negative and neutral sentiment scores
|
|
419
|
+
pos_sum, neg_sum, neu_count = self._sift_sentiment_scores(sentiments)
|
|
420
|
+
|
|
421
|
+
if pos_sum > math.fabs(neg_sum):
|
|
422
|
+
pos_sum += (punct_emph_amplifier)
|
|
423
|
+
elif pos_sum < math.fabs(neg_sum):
|
|
424
|
+
neg_sum -= (punct_emph_amplifier)
|
|
425
|
+
|
|
426
|
+
total = pos_sum + math.fabs(neg_sum) + neu_count
|
|
427
|
+
pos = math.fabs(pos_sum / total)
|
|
428
|
+
neg = math.fabs(neg_sum / total)
|
|
429
|
+
neu = math.fabs(neu_count / total)
|
|
430
|
+
|
|
431
|
+
else:
|
|
432
|
+
compound = 0.0
|
|
433
|
+
pos = 0.0
|
|
434
|
+
neg = 0.0
|
|
435
|
+
neu = 0.0
|
|
436
|
+
|
|
437
|
+
sentiment_dict = \
|
|
438
|
+
{"neg" : round(neg, 3),
|
|
439
|
+
"neu" : round(neu, 3),
|
|
440
|
+
"pos" : round(pos, 3),
|
|
441
|
+
"compound" : round(compound, 4)}
|
|
442
|
+
|
|
443
|
+
return sentiment_dict
|