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
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
# Natural Language Toolkit: Tokenizers
|
|
2
|
+
#
|
|
3
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
4
|
+
# Author: Edward Loper <edloper@gmail.com>
|
|
5
|
+
# Michael Heilman <mheilman@cmu.edu> (re-port from http://www.cis.upenn.edu/~treebank/tokenizer.sed)
|
|
6
|
+
#
|
|
7
|
+
# URL: <http://nltk.sourceforge.net>
|
|
8
|
+
# For license information, see LICENSE.TXT
|
|
9
|
+
|
|
10
|
+
r"""
|
|
11
|
+
|
|
12
|
+
Penn Treebank Tokenizer
|
|
13
|
+
|
|
14
|
+
The Treebank tokenizer uses regular expressions to tokenize text as in Penn Treebank.
|
|
15
|
+
This implementation is a port of the tokenizer sed script written by Robert McIntyre
|
|
16
|
+
and available at http://www.cis.upenn.edu/~treebank/tokenizer.sed.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
import re
|
|
20
|
+
from nltk.tokenize.api import TokenizerI
|
|
21
|
+
from nltk.tokenize.util import align_tokens
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class MacIntyreContractions:
|
|
25
|
+
"""
|
|
26
|
+
List of contractions adapted from Robert MacIntyre's tokenizer.
|
|
27
|
+
"""
|
|
28
|
+
CONTRACTIONS2 = [r"(?i)\b(can)(?#X)(not)\b",
|
|
29
|
+
r"(?i)\b(d)(?#X)('ye)\b",
|
|
30
|
+
r"(?i)\b(gim)(?#X)(me)\b",
|
|
31
|
+
r"(?i)\b(gon)(?#X)(na)\b",
|
|
32
|
+
r"(?i)\b(got)(?#X)(ta)\b",
|
|
33
|
+
r"(?i)\b(lem)(?#X)(me)\b",
|
|
34
|
+
r"(?i)\b(mor)(?#X)('n)\b",
|
|
35
|
+
r"(?i)\b(wan)(?#X)(na)\s"]
|
|
36
|
+
CONTRACTIONS3 = [r"(?i) ('t)(?#X)(is)\b", r"(?i) ('t)(?#X)(was)\b"]
|
|
37
|
+
CONTRACTIONS4 = [r"(?i)\b(whad)(dd)(ya)\b",
|
|
38
|
+
r"(?i)\b(wha)(t)(cha)\b"]
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class TreebankWordTokenizer(TokenizerI):
|
|
42
|
+
"""
|
|
43
|
+
The Treebank tokenizer uses regular expressions to tokenize text as in Penn Treebank.
|
|
44
|
+
This is the method that is invoked by ``word_tokenize()``. It assumes that the
|
|
45
|
+
text has already been segmented into sentences, e.g. using ``sent_tokenize()``.
|
|
46
|
+
|
|
47
|
+
This tokenizer performs the following steps:
|
|
48
|
+
|
|
49
|
+
- split standard contractions, e.g. ``don't`` -> ``do n't`` and ``they'll`` -> ``they 'll``
|
|
50
|
+
- treat most punctuation characters as separate tokens
|
|
51
|
+
- split off commas and single quotes, when followed by whitespace
|
|
52
|
+
- separate periods that appear at the end of line
|
|
53
|
+
|
|
54
|
+
>>> from nltk.tokenize import TreebankWordTokenizer
|
|
55
|
+
>>> s = '''Good muffins cost $3.88\\nin New York. Please buy me\\ntwo of them.\\nThanks.'''
|
|
56
|
+
>>> TreebankWordTokenizer().tokenize(s)
|
|
57
|
+
['Good', 'muffins', 'cost', '$', '3.88', 'in', 'New', 'York.', 'Please', 'buy', 'me', 'two', 'of', 'them.', 'Thanks', '.']
|
|
58
|
+
>>> s = "They'll save and invest more."
|
|
59
|
+
>>> TreebankWordTokenizer().tokenize(s)
|
|
60
|
+
['They', "'ll", 'save', 'and', 'invest', 'more', '.']
|
|
61
|
+
>>> s = "hi, my name can't hello,"
|
|
62
|
+
>>> TreebankWordTokenizer().tokenize(s)
|
|
63
|
+
['hi', ',', 'my', 'name', 'ca', "n't", 'hello', ',']
|
|
64
|
+
"""
|
|
65
|
+
|
|
66
|
+
# starting quotes
|
|
67
|
+
STARTING_QUOTES = [
|
|
68
|
+
(re.compile(r'^\"'), r'``'),
|
|
69
|
+
(re.compile(r'(``)'), r' \1 '),
|
|
70
|
+
(re.compile(r"([ \(\[{<])(\"|\'{2})"), r'\1 `` '),
|
|
71
|
+
]
|
|
72
|
+
|
|
73
|
+
# punctuation
|
|
74
|
+
PUNCTUATION = [
|
|
75
|
+
(re.compile(r'([:,])([^\d])'), r' \1 \2'),
|
|
76
|
+
(re.compile(r'([:,])$'), r' \1 '),
|
|
77
|
+
(re.compile(r'\.\.\.'), r' ... '),
|
|
78
|
+
(re.compile(r'[;@#$%&]'), r' \g<0> '),
|
|
79
|
+
(re.compile(r'([^\.])(\.)([\]\)}>"\']*)\s*$'), r'\1 \2\3 '), # Handles the final period.
|
|
80
|
+
(re.compile(r'[?!]'), r' \g<0> '),
|
|
81
|
+
|
|
82
|
+
(re.compile(r"([^'])' "), r"\1 ' "),
|
|
83
|
+
]
|
|
84
|
+
|
|
85
|
+
# Pads parentheses
|
|
86
|
+
PARENS_BRACKETS = (re.compile(r'[\]\[\(\)\{\}\<\>]'), r' \g<0> ')
|
|
87
|
+
|
|
88
|
+
# Optionally: Convert parentheses, brackets and converts them to PTB symbols.
|
|
89
|
+
CONVERT_PARENTHESES = [
|
|
90
|
+
(re.compile(r'\('), '-LRB-'), (re.compile(r'\)'), '-RRB-'),
|
|
91
|
+
(re.compile(r'\['), '-LSB-'), (re.compile(r'\]'), '-RSB-'),
|
|
92
|
+
(re.compile(r'\{'), '-LCB-'), (re.compile(r'\}'), '-RCB-')
|
|
93
|
+
]
|
|
94
|
+
|
|
95
|
+
DOUBLE_DASHES = (re.compile(r'--'), r' -- ')
|
|
96
|
+
|
|
97
|
+
# ending quotes
|
|
98
|
+
ENDING_QUOTES = [
|
|
99
|
+
(re.compile(r'"'), " '' "),
|
|
100
|
+
(re.compile(r'(\S)(\'\')'), r'\1 \2 '),
|
|
101
|
+
(re.compile(r"([^' ])('[sS]|'[mM]|'[dD]|') "), r"\1 \2 "),
|
|
102
|
+
(re.compile(r"([^' ])('ll|'LL|'re|'RE|'ve|'VE|n't|N'T) "), r"\1 \2 "),
|
|
103
|
+
]
|
|
104
|
+
|
|
105
|
+
# List of contractions adapted from Robert MacIntyre's tokenizer.
|
|
106
|
+
_contractions = MacIntyreContractions()
|
|
107
|
+
CONTRACTIONS2 = list(map(re.compile, _contractions.CONTRACTIONS2))
|
|
108
|
+
CONTRACTIONS3 = list(map(re.compile, _contractions.CONTRACTIONS3))
|
|
109
|
+
|
|
110
|
+
def tokenize(self, text, convert_parentheses=False, return_str=False):
|
|
111
|
+
for regexp, substitution in self.STARTING_QUOTES:
|
|
112
|
+
text = regexp.sub(substitution, text)
|
|
113
|
+
|
|
114
|
+
for regexp, substitution in self.PUNCTUATION:
|
|
115
|
+
text = regexp.sub(substitution, text)
|
|
116
|
+
|
|
117
|
+
# Handles parentheses.
|
|
118
|
+
regexp, substitution = self.PARENS_BRACKETS
|
|
119
|
+
text = regexp.sub(substitution, text)
|
|
120
|
+
# Optionally convert parentheses
|
|
121
|
+
if convert_parentheses:
|
|
122
|
+
for regexp, substitution in self.CONVERT_PARENTHESES:
|
|
123
|
+
text = regexp.sub(substitution, text)
|
|
124
|
+
|
|
125
|
+
# Handles double dash.
|
|
126
|
+
regexp, substitution = self.DOUBLE_DASHES
|
|
127
|
+
text = regexp.sub(substitution, text)
|
|
128
|
+
|
|
129
|
+
# add extra space to make things easier
|
|
130
|
+
text = " " + text + " "
|
|
131
|
+
|
|
132
|
+
for regexp, substitution in self.ENDING_QUOTES:
|
|
133
|
+
text = regexp.sub(substitution, text)
|
|
134
|
+
|
|
135
|
+
for regexp in self.CONTRACTIONS2:
|
|
136
|
+
text = regexp.sub(r' \1 \2 ', text)
|
|
137
|
+
for regexp in self.CONTRACTIONS3:
|
|
138
|
+
text = regexp.sub(r' \1 \2 ', text)
|
|
139
|
+
|
|
140
|
+
# We are not using CONTRACTIONS4 since
|
|
141
|
+
# they are also commented out in the SED scripts
|
|
142
|
+
# for regexp in self._contractions.CONTRACTIONS4:
|
|
143
|
+
# text = regexp.sub(r' \1 \2 \3 ', text)
|
|
144
|
+
|
|
145
|
+
return text if return_str else text.split()
|
|
146
|
+
|
|
147
|
+
def span_tokenize(self, text):
|
|
148
|
+
"""
|
|
149
|
+
Uses the post-hoc nltk.tokens.align_tokens to return the offset spans.
|
|
150
|
+
|
|
151
|
+
>>> from nltk.tokenize import TreebankWordTokenizer
|
|
152
|
+
>>> s = '''Good muffins cost $3.88\\nin New (York). Please (buy) me\\ntwo of them.\\n(Thanks).'''
|
|
153
|
+
>>> expected = [(0, 4), (5, 12), (13, 17), (18, 19), (19, 23),
|
|
154
|
+
... (24, 26), (27, 30), (31, 32), (32, 36), (36, 37), (37, 38),
|
|
155
|
+
... (40, 46), (47, 48), (48, 51), (51, 52), (53, 55), (56, 59),
|
|
156
|
+
... (60, 62), (63, 68), (69, 70), (70, 76), (76, 77), (77, 78)]
|
|
157
|
+
>>> list(TreebankWordTokenizer().span_tokenize(s)) == expected
|
|
158
|
+
True
|
|
159
|
+
>>> expected = ['Good', 'muffins', 'cost', '$', '3.88', 'in',
|
|
160
|
+
... 'New', '(', 'York', ')', '.', 'Please', '(', 'buy', ')',
|
|
161
|
+
... 'me', 'two', 'of', 'them.', '(', 'Thanks', ')', '.']
|
|
162
|
+
>>> [s[start:end] for start, end in TreebankWordTokenizer().span_tokenize(s)] == expected
|
|
163
|
+
True
|
|
164
|
+
|
|
165
|
+
Additional example
|
|
166
|
+
>>> from nltk.tokenize import TreebankWordTokenizer
|
|
167
|
+
>>> s = '''I said, "I'd like to buy some ''good muffins" which cost $3.88\\n each in New (York)."'''
|
|
168
|
+
>>> expected = [(0, 1), (2, 6), (6, 7), (8, 9), (9, 10), (10, 12),
|
|
169
|
+
... (13, 17), (18, 20), (21, 24), (25, 29), (30, 32), (32, 36),
|
|
170
|
+
... (37, 44), (44, 45), (46, 51), (52, 56), (57, 58), (58, 62),
|
|
171
|
+
... (64, 68), (69, 71), (72, 75), (76, 77), (77, 81), (81, 82),
|
|
172
|
+
... (82, 83), (83, 84)]
|
|
173
|
+
>>> list(TreebankWordTokenizer().span_tokenize(s)) == expected
|
|
174
|
+
True
|
|
175
|
+
>>> expected = ['I', 'said', ',', '"', 'I', "'d", 'like', 'to',
|
|
176
|
+
... 'buy', 'some', "''", "good", 'muffins', '"', 'which', 'cost',
|
|
177
|
+
... '$', '3.88', 'each', 'in', 'New', '(', 'York', ')', '.', '"']
|
|
178
|
+
>>> [s[start:end] for start, end in TreebankWordTokenizer().span_tokenize(s)] == expected
|
|
179
|
+
True
|
|
180
|
+
|
|
181
|
+
"""
|
|
182
|
+
raw_tokens = self.tokenize(text)
|
|
183
|
+
|
|
184
|
+
# Convert converted quotes back to original double quotes
|
|
185
|
+
# Do this only if original text contains double quote(s) or double
|
|
186
|
+
# single-quotes (because '' might be transformed to `` if it is
|
|
187
|
+
# treated as starting quotes).
|
|
188
|
+
if ('"' in text) or ("''" in text):
|
|
189
|
+
# Find double quotes and converted quotes
|
|
190
|
+
matched = [m.group() for m in re.finditer(r"``|'{2}|\"", text)]
|
|
191
|
+
|
|
192
|
+
# Replace converted quotes back to double quotes
|
|
193
|
+
tokens = [matched.pop(0) if tok in ['"', "``", "''"] else tok
|
|
194
|
+
for tok in raw_tokens]
|
|
195
|
+
else:
|
|
196
|
+
tokens = raw_tokens
|
|
197
|
+
|
|
198
|
+
for tok in align_tokens(tokens, text):
|
|
199
|
+
yield tok
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
class TreebankWordDetokenizer(TokenizerI):
|
|
203
|
+
"""
|
|
204
|
+
The Treebank detokenizer uses the reverse regex operations corresponding to
|
|
205
|
+
the Treebank tokenizer's regexes.
|
|
206
|
+
|
|
207
|
+
Note:
|
|
208
|
+
- There're additional assumption mades when undoing the padding of [;@#$%&]
|
|
209
|
+
punctuation symbols that isn't presupposed in the TreebankTokenizer.
|
|
210
|
+
- There're additional regexes added in reversing the parentheses tokenization,
|
|
211
|
+
- the r'([\]\)\}\>])\s([:;,.])' removes the additional right padding added
|
|
212
|
+
to the closing parentheses precedding [:;,.].
|
|
213
|
+
- It's not possible to return the original whitespaces as they were because
|
|
214
|
+
there wasn't explicit records of where '\n', '\t' or '\s' were removed at
|
|
215
|
+
the text.split() operation.
|
|
216
|
+
|
|
217
|
+
>>> from nltk.tokenize.treebank import TreebankWordTokenizer, TreebankWordDetokenizer
|
|
218
|
+
>>> s = '''Good muffins cost $3.88\\nin New York. Please buy me\\ntwo of them.\\nThanks.'''
|
|
219
|
+
>>> d = TreebankWordDetokenizer()
|
|
220
|
+
>>> t = TreebankWordTokenizer()
|
|
221
|
+
>>> toks = t.tokenize(s)
|
|
222
|
+
>>> d.detokenize(toks)
|
|
223
|
+
'Good muffins cost $3.88 in New York. Please buy me two of them. Thanks.'
|
|
224
|
+
|
|
225
|
+
The MXPOST parentheses substitution can be undone using the `convert_parentheses`
|
|
226
|
+
parameter:
|
|
227
|
+
|
|
228
|
+
>>> s = '''Good muffins cost $3.88\\nin New (York). Please (buy) me\\ntwo of them.\\n(Thanks).'''
|
|
229
|
+
>>> expected_tokens = ['Good', 'muffins', 'cost', '$', '3.88', 'in',
|
|
230
|
+
... 'New', '-LRB-', 'York', '-RRB-', '.', 'Please', '-LRB-', 'buy',
|
|
231
|
+
... '-RRB-', 'me', 'two', 'of', 'them.', '-LRB-', 'Thanks', '-RRB-', '.']
|
|
232
|
+
>>> expected_tokens == t.tokenize(s, convert_parentheses=True)
|
|
233
|
+
True
|
|
234
|
+
>>> expected_detoken = 'Good muffins cost $3.88 in New (York). Please (buy) me two of them. (Thanks).'
|
|
235
|
+
>>> expected_detoken == d.detokenize(t.tokenize(s, convert_parentheses=True), convert_parentheses=True)
|
|
236
|
+
True
|
|
237
|
+
|
|
238
|
+
During tokenization it's safe to add more spaces but during detokenization,
|
|
239
|
+
simply undoing the padding doesn't really help.
|
|
240
|
+
|
|
241
|
+
- During tokenization, left and right pad is added to [!?], when
|
|
242
|
+
detokenizing, only left shift the [!?] is needed.
|
|
243
|
+
Thus (re.compile(r'\s([?!])'), r'\g<1>')
|
|
244
|
+
|
|
245
|
+
- During tokenization [:,] are left and right padded but when detokenizing,
|
|
246
|
+
only left shift is necessary and we keep right pad after comma/colon
|
|
247
|
+
if the string after is a non-digit.
|
|
248
|
+
Thus (re.compile(r'\s([:,])\s([^\d])'), r'\1 \2')
|
|
249
|
+
|
|
250
|
+
>>> from nltk.tokenize.treebank import TreebankWordDetokenizer
|
|
251
|
+
>>> toks = ['hello', ',', 'i', 'ca', "n't", 'feel', 'my', 'feet', '!', 'Help', '!', '!']
|
|
252
|
+
>>> twd = TreebankWordDetokenizer()
|
|
253
|
+
>>> twd.detokenize(toks)
|
|
254
|
+
"hello, i can't feel my feet! Help!!"
|
|
255
|
+
|
|
256
|
+
>>> toks = ['hello', ',', 'i', "can't", 'feel', ';', 'my', 'feet', '!',
|
|
257
|
+
... 'Help', '!', '!', 'He', 'said', ':', 'Help', ',', 'help', '?', '!']
|
|
258
|
+
>>> twd.detokenize(toks)
|
|
259
|
+
"hello, i can't feel; my feet! Help!! He said: Help, help?!"
|
|
260
|
+
"""
|
|
261
|
+
_contractions = MacIntyreContractions()
|
|
262
|
+
CONTRACTIONS2 = [re.compile(pattern.replace('(?#X)', '\s'))
|
|
263
|
+
for pattern in _contractions.CONTRACTIONS2]
|
|
264
|
+
CONTRACTIONS3 = [re.compile(pattern.replace('(?#X)', '\s'))
|
|
265
|
+
for pattern in _contractions.CONTRACTIONS3]
|
|
266
|
+
|
|
267
|
+
# ending quotes
|
|
268
|
+
ENDING_QUOTES = [
|
|
269
|
+
(re.compile(r"([^' ])\s('ll|'LL|'re|'RE|'ve|'VE|n't|N'T) "), r"\1\2 "),
|
|
270
|
+
(re.compile(r"([^' ])\s('[sS]|'[mM]|'[dD]|') "), r"\1\2 "),
|
|
271
|
+
(re.compile(r'(\S)(\'\')'), r'\1\2 '),
|
|
272
|
+
(re.compile(r" '' "), '"')
|
|
273
|
+
]
|
|
274
|
+
|
|
275
|
+
# Handles double dashes
|
|
276
|
+
DOUBLE_DASHES = (re.compile(r' -- '), r'--')
|
|
277
|
+
|
|
278
|
+
# Optionally: Convert parentheses, brackets and converts them from PTB symbols.
|
|
279
|
+
CONVERT_PARENTHESES = [
|
|
280
|
+
(re.compile('-LRB-'), '('), (re.compile('-RRB-'), ')'),
|
|
281
|
+
(re.compile('-LSB-'), '['), (re.compile('-RSB-'), ']'),
|
|
282
|
+
(re.compile('-LCB-'), '{'), (re.compile('-RCB-'), '}')
|
|
283
|
+
]
|
|
284
|
+
|
|
285
|
+
# Undo padding on parentheses.
|
|
286
|
+
PARENS_BRACKETS = [(re.compile(r'\s([\[\(\{\<])\s'), r' \g<1>'),
|
|
287
|
+
(re.compile(r'\s([\]\)\}\>])\s'), r'\g<1> '),
|
|
288
|
+
(re.compile(r'([\]\)\}\>])\s([:;,.])'), r'\1\2')]
|
|
289
|
+
|
|
290
|
+
# punctuation
|
|
291
|
+
PUNCTUATION = [
|
|
292
|
+
(re.compile(r"([^'])\s'\s"), r"\1' "),
|
|
293
|
+
(re.compile(r'\s([?!])'), r'\g<1>'), # Strip left pad for [?!]
|
|
294
|
+
# (re.compile(r'\s([?!])\s'), r'\g<1>'),
|
|
295
|
+
(re.compile(r'([^\.])\s(\.)([\]\)}>"\']*)\s*$'), r'\1\2\3'),
|
|
296
|
+
# When tokenizing, [;@#$%&] are padded with whitespace regardless of
|
|
297
|
+
# whether there are spaces before or after them.
|
|
298
|
+
# But during detokenization, we need to distinguish between left/right
|
|
299
|
+
# pad, so we split this up.
|
|
300
|
+
(re.compile(r'\s([#$])\s'), r' \g<1>'), # Left pad.
|
|
301
|
+
(re.compile(r'\s([;%])\s'), r'\g<1> '), # Right pad.
|
|
302
|
+
(re.compile(r'\s([&])\s'), r' \g<1> '), # Unknown pad.
|
|
303
|
+
(re.compile(r'\s\.\.\.\s'), r'...'),
|
|
304
|
+
(re.compile(r'\s([:,])\s$'), r'\1'),
|
|
305
|
+
(re.compile(r'\s([:,])\s([^\d])'), r'\1 \2') # Keep right pad after comma/colon before non-digits.
|
|
306
|
+
# (re.compile(r'\s([:,])\s([^\d])'), r'\1\2')
|
|
307
|
+
]
|
|
308
|
+
|
|
309
|
+
# starting quotes
|
|
310
|
+
STARTING_QUOTES = [
|
|
311
|
+
(re.compile(r'([ (\[{<])\s``'), r'\1"'),
|
|
312
|
+
(re.compile(r'\s(``)\s'), r'\1'),
|
|
313
|
+
(re.compile(r'^``'), r'\"'),
|
|
314
|
+
]
|
|
315
|
+
|
|
316
|
+
def tokenize(self, tokens, convert_parentheses=False):
|
|
317
|
+
"""
|
|
318
|
+
Python port of the Moses detokenizer.
|
|
319
|
+
|
|
320
|
+
:param tokens: A list of strings, i.e. tokenized text.
|
|
321
|
+
:type tokens: list(str)
|
|
322
|
+
:return: str
|
|
323
|
+
"""
|
|
324
|
+
text = ' '.join(tokens)
|
|
325
|
+
# Reverse the contractions regexes.
|
|
326
|
+
# Note: CONTRACTIONS4 are not used in tokenization.
|
|
327
|
+
for regexp in self.CONTRACTIONS3:
|
|
328
|
+
text = regexp.sub(r'\1\2', text)
|
|
329
|
+
for regexp in self.CONTRACTIONS2:
|
|
330
|
+
text = regexp.sub(r'\1\2', text)
|
|
331
|
+
|
|
332
|
+
# Reverse the regexes applied for ending quotes.
|
|
333
|
+
for regexp, substitution in self.ENDING_QUOTES:
|
|
334
|
+
text = regexp.sub(substitution, text)
|
|
335
|
+
|
|
336
|
+
# Undo the space padding.
|
|
337
|
+
text = text.strip()
|
|
338
|
+
|
|
339
|
+
# Reverse the padding on double dashes.
|
|
340
|
+
regexp, substitution = self.DOUBLE_DASHES
|
|
341
|
+
text = regexp.sub(substitution, text)
|
|
342
|
+
|
|
343
|
+
if convert_parentheses:
|
|
344
|
+
for regexp, substitution in self.CONVERT_PARENTHESES:
|
|
345
|
+
text = regexp.sub(substitution, text)
|
|
346
|
+
|
|
347
|
+
# Reverse the padding regexes applied for parenthesis/brackets.
|
|
348
|
+
for regexp, substitution in self.PARENS_BRACKETS:
|
|
349
|
+
text = regexp.sub(substitution, text)
|
|
350
|
+
|
|
351
|
+
# Reverse the regexes applied for punctuations.
|
|
352
|
+
for regexp, substitution in self.PUNCTUATION:
|
|
353
|
+
text = regexp.sub(substitution, text)
|
|
354
|
+
|
|
355
|
+
# Reverse the regexes applied for starting quotes.
|
|
356
|
+
for regexp, substitution in self.STARTING_QUOTES:
|
|
357
|
+
text = regexp.sub(substitution, text)
|
|
358
|
+
|
|
359
|
+
return text.strip()
|
|
360
|
+
|
|
361
|
+
def detokenize(self, tokens, convert_parentheses=False):
|
|
362
|
+
""" Duck-typing the abstract *tokenize()*."""
|
|
363
|
+
return self.tokenize(tokens, convert_parentheses)
|
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Natural Language Toolkit: Tokenizer Utilities
|
|
3
|
+
#
|
|
4
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
5
|
+
# Author: Steven Bird <stevenbird1@gmail.com>
|
|
6
|
+
# URL: <http://nltk.sourceforge.net>
|
|
7
|
+
# For license information, see LICENSE.TXT
|
|
8
|
+
|
|
9
|
+
from re import finditer
|
|
10
|
+
from xml.sax.saxutils import escape, unescape
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def string_span_tokenize(s, sep):
|
|
14
|
+
r"""
|
|
15
|
+
Return the offsets of the tokens in *s*, as a sequence of ``(start, end)``
|
|
16
|
+
tuples, by splitting the string at each occurrence of *sep*.
|
|
17
|
+
|
|
18
|
+
>>> from nltk.tokenize.util import string_span_tokenize
|
|
19
|
+
>>> s = '''Good muffins cost $3.88\nin New York. Please buy me
|
|
20
|
+
... two of them.\n\nThanks.'''
|
|
21
|
+
>>> list(string_span_tokenize(s, " "))
|
|
22
|
+
[(0, 4), (5, 12), (13, 17), (18, 26), (27, 30), (31, 36), (37, 37),
|
|
23
|
+
(38, 44), (45, 48), (49, 55), (56, 58), (59, 73)]
|
|
24
|
+
|
|
25
|
+
:param s: the string to be tokenized
|
|
26
|
+
:type s: str
|
|
27
|
+
:param sep: the token separator
|
|
28
|
+
:type sep: str
|
|
29
|
+
:rtype: iter(tuple(int, int))
|
|
30
|
+
"""
|
|
31
|
+
if len(sep) == 0:
|
|
32
|
+
raise ValueError("Token delimiter must not be empty")
|
|
33
|
+
left = 0
|
|
34
|
+
while True:
|
|
35
|
+
try:
|
|
36
|
+
right = s.index(sep, left)
|
|
37
|
+
if right != 0:
|
|
38
|
+
yield left, right
|
|
39
|
+
except ValueError:
|
|
40
|
+
if left != len(s):
|
|
41
|
+
yield left, len(s)
|
|
42
|
+
break
|
|
43
|
+
|
|
44
|
+
left = right + len(sep)
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
def regexp_span_tokenize(s, regexp):
|
|
48
|
+
r"""
|
|
49
|
+
Return the offsets of the tokens in *s*, as a sequence of ``(start, end)``
|
|
50
|
+
tuples, by splitting the string at each successive match of *regexp*.
|
|
51
|
+
|
|
52
|
+
>>> from nltk.tokenize.util import regexp_span_tokenize
|
|
53
|
+
>>> s = '''Good muffins cost $3.88\nin New York. Please buy me
|
|
54
|
+
... two of them.\n\nThanks.'''
|
|
55
|
+
>>> list(regexp_span_tokenize(s, r'\s'))
|
|
56
|
+
[(0, 4), (5, 12), (13, 17), (18, 23), (24, 26), (27, 30), (31, 36),
|
|
57
|
+
(38, 44), (45, 48), (49, 51), (52, 55), (56, 58), (59, 64), (66, 73)]
|
|
58
|
+
|
|
59
|
+
:param s: the string to be tokenized
|
|
60
|
+
:type s: str
|
|
61
|
+
:param regexp: regular expression that matches token separators (must not be empty)
|
|
62
|
+
:type regexp: str
|
|
63
|
+
:rtype: iter(tuple(int, int))
|
|
64
|
+
"""
|
|
65
|
+
left = 0
|
|
66
|
+
for m in finditer(regexp, s):
|
|
67
|
+
right, next = m.span()
|
|
68
|
+
if right != left:
|
|
69
|
+
yield left, right
|
|
70
|
+
left = next
|
|
71
|
+
yield left, len(s)
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def spans_to_relative(spans):
|
|
75
|
+
r"""
|
|
76
|
+
Return a sequence of relative spans, given a sequence of spans.
|
|
77
|
+
|
|
78
|
+
>>> from nltk.tokenize import WhitespaceTokenizer
|
|
79
|
+
>>> from nltk.tokenize.util import spans_to_relative
|
|
80
|
+
>>> s = '''Good muffins cost $3.88\nin New York. Please buy me
|
|
81
|
+
... two of them.\n\nThanks.'''
|
|
82
|
+
>>> list(spans_to_relative(WhitespaceTokenizer().span_tokenize(s)))
|
|
83
|
+
[(0, 4), (1, 7), (1, 4), (1, 5), (1, 2), (1, 3), (1, 5), (2, 6),
|
|
84
|
+
(1, 3), (1, 2), (1, 3), (1, 2), (1, 5), (2, 7)]
|
|
85
|
+
|
|
86
|
+
:param spans: a sequence of (start, end) offsets of the tokens
|
|
87
|
+
:type spans: iter(tuple(int, int))
|
|
88
|
+
:rtype: iter(tuple(int, int))
|
|
89
|
+
"""
|
|
90
|
+
prev = 0
|
|
91
|
+
for left, right in spans:
|
|
92
|
+
yield left - prev, right - left
|
|
93
|
+
prev = right
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class CJKChars(object):
|
|
97
|
+
"""
|
|
98
|
+
An object that enumerates the code points of the CJK characters as listed on
|
|
99
|
+
http://en.wikipedia.org/wiki/Basic_Multilingual_Plane#Basic_Multilingual_Plane
|
|
100
|
+
|
|
101
|
+
This is a Python port of the CJK code point enumerations of Moses tokenizer:
|
|
102
|
+
https://github.com/moses-smt/mosesdecoder/blob/master/scripts/tokenizer/detokenizer.perl#L309
|
|
103
|
+
"""
|
|
104
|
+
# Hangul Jamo (1100–11FF)
|
|
105
|
+
Hangul_Jamo = (4352, 4607) # (ord(u"\u1100"), ord(u"\u11ff"))
|
|
106
|
+
|
|
107
|
+
# CJK Radicals Supplement (2E80–2EFF)
|
|
108
|
+
# Kangxi Radicals (2F00–2FDF)
|
|
109
|
+
# Ideographic Description Characters (2FF0–2FFF)
|
|
110
|
+
# CJK Symbols and Punctuation (3000–303F)
|
|
111
|
+
# Hiragana (3040–309F)
|
|
112
|
+
# Katakana (30A0–30FF)
|
|
113
|
+
# Bopomofo (3100–312F)
|
|
114
|
+
# Hangul Compatibility Jamo (3130–318F)
|
|
115
|
+
# Kanbun (3190–319F)
|
|
116
|
+
# Bopomofo Extended (31A0–31BF)
|
|
117
|
+
# CJK Strokes (31C0–31EF)
|
|
118
|
+
# Katakana Phonetic Extensions (31F0–31FF)
|
|
119
|
+
# Enclosed CJK Letters and Months (3200–32FF)
|
|
120
|
+
# CJK Compatibility (3300–33FF)
|
|
121
|
+
# CJK Unified Ideographs Extension A (3400–4DBF)
|
|
122
|
+
# Yijing Hexagram Symbols (4DC0–4DFF)
|
|
123
|
+
# CJK Unified Ideographs (4E00–9FFF)
|
|
124
|
+
# Yi Syllables (A000–A48F)
|
|
125
|
+
# Yi Radicals (A490–A4CF)
|
|
126
|
+
CJK_Radicals = (11904, 42191) # (ord(u"\u2e80"), ord(u"\ua4cf"))
|
|
127
|
+
|
|
128
|
+
# Phags-pa (A840–A87F)
|
|
129
|
+
Phags_Pa = (43072, 43135) # (ord(u"\ua840"), ord(u"\ua87f"))
|
|
130
|
+
|
|
131
|
+
# Hangul Syllables (AC00–D7AF)
|
|
132
|
+
Hangul_Syllables = (44032, 55215) # (ord(u"\uAC00"), ord(u"\uD7AF"))
|
|
133
|
+
|
|
134
|
+
# CJK Compatibility Ideographs (F900–FAFF)
|
|
135
|
+
CJK_Compatibility_Ideographs = (63744, 64255) # (ord(u"\uF900"), ord(u"\uFAFF"))
|
|
136
|
+
|
|
137
|
+
# CJK Compatibility Forms (FE30–FE4F)
|
|
138
|
+
CJK_Compatibility_Forms = (65072, 65103) # (ord(u"\uFE30"), ord(u"\uFE4F"))
|
|
139
|
+
|
|
140
|
+
# Range U+FF65–FFDC encodes halfwidth forms, of Katakana and Hangul characters
|
|
141
|
+
Katakana_Hangul_Halfwidth = (65381, 65500) # (ord(u"\uFF65"), ord(u"\uFFDC"))
|
|
142
|
+
|
|
143
|
+
# Supplementary Ideographic Plane 20000–2FFFF
|
|
144
|
+
Supplementary_Ideographic_Plane = (131072, 196607) # (ord(u"\U00020000"), ord(u"\U0002FFFF"))
|
|
145
|
+
|
|
146
|
+
ranges = [Hangul_Jamo, CJK_Radicals, Phags_Pa, Hangul_Syllables,
|
|
147
|
+
CJK_Compatibility_Ideographs, CJK_Compatibility_Forms,
|
|
148
|
+
Katakana_Hangul_Halfwidth, Supplementary_Ideographic_Plane]
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def is_cjk(character):
|
|
152
|
+
"""
|
|
153
|
+
Python port of Moses' code to check for CJK character.
|
|
154
|
+
|
|
155
|
+
>>> CJKChars().ranges
|
|
156
|
+
[(4352, 4607), (11904, 42191), (43072, 43135), (44032, 55215), (63744, 64255), (65072, 65103), (65381, 65500), (131072, 196607)]
|
|
157
|
+
>>> is_cjk(u'\u33fe')
|
|
158
|
+
True
|
|
159
|
+
>>> is_cjk(u'\uFE5F')
|
|
160
|
+
False
|
|
161
|
+
|
|
162
|
+
:param character: The character that needs to be checked.
|
|
163
|
+
:type character: char
|
|
164
|
+
:return: bool
|
|
165
|
+
"""
|
|
166
|
+
return any([start <= ord(character) <= end for start, end in
|
|
167
|
+
[(4352, 4607), (11904, 42191), (43072, 43135), (44032, 55215),
|
|
168
|
+
(63744, 64255), (65072, 65103), (65381, 65500),
|
|
169
|
+
(131072, 196607)]
|
|
170
|
+
])
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
def xml_escape(text):
|
|
174
|
+
"""
|
|
175
|
+
This function transforms the input text into an "escaped" version suitable
|
|
176
|
+
for well-formed XML formatting.
|
|
177
|
+
|
|
178
|
+
Note that the default xml.sax.saxutils.escape() function don't escape
|
|
179
|
+
some characters that Moses does so we have to manually add them to the
|
|
180
|
+
entities dictionary.
|
|
181
|
+
|
|
182
|
+
>>> input_str = ''')| & < > ' " ] ['''
|
|
183
|
+
>>> expected_output = ''')| & < > ' " ] ['''
|
|
184
|
+
>>> escape(input_str) == expected_output
|
|
185
|
+
True
|
|
186
|
+
>>> xml_escape(input_str)
|
|
187
|
+
')| & < > ' " ] ['
|
|
188
|
+
|
|
189
|
+
:param text: The text that needs to be escaped.
|
|
190
|
+
:type text: str
|
|
191
|
+
:rtype: str
|
|
192
|
+
"""
|
|
193
|
+
return escape(text, entities={r"'": r"'", r'"': r""",
|
|
194
|
+
r"|": r"|",
|
|
195
|
+
r"[": r"[", r"]": r"]", })
|
|
196
|
+
|
|
197
|
+
|
|
198
|
+
def xml_unescape(text):
|
|
199
|
+
"""
|
|
200
|
+
This function transforms the "escaped" version suitable
|
|
201
|
+
for well-formed XML formatting into humanly-readable string.
|
|
202
|
+
|
|
203
|
+
Note that the default xml.sax.saxutils.unescape() function don't unescape
|
|
204
|
+
some characters that Moses does so we have to manually add them to the
|
|
205
|
+
entities dictionary.
|
|
206
|
+
|
|
207
|
+
>>> from xml.sax.saxutils import unescape
|
|
208
|
+
>>> s = ')| & < > ' " ] ['
|
|
209
|
+
>>> expected = ''')| & < > \' " ] ['''
|
|
210
|
+
>>> xml_unescape(s) == expected
|
|
211
|
+
True
|
|
212
|
+
|
|
213
|
+
:param text: The text that needs to be unescaped.
|
|
214
|
+
:type text: str
|
|
215
|
+
:rtype: str
|
|
216
|
+
"""
|
|
217
|
+
return unescape(text, entities={r"'": r"'", r""": r'"',
|
|
218
|
+
r"|": r"|",
|
|
219
|
+
r"[": r"[", r"]": r"]", })
|
|
220
|
+
|
|
221
|
+
|
|
222
|
+
def align_tokens(tokens, sentence):
|
|
223
|
+
"""
|
|
224
|
+
This module attempt to find the offsets of the tokens in *s*, as a sequence
|
|
225
|
+
of ``(start, end)`` tuples, given the tokens and also the source string.
|
|
226
|
+
|
|
227
|
+
>>> from nltk.tokenize import TreebankWordTokenizer
|
|
228
|
+
>>> from nltk.tokenize.util import align_tokens
|
|
229
|
+
>>> s = str("The plane, bound for St Petersburg, crashed in Egypt's "
|
|
230
|
+
... "Sinai desert just 23 minutes after take-off from Sharm el-Sheikh "
|
|
231
|
+
... "on Saturday.")
|
|
232
|
+
>>> tokens = TreebankWordTokenizer().tokenize(s)
|
|
233
|
+
>>> expected = [(0, 3), (4, 9), (9, 10), (11, 16), (17, 20), (21, 23),
|
|
234
|
+
... (24, 34), (34, 35), (36, 43), (44, 46), (47, 52), (52, 54),
|
|
235
|
+
... (55, 60), (61, 67), (68, 72), (73, 75), (76, 83), (84, 89),
|
|
236
|
+
... (90, 98), (99, 103), (104, 109), (110, 119), (120, 122),
|
|
237
|
+
... (123, 131), (131, 132)]
|
|
238
|
+
>>> output = list(align_tokens(tokens, s))
|
|
239
|
+
>>> len(tokens) == len(expected) == len(output) # Check that length of tokens and tuples are the same.
|
|
240
|
+
True
|
|
241
|
+
>>> expected == list(align_tokens(tokens, s)) # Check that the output is as expected.
|
|
242
|
+
True
|
|
243
|
+
>>> tokens == [s[start:end] for start, end in output] # Check that the slices of the string corresponds to the tokens.
|
|
244
|
+
True
|
|
245
|
+
|
|
246
|
+
:param tokens: The list of strings that are the result of tokenization
|
|
247
|
+
:type tokens: list(str)
|
|
248
|
+
:param sentence: The original string
|
|
249
|
+
:type sentence: str
|
|
250
|
+
:rtype: list(tuple(int,int))
|
|
251
|
+
"""
|
|
252
|
+
point = 0
|
|
253
|
+
offsets = []
|
|
254
|
+
for token in tokens:
|
|
255
|
+
try:
|
|
256
|
+
start = sentence.index(token, point)
|
|
257
|
+
except ValueError:
|
|
258
|
+
raise ValueError('substring "{}" not found in "{}"'.format(token, sentence))
|
|
259
|
+
point = start + len(token)
|
|
260
|
+
offsets.append((start, point))
|
|
261
|
+
return offsets
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# coding: utf-8
|
|
2
2
|
# Natural Language Toolkit: Toolbox Reader
|
|
3
3
|
#
|
|
4
|
-
# Copyright (C) 2001-
|
|
4
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
5
5
|
# Author: Greg Aumann <greg_aumann@sil.org>
|
|
6
6
|
# URL: <http://nltk.org>
|
|
7
7
|
# For license information, see LICENSE.TXT
|
|
@@ -15,7 +15,9 @@ from __future__ import print_function
|
|
|
15
15
|
import os, re, codecs
|
|
16
16
|
from xml.etree.ElementTree import ElementTree, TreeBuilder, Element, SubElement
|
|
17
17
|
|
|
18
|
-
from
|
|
18
|
+
from six import u
|
|
19
|
+
|
|
20
|
+
from nltk.compat import StringIO, PY3
|
|
19
21
|
from nltk.data import PathPointer, ZipFilePathPointer, find
|
|
20
22
|
|
|
21
23
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
# Natural Language Toolkit: Machine Translation
|
|
3
3
|
#
|
|
4
|
-
# Copyright (C) 2001-
|
|
4
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
5
5
|
# Author: Steven Bird <stevenbird1@gmail.com>, Tah Wei Hoon <hoon.tw@gmail.com>
|
|
6
6
|
# URL: <http://nltk.org/>
|
|
7
7
|
# For license information, see LICENSE.TXT
|