nltk 3.2.1__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.1 → nltk-3.3}/LICENSE.txt +1 -1
- {nltk-3.2.1/nltk.egg-info → nltk-3.3}/PKG-INFO +13 -5
- nltk-3.3/README.md +49 -0
- nltk-3.3/nltk/VERSION +1 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/__init__.py +3 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/app/__init__.py +2 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/app/chartparser_app.py +92 -92
- {nltk-3.2.1 → nltk-3.3}/nltk/app/chunkparser_app.py +11 -13
- {nltk-3.2.1 → nltk-3.3}/nltk/app/collocations_app.py +8 -11
- {nltk-3.2.1 → nltk-3.3}/nltk/app/concordance_app.py +9 -11
- {nltk-3.2.1 → nltk-3.3}/nltk/app/nemo_app.py +18 -17
- {nltk-3.2.1 → nltk-3.3}/nltk/app/rdparser_app.py +10 -12
- {nltk-3.2.1 → nltk-3.3}/nltk/app/srparser_app.py +16 -16
- {nltk-3.2.1 → nltk-3.3}/nltk/app/wordfreq_app.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/app/wordnet_app.py +11 -11
- {nltk-3.2.1 → nltk-3.3}/nltk/book.py +2 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/ccg/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/ccg/api.py +67 -47
- {nltk-3.2.1 → nltk-3.3}/nltk/ccg/chart.py +7 -5
- {nltk-3.2.1 → nltk-3.3}/nltk/ccg/combinator.py +42 -11
- {nltk-3.2.1 → nltk-3.3}/nltk/ccg/lexicon.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/ccg/logic.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/chat/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/chat/eliza.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/chat/iesha.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/chat/rude.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/chat/suntsu.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/chat/util.py +12 -10
- {nltk-3.2.1 → nltk-3.3}/nltk/chat/zen.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/chunk/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/chunk/api.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/chunk/named_entity.py +13 -13
- {nltk-3.2.1 → nltk-3.3}/nltk/chunk/regexp.py +9 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/chunk/util.py +12 -12
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/api.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/decisiontree.py +18 -18
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/maxent.py +26 -8
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/megam.py +5 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/naivebayes.py +29 -26
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/rte_classify.py +58 -89
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/scikitlearn.py +4 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/senna.py +24 -22
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/svm.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/tadm.py +4 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/textcat.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/util.py +13 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/weka.py +7 -6
- {nltk-3.2.1 → nltk-3.3}/nltk/cluster/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/cluster/api.py +9 -5
- {nltk-3.2.1 → nltk-3.3}/nltk/cluster/em.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/cluster/gaac.py +3 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/cluster/kmeans.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/cluster/util.py +35 -20
- nltk-3.3/nltk/collections.py +640 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/collocations.py +2 -2
- nltk-3.3/nltk/compat.py +365 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/__init__.py +37 -16
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/europarl_raw.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/__init__.py +4 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/aligned.py +4 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/api.py +12 -10
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/bnc.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/bracket_parse.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/categorized_sents.py +4 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/chasen.py +5 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/childes.py +8 -9
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/chunked.py +4 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/cmudict.py +4 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/comparative_sents.py +4 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/conll.py +19 -12
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/crubadan.py +2 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/dependency.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/framenet.py +1085 -119
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/ieer.py +4 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/indian.py +4 -5
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/ipipan.py +6 -5
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/knbc.py +2 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/lin.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/mte.py +5 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/nkjp.py +4 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/nombank.py +8 -8
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/nps_chat.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/opinion_lexicon.py +3 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/panlex_lite.py +1 -1
- nltk-3.3/nltk/corpus/reader/pl196x.py +292 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/plaintext.py +3 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/ppattach.py +4 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/propbank.py +8 -10
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/pros_cons.py +5 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/reviews.py +3 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/rte.py +5 -7
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/semcor.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/senseval.py +4 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/sentiwordnet.py +3 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/sinica_treebank.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/string_category.py +4 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/switchboard.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/tagged.py +4 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/timit.py +10 -8
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/toolbox.py +4 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/twitter.py +4 -6
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/util.py +7 -3
- nltk-3.3/nltk/corpus/reader/verbnet.py +595 -0
- nltk-3.3/nltk/corpus/reader/wordlist.py +134 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/wordnet.py +357 -285
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/xmldocs.py +10 -5
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/ycoe.py +25 -24
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/util.py +22 -5
- {nltk-3.2.1 → nltk-3.3}/nltk/data.py +65 -29
- {nltk-3.2.1 → nltk-3.3}/nltk/decorators.py +5 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/downloader.py +59 -55
- {nltk-3.2.1 → nltk-3.3}/nltk/draw/__init__.py +4 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/draw/cfg.py +5 -8
- {nltk-3.2.1 → nltk-3.3}/nltk/draw/dispersion.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/draw/table.py +4 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/draw/tree.py +2 -5
- {nltk-3.2.1 → nltk-3.3}/nltk/draw/util.py +17 -17
- {nltk-3.2.1 → nltk-3.3}/nltk/featstruct.py +290 -173
- {nltk-3.2.1 → nltk-3.3}/nltk/grammar.py +87 -44
- {nltk-3.2.1 → nltk-3.3}/nltk/help.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/inference/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/inference/api.py +27 -19
- {nltk-3.2.1 → nltk-3.3}/nltk/inference/discourse.py +20 -16
- {nltk-3.2.1 → nltk-3.3}/nltk/inference/nonmonotonic.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/inference/prover9.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/inference/resolution.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/inference/tableau.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/internals.py +44 -44
- {nltk-3.2.1 → nltk-3.3}/nltk/jsontags.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/metrics/__init__.py +2 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/metrics/agreement.py +29 -9
- nltk-3.3/nltk/metrics/aline.py +607 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/metrics/association.py +8 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/metrics/confusionmatrix.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/metrics/distance.py +12 -7
- {nltk-3.2.1 → nltk-3.3}/nltk/metrics/paice.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/metrics/scores.py +7 -7
- {nltk-3.2.1 → nltk-3.3}/nltk/metrics/segmentation.py +4 -5
- {nltk-3.2.1 → nltk-3.3}/nltk/metrics/spearman.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/misc/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/misc/chomsky.py +4 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/misc/minimalset.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/misc/sort.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/misc/wordfinder.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/__init__.py +2 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/api.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/bllip.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/chart.py +8 -7
- nltk-3.3/nltk/parse/corenlp.py +780 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/dependencygraph.py +4 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/earleychart.py +4 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/evaluate.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/featurechart.py +6 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/generate.py +15 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/malt.py +2 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/nonprojectivedependencyparser.py +3 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/pchart.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/projectivedependencyparser.py +6 -5
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/recursivedescent.py +2 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/shiftreduce.py +2 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/stanford.py +53 -28
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/transitionparser.py +11 -9
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/util.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/viterbi.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/probability.py +75 -20
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/boxer.py +15 -15
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/chat80.py +6 -6
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/cooper_storage.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/drt.py +9 -8
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/drt_glue_demo.py +5 -9
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/evaluate.py +9 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/glue.py +8 -6
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/hole.py +4 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/lfg.py +4 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/linearlogic.py +4 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/logic.py +14 -14
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/relextract.py +11 -18
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/skolemize.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/util.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/sentiment/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/sentiment/sentiment_analyzer.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/sentiment/util.py +14 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/sentiment/vader.py +41 -42
- {nltk-3.2.1 → nltk-3.3}/nltk/stem/__init__.py +1 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/stem/api.py +7 -4
- nltk-3.3/nltk/stem/arlstem.py +369 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/stem/isri.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/stem/lancaster.py +39 -12
- nltk-3.3/nltk/stem/porter.py +710 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/stem/regexp.py +2 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/stem/rslp.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/stem/snowball.py +537 -13
- {nltk-3.2.1 → nltk-3.3}/nltk/stem/util.py +11 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/stem/wordnet.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/__init__.py +32 -7
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/api.py +13 -8
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/brill.py +4 -6
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/crf.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/hmm.py +11 -11
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/hunpos.py +4 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/mapping.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/perceptron.py +25 -10
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/senna.py +25 -23
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/sequential.py +19 -15
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/stanford.py +59 -36
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/tnt.py +11 -20
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/util.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/tbl/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/tbl/demo.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/tbl/erroranalysis.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/tbl/feature.py +5 -7
- {nltk-3.2.1 → nltk-3.3}/nltk/tbl/rule.py +6 -6
- {nltk-3.2.1 → nltk-3.3}/nltk/tbl/template.py +18 -23
- {nltk-3.2.1 → nltk-3.3}/nltk/test/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/all.py +7 -6
- {nltk-3.2.1 → nltk-3.3}/nltk/test/bnc.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/ccg.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/ccg_semantics.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/chat80.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/childes_fixt.py +1 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/chunk.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/classify.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/classify_fixt.py +2 -1
- nltk-3.3/nltk/test/collections.doctest +20 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/collocations.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/compat.doctest +0 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/test/compat_fixt.py +1 -0
- nltk-3.3/nltk/test/concordance.doctest +55 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/corpus.doctest +38 -49
- {nltk-3.2.1 → nltk-3.3}/nltk/test/crubadan.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/data.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/dependency.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/discourse.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/discourse_fixt.py +1 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/doctest_nose_plugin.py +8 -5
- {nltk-3.2.1 → nltk-3.3}/nltk/test/drt.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/featgram.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/featstruct.doctest +2 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/test/framenet.doctest +82 -33
- {nltk-3.2.1 → nltk-3.3}/nltk/test/generate.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/gensim.doctest +6 -7
- {nltk-3.2.1 → nltk-3.3}/nltk/test/gensim_fixt.py +1 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/gluesemantics.doctest +13 -15
- {nltk-3.2.1 → nltk-3.3}/nltk/test/gluesemantics_malt.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/gluesemantics_malt_fixt.py +1 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/grammar.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/grammartestsuites.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/index.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/inference.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/inference_fixt.py +1 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/internals.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/japanese.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/logic.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/metrics.doctest +3 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/test/misc.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/nonmonotonic.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/nonmonotonic_fixt.py +1 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/parse.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/portuguese_en.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/probability.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/probability_fixt.py +2 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/propbank.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/relextract.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/resolution.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/runtests.py +35 -13
- {nltk-3.2.1 → nltk-3.3}/nltk/test/semantics.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/sentiment.doctest +3 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/test/sentiwordnet.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/simple.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/stem.doctest +2 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/test/tag.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/tokenize.doctest +109 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/test/toolbox.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/translate.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/tree.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/treeprettyprinter.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/treetransforms.doctest +1 -1
- 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.1 → nltk-3.3}/nltk/test/unit/test_classify.py +20 -18
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_collocations.py +16 -7
- 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.1 → nltk-3.3}/nltk/test/unit/test_corpora.py +18 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_json2csv_corpus.py +4 -3
- nltk-3.3/nltk/test/unit/test_rte_classify.py +86 -0
- 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.1 → nltk-3.3}/nltk/test/unit/test_tgrep.py +4 -2
- nltk-3.3/nltk/test/unit/test_tokenize.py +168 -0
- 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.3/nltk/test/unit/translate/test_nist.py +37 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/translate/test_stack_decoder.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/util.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/wordnet.doctest +17 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/test/wordnet_fixt.py +1 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/wordnet_lch.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/wsd.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/text.py +92 -39
- {nltk-3.2.1 → nltk-3.3}/nltk/tgrep.py +8 -7
- {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/__init__.py +37 -15
- {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/api.py +3 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/casual.py +10 -9
- {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/mwe.py +2 -2
- nltk-3.3/nltk/tokenize/nist.py +173 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/punkt.py +186 -167
- {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/regexp.py +13 -7
- nltk-3.3/nltk/tokenize/repp.py +151 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/sexpr.py +4 -6
- {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/simple.py +7 -5
- {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/stanford.py +18 -14
- nltk-3.3/nltk/tokenize/stanford_segmenter.py +246 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/texttiling.py +43 -45
- 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.1 → nltk-3.3}/nltk/toolbox.py +4 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/api.py +50 -40
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/bleu_score.py +221 -156
- nltk-3.3/nltk/translate/chrf_score.py +137 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/gale_church.py +32 -19
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/gdfa.py +14 -10
- nltk-3.3/nltk/translate/gleu_score.py +193 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/ibm1.py +17 -8
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/ibm2.py +4 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/ibm4.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/ibm5.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/ibm_model.py +4 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/metrics.py +1 -1
- nltk-3.3/nltk/translate/nist_score.py +178 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/phrase_based.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/ribes_score.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/stack_decoder.py +5 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/tree.py +10 -8
- {nltk-3.2.1 → nltk-3.3}/nltk/treeprettyprinter.py +6 -6
- {nltk-3.2.1 → nltk-3.3}/nltk/twitter/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/twitter/api.py +8 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/twitter/common.py +9 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/twitter/twitter_demo.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/twitter/twitterclient.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/twitter/util.py +5 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/util.py +41 -654
- {nltk-3.2.1 → nltk-3.3}/nltk/wsd.py +2 -2
- {nltk-3.2.1 → nltk-3.3/nltk.egg-info}/PKG-INFO +13 -5
- {nltk-3.2.1 → nltk-3.3}/nltk.egg-info/SOURCES.txt +23 -1
- nltk-3.3/nltk.egg-info/requires.txt +31 -0
- {nltk-3.2.1 → nltk-3.3}/setup.cfg +0 -1
- {nltk-3.2.1 → nltk-3.3}/setup.py +32 -5
- nltk-3.2.1/nltk/VERSION +0 -1
- nltk-3.2.1/nltk/compat.py +0 -706
- nltk-3.2.1/nltk/corpus/reader/pl196x.py +0 -278
- nltk-3.2.1/nltk/corpus/reader/verbnet.py +0 -408
- nltk-3.2.1/nltk/corpus/reader/wordlist.py +0 -37
- nltk-3.2.1/nltk/six.py +0 -868
- nltk-3.2.1/nltk/stem/porter.py +0 -692
- nltk-3.2.1/nltk/test/unit/test_stem.py +0 -36
- nltk-3.2.1/nltk/test/unit/test_tokenize.py +0 -23
- nltk-3.2.1/nltk/test/unit/translate/test_bleu.py +0 -138
- nltk-3.2.1/nltk/tokenize/stanford_segmenter.py +0 -157
- nltk-3.2.1/nltk/tokenize/treebank.py +0 -124
- nltk-3.2.1/nltk/tokenize/util.py +0 -90
- {nltk-3.2.1 → nltk-3.3}/INSTALL.txt +0 -0
- {nltk-3.2.1 → nltk-3.3}/MANIFEST.in +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/positivenaivebayes.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/udhr.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/inference/mace.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/lazyimport.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/misc/babelfish.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/brill_trainer.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/tbl/api.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/bleu.doctest +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/childes.doctest +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/corpus_fixt.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/paice.doctest +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/portuguese_en_fixt.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/segmentation_fixt.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/semantics_fixt.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/translate_fixt.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/__init__.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_2x_compat.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_corpus_views.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_hmm.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_naivebayes.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_seekable_unicode_stream_reader.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_tag.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_twitter_auth.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/translate/__init__.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/translate/test_ibm1.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/translate/test_ibm2.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/translate/test_ibm3.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/translate/test_ibm4.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/translate/test_ibm5.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/translate/test_ibm_model.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/utils.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/ibm3.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/treetransforms.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk.egg-info/dependency_links.txt +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk.egg-info/not-zip-safe +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk.egg-info/top_level.txt +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
# Natural Language Toolkit: Taggers
|
|
3
3
|
#
|
|
4
|
-
# Copyright (C) 2001-
|
|
4
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
5
5
|
# Author: Edward Loper <edloper@gmail.com>
|
|
6
6
|
# Steven Bird <stevenbird1@gmail.com> (minor additions)
|
|
7
7
|
# URL: <http://nltk.org/>
|
|
@@ -19,13 +19,20 @@ the word ``'fly'`` with a noun part of speech tag (``'NN'``):
|
|
|
19
19
|
|
|
20
20
|
>>> tagged_tok = ('fly', 'NN')
|
|
21
21
|
|
|
22
|
-
An off-the-shelf tagger is available.
|
|
22
|
+
An off-the-shelf tagger is available for English. It uses the Penn Treebank tagset:
|
|
23
23
|
|
|
24
24
|
>>> from nltk import pos_tag, word_tokenize
|
|
25
25
|
>>> pos_tag(word_tokenize("John's big idea isn't all that bad."))
|
|
26
26
|
[('John', 'NNP'), ("'s", 'POS'), ('big', 'JJ'), ('idea', 'NN'), ('is', 'VBZ'),
|
|
27
27
|
("n't", 'RB'), ('all', 'PDT'), ('that', 'DT'), ('bad', 'JJ'), ('.', '.')]
|
|
28
28
|
|
|
29
|
+
A Russian tagger is also available if you specify lang="rus". It uses
|
|
30
|
+
the Russian National Corpus tagset:
|
|
31
|
+
|
|
32
|
+
>>> pos_tag(word_tokenize("Илья оторопел и дважды перечитал бумажку."), lang='rus') # doctest: +SKIP
|
|
33
|
+
[('Илья', 'S'), ('оторопел', 'V'), ('и', 'CONJ'), ('дважды', 'ADV'), ('перечитал', 'V'),
|
|
34
|
+
('бумажку', 'S'), ('.', 'NONLEX')]
|
|
35
|
+
|
|
29
36
|
This package defines several taggers, which take a list of tokens,
|
|
30
37
|
assign a tag to each one, and return the resulting list of tagged tokens.
|
|
31
38
|
Most of the taggers are built automatically based on a training corpus.
|
|
@@ -76,7 +83,20 @@ from nltk.tag.mapping import tagset_mapping, map_tag
|
|
|
76
83
|
from nltk.tag.crf import CRFTagger
|
|
77
84
|
from nltk.tag.perceptron import PerceptronTagger
|
|
78
85
|
|
|
79
|
-
from nltk.data import load
|
|
86
|
+
from nltk.data import load, find
|
|
87
|
+
|
|
88
|
+
RUS_PICKLE = 'taggers/averaged_perceptron_tagger_ru/averaged_perceptron_tagger_ru.pickle'
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def _get_tagger(lang=None):
|
|
92
|
+
if lang == 'rus':
|
|
93
|
+
tagger = PerceptronTagger(False)
|
|
94
|
+
ap_russian_model_loc = 'file:' + str(find(RUS_PICKLE))
|
|
95
|
+
tagger.load(ap_russian_model_loc)
|
|
96
|
+
else:
|
|
97
|
+
tagger = PerceptronTagger()
|
|
98
|
+
return tagger
|
|
99
|
+
|
|
80
100
|
|
|
81
101
|
def _pos_tag(tokens, tagset, tagger):
|
|
82
102
|
tagged_tokens = tagger.tag(tokens)
|
|
@@ -84,7 +104,8 @@ def _pos_tag(tokens, tagset, tagger):
|
|
|
84
104
|
tagged_tokens = [(token, map_tag('en-ptb', tagset, tag)) for (token, tag) in tagged_tokens]
|
|
85
105
|
return tagged_tokens
|
|
86
106
|
|
|
87
|
-
|
|
107
|
+
|
|
108
|
+
def pos_tag(tokens, tagset=None, lang='eng'):
|
|
88
109
|
"""
|
|
89
110
|
Use NLTK's currently recommended part of speech tagger to
|
|
90
111
|
tag the given list of tokens.
|
|
@@ -104,14 +125,16 @@ def pos_tag(tokens, tagset=None):
|
|
|
104
125
|
:type tokens: list(str)
|
|
105
126
|
:param tagset: the tagset to be used, e.g. universal, wsj, brown
|
|
106
127
|
:type tagset: str
|
|
128
|
+
:param lang: the ISO 639 code of the language, e.g. 'eng' for English, 'rus' for Russian
|
|
129
|
+
:type lang: str
|
|
107
130
|
:return: The tagged tokens
|
|
108
131
|
:rtype: list(tuple(str, str))
|
|
109
132
|
"""
|
|
110
|
-
tagger =
|
|
133
|
+
tagger = _get_tagger(lang)
|
|
111
134
|
return _pos_tag(tokens, tagset, tagger)
|
|
112
135
|
|
|
113
136
|
|
|
114
|
-
def pos_tag_sents(sentences, tagset=None):
|
|
137
|
+
def pos_tag_sents(sentences, tagset=None, lang='eng'):
|
|
115
138
|
"""
|
|
116
139
|
Use NLTK's currently recommended part of speech tagger to tag the
|
|
117
140
|
given list of sentences, each consisting of a list of tokens.
|
|
@@ -120,8 +143,10 @@ def pos_tag_sents(sentences, tagset=None):
|
|
|
120
143
|
:type tokens: list(list(str))
|
|
121
144
|
:param tagset: the tagset to be used, e.g. universal, wsj, brown
|
|
122
145
|
:type tagset: str
|
|
146
|
+
:param lang: the ISO 639 code of the language, e.g. 'eng' for English, 'rus' for Russian
|
|
147
|
+
:type lang: str
|
|
123
148
|
:return: The list of tagged sentences
|
|
124
149
|
:rtype: list(list(tuple(str, str)))
|
|
125
150
|
"""
|
|
126
|
-
tagger =
|
|
151
|
+
tagger = _get_tagger(lang)
|
|
127
152
|
return [_pos_tag(sent, tagset, tagger) for sent in sentences]
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Natural Language Toolkit: Tagger Interface
|
|
2
2
|
#
|
|
3
|
-
# Copyright (C) 2001-
|
|
3
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
4
4
|
# Author: Edward Loper <edloper@gmail.com>
|
|
5
5
|
# Steven Bird <stevenbird1@gmail.com> (minor additions)
|
|
6
6
|
# URL: <http://nltk.org/>
|
|
@@ -10,11 +10,17 @@
|
|
|
10
10
|
Interface for tagging each token in a sentence with supplementary
|
|
11
11
|
information, such as its part of speech.
|
|
12
12
|
"""
|
|
13
|
+
from abc import ABCMeta, abstractmethod
|
|
14
|
+
from six import add_metaclass
|
|
15
|
+
from itertools import chain
|
|
16
|
+
|
|
13
17
|
from nltk.internals import overridden
|
|
14
18
|
from nltk.metrics import accuracy
|
|
15
19
|
|
|
16
20
|
from nltk.tag.util import untag
|
|
17
21
|
|
|
22
|
+
|
|
23
|
+
@add_metaclass(ABCMeta)
|
|
18
24
|
class TaggerI(object):
|
|
19
25
|
"""
|
|
20
26
|
A processing interface for assigning a tag to each token in a list.
|
|
@@ -29,6 +35,7 @@ class TaggerI(object):
|
|
|
29
35
|
Subclasses must define:
|
|
30
36
|
- either ``tag()`` or ``tag_sents()`` (or both)
|
|
31
37
|
"""
|
|
38
|
+
@abstractmethod
|
|
32
39
|
def tag(self, tokens):
|
|
33
40
|
"""
|
|
34
41
|
Determine the most appropriate tag sequence for the given
|
|
@@ -39,8 +46,6 @@ class TaggerI(object):
|
|
|
39
46
|
"""
|
|
40
47
|
if overridden(self.tag_sents):
|
|
41
48
|
return self.tag_sents([tokens])[0]
|
|
42
|
-
else:
|
|
43
|
-
raise NotImplementedError()
|
|
44
49
|
|
|
45
50
|
def tag_sents(self, sentences):
|
|
46
51
|
"""
|
|
@@ -62,13 +67,15 @@ class TaggerI(object):
|
|
|
62
67
|
"""
|
|
63
68
|
|
|
64
69
|
tagged_sents = self.tag_sents(untag(sent) for sent in gold)
|
|
65
|
-
gold_tokens =
|
|
66
|
-
test_tokens =
|
|
70
|
+
gold_tokens = list(chain(*gold))
|
|
71
|
+
test_tokens = list(chain(*tagged_sents))
|
|
67
72
|
return accuracy(gold_tokens, test_tokens)
|
|
68
73
|
|
|
69
74
|
def _check_params(self, train, model):
|
|
70
75
|
if (train and model) or (not train and not model):
|
|
71
|
-
raise ValueError(
|
|
76
|
+
raise ValueError(
|
|
77
|
+
'Must specify either training data or trained model.')
|
|
78
|
+
|
|
72
79
|
|
|
73
80
|
class FeaturesetTaggerI(TaggerI):
|
|
74
81
|
"""
|
|
@@ -77,5 +84,3 @@ class FeaturesetTaggerI(TaggerI):
|
|
|
77
84
|
values. See ``nltk.classify`` for more information about features
|
|
78
85
|
and featuresets.
|
|
79
86
|
"""
|
|
80
|
-
|
|
81
|
-
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
# Natural Language Toolkit: Transformation-based learning
|
|
3
3
|
#
|
|
4
|
-
# Copyright (C) 2001-
|
|
4
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
5
5
|
# Author: Marcus Uneson <marcus.uneson@gmail.com>
|
|
6
6
|
# based on previous (nltk2) version by
|
|
7
7
|
# Christopher Maloof, Edward Loper, Steven Bird
|
|
@@ -10,9 +10,8 @@
|
|
|
10
10
|
|
|
11
11
|
from __future__ import print_function, division
|
|
12
12
|
|
|
13
|
-
from collections import defaultdict
|
|
13
|
+
from collections import defaultdict, Counter
|
|
14
14
|
|
|
15
|
-
from nltk.compat import Counter
|
|
16
15
|
from nltk.tag import TaggerI
|
|
17
16
|
from nltk.tbl import Feature, Template
|
|
18
17
|
from nltk import jsontags
|
|
@@ -376,8 +375,9 @@ class BrillTagger(TaggerI):
|
|
|
376
375
|
usedtpls = set([int(tid) for tid in tids])
|
|
377
376
|
unused = [(tid, tpl) for (tid, tpl) in enumerate(Template.ALLTEMPLATES) if tid not in usedtpls]
|
|
378
377
|
print("UNUSED TEMPLATES ({0})".format(len(unused)))
|
|
378
|
+
|
|
379
379
|
for (tid, tpl) in unused:
|
|
380
|
-
print("{0:03d} {1:s}".format(tid, tpl))
|
|
380
|
+
print("{0:03d} {1:s}".format(tid, str(tpl)))
|
|
381
381
|
|
|
382
382
|
if test_stats is None:
|
|
383
383
|
print_train_stats()
|
|
@@ -422,5 +422,3 @@ class BrillTagger(TaggerI):
|
|
|
422
422
|
testing_stats['finalerrors'] = errors[-1]
|
|
423
423
|
testing_stats['finalacc'] = 1 - testing_stats['finalerrors']/testing_stats['tokencount']
|
|
424
424
|
return (tagged_tokenses, testing_stats)
|
|
425
|
-
|
|
426
|
-
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
# Natural Language Toolkit: Interface to the CRFSuite Tagger
|
|
3
3
|
#
|
|
4
|
-
# Copyright (C) 2001-
|
|
4
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
5
5
|
# Author: Long Duong <longdt219@gmail.com>
|
|
6
6
|
# URL: <http://nltk.org/>
|
|
7
7
|
# For license information, see LICENSE.TXT
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Natural Language Toolkit: Hidden Markov Model
|
|
2
2
|
#
|
|
3
|
-
# Copyright (C) 2001-
|
|
3
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
4
4
|
# Author: Trevor Cohn <tacohn@csse.unimelb.edu.au>
|
|
5
5
|
# Philip Blunsom <pcbl@csse.unimelb.edu.au>
|
|
6
6
|
# Tiago Tresoldi <tiago@tresoldi.pro.br> (fixes)
|
|
@@ -73,6 +73,8 @@ from __future__ import print_function, unicode_literals, division
|
|
|
73
73
|
import re
|
|
74
74
|
import itertools
|
|
75
75
|
|
|
76
|
+
from six.moves import map, zip
|
|
77
|
+
|
|
76
78
|
try:
|
|
77
79
|
import numpy as np
|
|
78
80
|
except ImportError:
|
|
@@ -85,7 +87,7 @@ from nltk.probability import (FreqDist, ConditionalFreqDist,
|
|
|
85
87
|
MLEProbDist, RandomProbDist)
|
|
86
88
|
from nltk.metrics import accuracy
|
|
87
89
|
from nltk.util import LazyMap, unique_list
|
|
88
|
-
from nltk.compat import python_2_unicode_compatible
|
|
90
|
+
from nltk.compat import python_2_unicode_compatible
|
|
89
91
|
from nltk.tag.api import TaggerI
|
|
90
92
|
|
|
91
93
|
|
|
@@ -269,7 +271,7 @@ class HiddenMarkovModelTagger(TaggerI):
|
|
|
269
271
|
|
|
270
272
|
def _tag(self, unlabeled_sequence):
|
|
271
273
|
path = self._best_path(unlabeled_sequence)
|
|
272
|
-
return list(
|
|
274
|
+
return list(zip(unlabeled_sequence, path))
|
|
273
275
|
|
|
274
276
|
def _output_logprob(self, state, symbol):
|
|
275
277
|
"""
|
|
@@ -778,10 +780,10 @@ class HiddenMarkovModelTagger(TaggerI):
|
|
|
778
780
|
return list(itertools.chain(*seq))
|
|
779
781
|
|
|
780
782
|
test_sequence = self._transform(test_sequence)
|
|
781
|
-
predicted_sequence = list(
|
|
783
|
+
predicted_sequence = list(map(self._tag, map(words, test_sequence)))
|
|
782
784
|
|
|
783
785
|
if verbose:
|
|
784
|
-
for test_sent, predicted_sent in
|
|
786
|
+
for test_sent, predicted_sent in zip(test_sequence, predicted_sequence):
|
|
785
787
|
print('Test:',
|
|
786
788
|
' '.join('%s/%s' % (token, tag)
|
|
787
789
|
for (token, tag) in test_sent))
|
|
@@ -799,8 +801,8 @@ class HiddenMarkovModelTagger(TaggerI):
|
|
|
799
801
|
print()
|
|
800
802
|
print('-' * 60)
|
|
801
803
|
|
|
802
|
-
test_tags = flatten(
|
|
803
|
-
predicted_tags = flatten(
|
|
804
|
+
test_tags = flatten(map(tags, test_sequence))
|
|
805
|
+
predicted_tags = flatten(map(tags, predicted_sequence))
|
|
804
806
|
|
|
805
807
|
acc = accuracy(test_tags, predicted_tags)
|
|
806
808
|
count = sum(len(sent) for sent in test_sequence)
|
|
@@ -840,9 +842,11 @@ class HiddenMarkovModelTrainer(object):
|
|
|
840
842
|
:rtype: HiddenMarkovModelTagger
|
|
841
843
|
:param labelled_sequences: the supervised training data, a set of
|
|
842
844
|
labelled sequences of observations
|
|
845
|
+
ex: [ (word_1, tag_1),...,(word_n,tag_n) ]
|
|
843
846
|
:type labelled_sequences: list
|
|
844
847
|
:param unlabeled_sequences: the unsupervised training data, a set of
|
|
845
848
|
sequences of observations
|
|
849
|
+
ex: [ word_1, ..., word_n ]
|
|
846
850
|
:type unlabeled_sequences: list
|
|
847
851
|
:param kwargs: additional arguments to pass to the training methods
|
|
848
852
|
"""
|
|
@@ -1271,7 +1275,3 @@ def demo_bw():
|
|
|
1271
1275
|
trainer = HiddenMarkovModelTrainer(states, symbols)
|
|
1272
1276
|
hmm = trainer.train_unsupervised(training, model=model,
|
|
1273
1277
|
max_iterations=1000)
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
# Natural Language Toolkit: Interface to the HunPos POS-tagger
|
|
3
3
|
#
|
|
4
|
-
# Copyright (C) 2001-
|
|
4
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
5
5
|
# Author: Peter Ljunglöf <peter.ljunglof@heatherleaf.se>
|
|
6
6
|
# Dávid Márk Nemeskey <nemeskeyd@gmail.com> (modifications)
|
|
7
7
|
# Attila Zséder <zseder@gmail.com> (modifications)
|
|
@@ -15,9 +15,10 @@ A module for interfacing with the HunPos open-source POS-tagger.
|
|
|
15
15
|
import os
|
|
16
16
|
from subprocess import Popen, PIPE
|
|
17
17
|
|
|
18
|
+
from six import text_type
|
|
19
|
+
|
|
18
20
|
from nltk.internals import find_binary, find_file
|
|
19
21
|
from nltk.tag.api import TaggerI
|
|
20
|
-
from nltk import compat
|
|
21
22
|
|
|
22
23
|
_hunpos_url = 'http://code.google.com/p/hunpos/'
|
|
23
24
|
|
|
@@ -105,7 +106,7 @@ class HunposTagger(TaggerI):
|
|
|
105
106
|
"""
|
|
106
107
|
for token in tokens:
|
|
107
108
|
assert "\n" not in token, "Tokens should not contain newlines"
|
|
108
|
-
if isinstance(token,
|
|
109
|
+
if isinstance(token, text_type):
|
|
109
110
|
token = token.encode(self._encoding)
|
|
110
111
|
self._hunpos.stdin.write(token + b"\n")
|
|
111
112
|
# We write a final empty line to tell hunpos that the sentence is finished:
|
|
@@ -129,4 +130,3 @@ def setup_module(module):
|
|
|
129
130
|
HunposTagger('en_wsj.model')
|
|
130
131
|
except LookupError:
|
|
131
132
|
raise SkipTest("HunposTagger is not available")
|
|
132
|
-
|
|
@@ -28,7 +28,7 @@ class AveragedPerceptron(object):
|
|
|
28
28
|
'''An averaged perceptron, as implemented by Matthew Honnibal.
|
|
29
29
|
|
|
30
30
|
See more implementation details here:
|
|
31
|
-
|
|
31
|
+
https://explosion.ai/blog/part-of-speech-pos-tagger-in-python
|
|
32
32
|
'''
|
|
33
33
|
|
|
34
34
|
def __init__(self):
|
|
@@ -101,7 +101,7 @@ class PerceptronTagger(TaggerI):
|
|
|
101
101
|
'''
|
|
102
102
|
Greedy Averaged Perceptron tagger, as implemented by Matthew Honnibal.
|
|
103
103
|
See more implementation details here:
|
|
104
|
-
|
|
104
|
+
https://explosion.ai/blog/part-of-speech-pos-tagger-in-python
|
|
105
105
|
|
|
106
106
|
>>> from nltk.tag.perceptron import PerceptronTagger
|
|
107
107
|
|
|
@@ -165,18 +165,26 @@ class PerceptronTagger(TaggerI):
|
|
|
165
165
|
'''Train a model from sentences, and save it at ``save_loc``. ``nr_iter``
|
|
166
166
|
controls the number of Perceptron training iterations.
|
|
167
167
|
|
|
168
|
-
:param sentences: A list of
|
|
168
|
+
:param sentences: A list or iterator of sentences, where each sentence
|
|
169
|
+
is a list of (words, tags) tuples.
|
|
169
170
|
:param save_loc: If not ``None``, saves a pickled model in this location.
|
|
170
171
|
:param nr_iter: Number of training iterations.
|
|
171
172
|
'''
|
|
173
|
+
# We'd like to allow ``sentences`` to be either a list or an iterator,
|
|
174
|
+
# the latter being especially important for a large training dataset.
|
|
175
|
+
# Because ``self._make_tagdict(sentences)`` runs regardless, we make
|
|
176
|
+
# it populate ``self._sentences`` (a list) with all the sentences.
|
|
177
|
+
# This saves the overheard of just iterating through ``sentences`` to
|
|
178
|
+
# get the list by ``sentences = list(sentences)``.
|
|
179
|
+
|
|
180
|
+
self._sentences = list() # to be populated by self._make_tagdict...
|
|
172
181
|
self._make_tagdict(sentences)
|
|
173
182
|
self.model.classes = self.classes
|
|
174
183
|
for iter_ in range(nr_iter):
|
|
175
184
|
c = 0
|
|
176
185
|
n = 0
|
|
177
|
-
for sentence
|
|
178
|
-
words =
|
|
179
|
-
tags = [tag for word,tag in sentence]
|
|
186
|
+
for sentence in self._sentences:
|
|
187
|
+
words, tags = zip(*sentence)
|
|
180
188
|
|
|
181
189
|
prev, prev2 = self.START
|
|
182
190
|
context = self.START + [self.normalize(w) for w in words] \
|
|
@@ -191,13 +199,19 @@ class PerceptronTagger(TaggerI):
|
|
|
191
199
|
prev = guess
|
|
192
200
|
c += guess == tags[i]
|
|
193
201
|
n += 1
|
|
194
|
-
random.shuffle(
|
|
202
|
+
random.shuffle(self._sentences)
|
|
195
203
|
logging.info("Iter {0}: {1}/{2}={3}".format(iter_, c, n, _pc(c, n)))
|
|
204
|
+
|
|
205
|
+
# We don't need the training sentences anymore, and we don't want to
|
|
206
|
+
# waste space on them when we pickle the trained tagger.
|
|
207
|
+
self._sentences = None
|
|
208
|
+
|
|
196
209
|
self.model.average_weights()
|
|
197
210
|
# Pickle as a binary file
|
|
198
211
|
if save_loc is not None:
|
|
199
212
|
with open(save_loc, 'wb') as fout:
|
|
200
|
-
|
|
213
|
+
# changed protocol from -1 to 2 to make pickling Python 2 compatible
|
|
214
|
+
pickle.dump((self.model.weights, self.tagdict, self.classes), fout, 2)
|
|
201
215
|
|
|
202
216
|
|
|
203
217
|
def load(self, loc):
|
|
@@ -214,7 +228,7 @@ class PerceptronTagger(TaggerI):
|
|
|
214
228
|
'''
|
|
215
229
|
Normalization used in pre-processing.
|
|
216
230
|
- All words are lower cased
|
|
217
|
-
-
|
|
231
|
+
- Groups of digits of length 4 are represented as !YEAR;
|
|
218
232
|
- Other digits are represented as !DIGITS
|
|
219
233
|
|
|
220
234
|
:rtype: str
|
|
@@ -230,7 +244,7 @@ class PerceptronTagger(TaggerI):
|
|
|
230
244
|
|
|
231
245
|
def _get_features(self, i, word, context, prev, prev2):
|
|
232
246
|
'''Map tokens into a feature representation, implemented as a
|
|
233
|
-
{hashable:
|
|
247
|
+
{hashable: int} dict. If the features change, a new model must be
|
|
234
248
|
trained.
|
|
235
249
|
'''
|
|
236
250
|
def add(name, *args):
|
|
@@ -262,6 +276,7 @@ class PerceptronTagger(TaggerI):
|
|
|
262
276
|
'''
|
|
263
277
|
counts = defaultdict(lambda: defaultdict(int))
|
|
264
278
|
for sentence in sentences:
|
|
279
|
+
self._sentences.append(sentence)
|
|
265
280
|
for word, tag in sentence:
|
|
266
281
|
counts[word][tag] += 1
|
|
267
282
|
self.classes.add(tag)
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# encoding: utf-8
|
|
2
2
|
# Natural Language Toolkit: Senna POS Tagger
|
|
3
3
|
#
|
|
4
|
-
# Copyright (C) 2001-
|
|
4
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
5
5
|
# Author: Rami Al-Rfou' <ralrfou@cs.stonybrook.edu>
|
|
6
6
|
# URL: <http://nltk.org/>
|
|
7
7
|
# For license information, see LICENSE.TXT
|
|
@@ -10,29 +10,31 @@
|
|
|
10
10
|
Senna POS tagger, NER Tagger, Chunk Tagger
|
|
11
11
|
|
|
12
12
|
The input is:
|
|
13
|
-
- path to the directory that contains SENNA executables. If the path is incorrect,
|
|
14
|
-
SennaTagger will automatically search for executable file specified in SENNA environment variable
|
|
13
|
+
- path to the directory that contains SENNA executables. If the path is incorrect,
|
|
14
|
+
SennaTagger will automatically search for executable file specified in SENNA environment variable
|
|
15
15
|
- (optionally) the encoding of the input data (default:utf-8)
|
|
16
16
|
|
|
17
|
+
Note: Unit tests for this module can be found in test/unit/test_senna.py
|
|
18
|
+
|
|
17
19
|
>>> from nltk.tag import SennaTagger
|
|
18
|
-
>>> tagger = SennaTagger('/usr/share/senna-
|
|
19
|
-
>>> tagger.tag('What is the airspeed of an unladen swallow ?'.split())
|
|
20
|
+
>>> tagger = SennaTagger('/usr/share/senna-v3.0')
|
|
21
|
+
>>> tagger.tag('What is the airspeed of an unladen swallow ?'.split()) # doctest: +SKIP
|
|
20
22
|
[('What', 'WP'), ('is', 'VBZ'), ('the', 'DT'), ('airspeed', 'NN'),
|
|
21
23
|
('of', 'IN'), ('an', 'DT'), ('unladen', 'NN'), ('swallow', 'NN'), ('?', '.')]
|
|
22
24
|
|
|
23
25
|
>>> from nltk.tag import SennaChunkTagger
|
|
24
|
-
>>> chktagger = SennaChunkTagger('/usr/share/senna-
|
|
25
|
-
>>> chktagger.tag('What is the airspeed of an unladen swallow ?'.split())
|
|
26
|
+
>>> chktagger = SennaChunkTagger('/usr/share/senna-v3.0')
|
|
27
|
+
>>> chktagger.tag('What is the airspeed of an unladen swallow ?'.split()) # doctest: +SKIP
|
|
26
28
|
[('What', 'B-NP'), ('is', 'B-VP'), ('the', 'B-NP'), ('airspeed', 'I-NP'),
|
|
27
29
|
('of', 'B-PP'), ('an', 'B-NP'), ('unladen', 'I-NP'), ('swallow', 'I-NP'),
|
|
28
30
|
('?', 'O')]
|
|
29
31
|
|
|
30
32
|
>>> from nltk.tag import SennaNERTagger
|
|
31
|
-
>>> nertagger = SennaNERTagger('/usr/share/senna-
|
|
32
|
-
>>> nertagger.tag('Shakespeare theatre was in London .'.split())
|
|
33
|
+
>>> nertagger = SennaNERTagger('/usr/share/senna-v3.0')
|
|
34
|
+
>>> nertagger.tag('Shakespeare theatre was in London .'.split()) # doctest: +SKIP
|
|
33
35
|
[('Shakespeare', 'B-PER'), ('theatre', 'O'), ('was', 'O'), ('in', 'O'),
|
|
34
36
|
('London', 'B-LOC'), ('.', 'O')]
|
|
35
|
-
>>> nertagger.tag('UN headquarters are in NY , USA .'.split())
|
|
37
|
+
>>> nertagger.tag('UN headquarters are in NY , USA .'.split()) # doctest: +SKIP
|
|
36
38
|
[('UN', 'B-ORG'), ('headquarters', 'O'), ('are', 'O'), ('in', 'O'),
|
|
37
39
|
('NY', 'B-LOC'), (',', 'O'), ('USA', 'B-LOC'), ('.', 'O')]
|
|
38
40
|
"""
|
|
@@ -73,29 +75,29 @@ class SennaChunkTagger(Senna):
|
|
|
73
75
|
annotations = tagged_sents[i][j]
|
|
74
76
|
tagged_sents[i][j] = (annotations['word'], annotations['chk'])
|
|
75
77
|
return tagged_sents
|
|
76
|
-
|
|
78
|
+
|
|
77
79
|
def bio_to_chunks(self, tagged_sent, chunk_type):
|
|
78
80
|
"""
|
|
79
81
|
Extracts the chunks in a BIO chunk-tagged sentence.
|
|
80
|
-
|
|
82
|
+
|
|
81
83
|
>>> from nltk.tag import SennaChunkTagger
|
|
82
|
-
>>> chktagger = SennaChunkTagger('/usr/share/senna-
|
|
84
|
+
>>> chktagger = SennaChunkTagger('/usr/share/senna-v3.0')
|
|
83
85
|
>>> sent = 'What is the airspeed of an unladen swallow ?'.split()
|
|
84
|
-
>>> tagged_sent = chktagger.tag(sent)
|
|
85
|
-
>>> tagged_sent
|
|
86
|
+
>>> tagged_sent = chktagger.tag(sent) # doctest: +SKIP
|
|
87
|
+
>>> tagged_sent # doctest: +SKIP
|
|
86
88
|
[('What', 'B-NP'), ('is', 'B-VP'), ('the', 'B-NP'), ('airspeed', 'I-NP'),
|
|
87
89
|
('of', 'B-PP'), ('an', 'B-NP'), ('unladen', 'I-NP'), ('swallow', 'I-NP'),
|
|
88
90
|
('?', 'O')]
|
|
89
|
-
>>> list(chktagger.bio_to_chunks(tagged_sent, chunk_type='NP'))
|
|
91
|
+
>>> list(chktagger.bio_to_chunks(tagged_sent, chunk_type='NP')) # doctest: +SKIP
|
|
90
92
|
[('What', '0'), ('the airspeed', '2-3'), ('an unladen swallow', '5-6-7')]
|
|
91
|
-
|
|
93
|
+
|
|
92
94
|
:param tagged_sent: A list of tuples of word and BIO chunk tag.
|
|
93
95
|
:type tagged_sent: list(tuple)
|
|
94
96
|
:param tagged_sent: The chunk tag that users want to extract, e.g. 'NP' or 'VP'
|
|
95
97
|
:type tagged_sent: str
|
|
96
|
-
|
|
98
|
+
|
|
97
99
|
:return: An iterable of tuples of chunks that users want to extract
|
|
98
|
-
and their corresponding indices.
|
|
100
|
+
and their corresponding indices.
|
|
99
101
|
:rtype: iter(tuple(str))
|
|
100
102
|
"""
|
|
101
103
|
current_chunk = []
|
|
@@ -107,14 +109,14 @@ class SennaChunkTagger(Senna):
|
|
|
107
109
|
current_chunk_position.append((idx))
|
|
108
110
|
else:
|
|
109
111
|
if current_chunk: # Flush the full chunk when out of an NP.
|
|
110
|
-
_chunk_str = ' '.join(current_chunk)
|
|
112
|
+
_chunk_str = ' '.join(current_chunk)
|
|
111
113
|
_chunk_pos_str = '-'.join(map(str, current_chunk_position))
|
|
112
|
-
yield _chunk_str, _chunk_pos_str
|
|
114
|
+
yield _chunk_str, _chunk_pos_str
|
|
113
115
|
current_chunk = []
|
|
114
116
|
current_chunk_position = []
|
|
115
117
|
if current_chunk: # Flush the last chunk.
|
|
116
118
|
yield ' '.join(current_chunk), '-'.join(map(str, current_chunk_position))
|
|
117
|
-
|
|
119
|
+
|
|
118
120
|
|
|
119
121
|
@python_2_unicode_compatible
|
|
120
122
|
class SennaNERTagger(Senna):
|
|
@@ -139,7 +141,7 @@ class SennaNERTagger(Senna):
|
|
|
139
141
|
def setup_module(module):
|
|
140
142
|
from nose import SkipTest
|
|
141
143
|
try:
|
|
142
|
-
tagger = Senna('/usr/share/senna-
|
|
144
|
+
tagger = Senna('/usr/share/senna-v3.0', ['pos', 'chk', 'ner'])
|
|
143
145
|
except OSError:
|
|
144
146
|
raise SkipTest("Senna executable not found")
|
|
145
147
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Natural Language Toolkit: Sequential Backoff Taggers
|
|
2
2
|
#
|
|
3
|
-
# Copyright (C) 2001-
|
|
3
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
4
4
|
# Author: Edward Loper <edloper@gmail.com>
|
|
5
5
|
# Steven Bird <stevenbird1@gmail.com> (minor additions)
|
|
6
6
|
# Tiago Tresoldi <tresoldi@users.sf.net> (original affix tagger)
|
|
@@ -18,6 +18,7 @@ consulted instead. Any SequentialBackoffTagger may serve as a
|
|
|
18
18
|
backoff tagger for any other SequentialBackoffTagger.
|
|
19
19
|
"""
|
|
20
20
|
from __future__ import print_function, unicode_literals
|
|
21
|
+
from abc import abstractmethod
|
|
21
22
|
|
|
22
23
|
import re
|
|
23
24
|
|
|
@@ -29,8 +30,9 @@ from nltk.tag.api import TaggerI, FeaturesetTaggerI
|
|
|
29
30
|
|
|
30
31
|
from nltk import jsontags
|
|
31
32
|
|
|
33
|
+
|
|
32
34
|
######################################################################
|
|
33
|
-
#
|
|
35
|
+
# Abstract Base Classes
|
|
34
36
|
######################################################################
|
|
35
37
|
class SequentialBackoffTagger(TaggerI):
|
|
36
38
|
"""
|
|
@@ -79,9 +81,11 @@ class SequentialBackoffTagger(TaggerI):
|
|
|
79
81
|
tag = None
|
|
80
82
|
for tagger in self._taggers:
|
|
81
83
|
tag = tagger.choose_tag(tokens, index, history)
|
|
82
|
-
if tag is not None:
|
|
84
|
+
if tag is not None:
|
|
85
|
+
break
|
|
83
86
|
return tag
|
|
84
87
|
|
|
88
|
+
@abstractmethod
|
|
85
89
|
def choose_tag(self, tokens, index, history):
|
|
86
90
|
"""
|
|
87
91
|
Decide which tag should be used for the specified token, and
|
|
@@ -99,7 +103,6 @@ class SequentialBackoffTagger(TaggerI):
|
|
|
99
103
|
:type history: list(str)
|
|
100
104
|
:param history: A list of the tags for all words before *index*.
|
|
101
105
|
"""
|
|
102
|
-
raise NotImplementedError()
|
|
103
106
|
|
|
104
107
|
|
|
105
108
|
@python_2_unicode_compatible
|
|
@@ -125,6 +128,7 @@ class ContextTagger(SequentialBackoffTagger):
|
|
|
125
128
|
SequentialBackoffTagger.__init__(self, backoff)
|
|
126
129
|
self._context_to_tag = (context_to_tag if context_to_tag else {})
|
|
127
130
|
|
|
131
|
+
@abstractmethod
|
|
128
132
|
def context(self, tokens, index, history):
|
|
129
133
|
"""
|
|
130
134
|
:return: the context that should be used to look up the tag
|
|
@@ -132,7 +136,6 @@ class ContextTagger(SequentialBackoffTagger):
|
|
|
132
136
|
should not be handled by this tagger.
|
|
133
137
|
:rtype: (hashable)
|
|
134
138
|
"""
|
|
135
|
-
raise NotImplementedError()
|
|
136
139
|
|
|
137
140
|
def choose_tag(self, tokens, index, history):
|
|
138
141
|
context = self.context(tokens, index, history)
|
|
@@ -180,11 +183,13 @@ class ContextTagger(SequentialBackoffTagger):
|
|
|
180
183
|
# Record the event.
|
|
181
184
|
token_count += 1
|
|
182
185
|
context = self.context(tokens, index, tags[:index])
|
|
183
|
-
if context is None:
|
|
186
|
+
if context is None:
|
|
187
|
+
continue
|
|
184
188
|
fd[context][tag] += 1
|
|
185
189
|
# If the backoff got it wrong, this context is useful:
|
|
186
190
|
if (self.backoff is None or
|
|
187
|
-
|
|
191
|
+
tag != self.backoff.tag_one(
|
|
192
|
+
tokens, index, tags[:index])):
|
|
188
193
|
useful_contexts.add(context)
|
|
189
194
|
|
|
190
195
|
# Build the context_to_tag table -- for each context, figure
|
|
@@ -200,16 +205,16 @@ class ContextTagger(SequentialBackoffTagger):
|
|
|
200
205
|
# Display some stats, if requested.
|
|
201
206
|
if verbose:
|
|
202
207
|
size = len(self._context_to_tag)
|
|
203
|
-
backoff = 100 - (hit_count * 100.0)/ token_count
|
|
208
|
+
backoff = 100 - (hit_count * 100.0) / token_count
|
|
204
209
|
pruning = 100 - (size * 100.0) / len(fd.conditions())
|
|
205
210
|
print("[Trained Unigram tagger:", end=' ')
|
|
206
211
|
print("size=%d, backoff=%.2f%%, pruning=%.2f%%]" % (
|
|
207
212
|
size, backoff, pruning))
|
|
208
213
|
|
|
214
|
+
|
|
209
215
|
######################################################################
|
|
210
|
-
#
|
|
216
|
+
# Tagger Classes
|
|
211
217
|
######################################################################
|
|
212
|
-
|
|
213
218
|
@python_2_unicode_compatible
|
|
214
219
|
@jsontags.register_tag
|
|
215
220
|
class DefaultTagger(SequentialBackoffTagger):
|
|
@@ -295,7 +300,7 @@ class NgramTagger(ContextTagger):
|
|
|
295
300
|
return cls(_n, model=_context_to_tag, backoff=backoff)
|
|
296
301
|
|
|
297
302
|
def context(self, tokens, index, history):
|
|
298
|
-
tag_context = tuple(history[max(0,index-self._n+1):index])
|
|
303
|
+
tag_context = tuple(history[max(0, index-self._n+1):index])
|
|
299
304
|
return tag_context, tokens[index]
|
|
300
305
|
|
|
301
306
|
|
|
@@ -651,8 +656,8 @@ class ClassifierBasedTagger(SequentialBackoffTagger, FeaturesetTaggerI):
|
|
|
651
656
|
untagged_sentence, tags = zip(*sentence)
|
|
652
657
|
for index in range(len(sentence)):
|
|
653
658
|
featureset = self.feature_detector(untagged_sentence,
|
|
654
|
-
|
|
655
|
-
classifier_corpus.append(
|
|
659
|
+
index, history)
|
|
660
|
+
classifier_corpus.append((featureset, tags[index]))
|
|
656
661
|
history.append(tags[index])
|
|
657
662
|
|
|
658
663
|
if verbose:
|
|
@@ -683,6 +688,7 @@ class ClassifierBasedTagger(SequentialBackoffTagger, FeaturesetTaggerI):
|
|
|
683
688
|
"""
|
|
684
689
|
return self._classifier
|
|
685
690
|
|
|
691
|
+
|
|
686
692
|
class ClassifierBasedPOSTagger(ClassifierBasedTagger):
|
|
687
693
|
"""
|
|
688
694
|
A classifier based part of speech tagger.
|
|
@@ -732,5 +738,3 @@ class ClassifierBasedPOSTagger(ClassifierBasedTagger):
|
|
|
732
738
|
'shape': shape,
|
|
733
739
|
}
|
|
734
740
|
return features
|
|
735
|
-
|
|
736
|
-
|