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,137 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Natural Language Toolkit: ChrF score
|
|
3
|
+
#
|
|
4
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
5
|
+
# Authors: Maja Popovic
|
|
6
|
+
# Contributors: Liling Tan
|
|
7
|
+
# URL: <http://nltk.org/>
|
|
8
|
+
# For license information, see LICENSE.TXT
|
|
9
|
+
|
|
10
|
+
""" ChrF score implementation """
|
|
11
|
+
from __future__ import division
|
|
12
|
+
from collections import Counter
|
|
13
|
+
|
|
14
|
+
from nltk.util import ngrams, everygrams
|
|
15
|
+
|
|
16
|
+
def sentence_chrf(reference, hypothesis, min_len=1, max_len=6, beta=3.0):
|
|
17
|
+
"""
|
|
18
|
+
Calculates the sentence level CHRF (Character n-gram F-score) described in
|
|
19
|
+
- Maja Popovic. 2015. CHRF: Character n-gram F-score for Automatic MT Evaluation.
|
|
20
|
+
In Proceedings of the 10th Workshop on Machine Translation.
|
|
21
|
+
http://www.statmt.org/wmt15/pdf/WMT49.pdf
|
|
22
|
+
- Maja Popovic. 2016. CHRF Deconstructed: β Parameters and n-gram Weights.
|
|
23
|
+
In Proceedings of the 1st Conference on Machine Translation.
|
|
24
|
+
http://www.statmt.org/wmt16/pdf/W16-2341.pdf
|
|
25
|
+
|
|
26
|
+
Unlike multi-reference BLEU, CHRF only supports a single reference.
|
|
27
|
+
|
|
28
|
+
An example from the original BLEU paper
|
|
29
|
+
http://www.aclweb.org/anthology/P02-1040.pdf
|
|
30
|
+
|
|
31
|
+
>>> ref1 = str('It is a guide to action that ensures that the military '
|
|
32
|
+
... 'will forever heed Party commands').split()
|
|
33
|
+
>>> hyp1 = str('It is a guide to action which ensures that the military '
|
|
34
|
+
... 'always obeys the commands of the party').split()
|
|
35
|
+
>>> hyp2 = str('It is to insure the troops forever hearing the activity '
|
|
36
|
+
... 'guidebook that party direct').split()
|
|
37
|
+
>>> sentence_chrf(ref1, hyp1) # doctest: +ELLIPSIS
|
|
38
|
+
0.6768...
|
|
39
|
+
>>> sentence_chrf(ref1, hyp2) # doctest: +ELLIPSIS
|
|
40
|
+
0.4201...
|
|
41
|
+
|
|
42
|
+
The infamous "the the the ... " example
|
|
43
|
+
|
|
44
|
+
>>> ref = 'the cat is on the mat'.split()
|
|
45
|
+
>>> hyp = 'the the the the the the the'.split()
|
|
46
|
+
>>> sentence_chrf(ref, hyp) # doctest: +ELLIPSIS
|
|
47
|
+
0.2530...
|
|
48
|
+
|
|
49
|
+
An example to show that this function allows users to use strings instead of
|
|
50
|
+
tokens, i.e. list(str) as inputs.
|
|
51
|
+
|
|
52
|
+
>>> ref1 = str('It is a guide to action that ensures that the military '
|
|
53
|
+
... 'will forever heed Party commands')
|
|
54
|
+
>>> hyp1 = str('It is a guide to action which ensures that the military '
|
|
55
|
+
... 'always obeys the commands of the party')
|
|
56
|
+
>>> sentence_chrf(ref1, hyp1) # doctest: +ELLIPSIS
|
|
57
|
+
0.6768...
|
|
58
|
+
>>> type(ref1) == type(hyp1) == str
|
|
59
|
+
True
|
|
60
|
+
>>> sentence_chrf(ref1.split(), hyp1.split()) # doctest: +ELLIPSIS
|
|
61
|
+
0.6768...
|
|
62
|
+
|
|
63
|
+
To skip the unigrams and only use 2- to 3-grams:
|
|
64
|
+
|
|
65
|
+
>>> sentence_chrf(ref1, hyp1, min_len=2, max_len=3) # doctest: +ELLIPSIS
|
|
66
|
+
0.7018...
|
|
67
|
+
|
|
68
|
+
:param references: reference sentence
|
|
69
|
+
:type references: list(str) / str
|
|
70
|
+
:param hypothesis: a hypothesis sentence
|
|
71
|
+
:type hypothesis: list(str) / str
|
|
72
|
+
:param min_len: The minimum order of n-gram this function should extract.
|
|
73
|
+
:type min_len: int
|
|
74
|
+
:param max_len: The maximum order of n-gram this function should extract.
|
|
75
|
+
:type max_len: int
|
|
76
|
+
:param beta: the parameter to assign more importance to recall over precision
|
|
77
|
+
:type beta: float
|
|
78
|
+
:return: the sentence level CHRF score.
|
|
79
|
+
:rtype: float
|
|
80
|
+
"""
|
|
81
|
+
return corpus_chrf([reference], [hypothesis], min_len, max_len, beta=beta)
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def corpus_chrf(list_of_references, hypotheses, min_len=1, max_len=6, beta=3.0):
|
|
85
|
+
"""
|
|
86
|
+
Calculates the corpus level CHRF (Character n-gram F-score), it is the
|
|
87
|
+
micro-averaged value of the sentence/segment level CHRF score.
|
|
88
|
+
|
|
89
|
+
CHRF only supports a single reference.
|
|
90
|
+
|
|
91
|
+
>>> ref1 = str('It is a guide to action that ensures that the military '
|
|
92
|
+
... 'will forever heed Party commands').split()
|
|
93
|
+
>>> ref2 = str('It is the guiding principle which guarantees the military '
|
|
94
|
+
... 'forces always being under the command of the Party').split()
|
|
95
|
+
>>>
|
|
96
|
+
>>> hyp1 = str('It is a guide to action which ensures that the military '
|
|
97
|
+
... 'always obeys the commands of the party').split()
|
|
98
|
+
>>> hyp2 = str('It is to insure the troops forever hearing the activity '
|
|
99
|
+
... 'guidebook that party direct')
|
|
100
|
+
>>> corpus_chrf([ref1, ref2, ref1, ref2], [hyp1, hyp2, hyp2, hyp1]) # doctest: +ELLIPSIS
|
|
101
|
+
0.4915...
|
|
102
|
+
|
|
103
|
+
:param references: a corpus of list of reference sentences, w.r.t. hypotheses
|
|
104
|
+
:type references: list(list(str)) / list(str)
|
|
105
|
+
:param hypotheses: a list of hypothesis sentences
|
|
106
|
+
:type hypotheses: list(list(str)) / list(str)
|
|
107
|
+
:param min_len: The minimum order of n-gram this function should extract.
|
|
108
|
+
:type min_len: int
|
|
109
|
+
:param max_len: The maximum order of n-gram this function should extract.
|
|
110
|
+
:type max_len: int
|
|
111
|
+
:param beta: the parameter to assign more importance to recall over precision
|
|
112
|
+
:type beta: float
|
|
113
|
+
:return: the sentence level CHRF score.
|
|
114
|
+
:rtype: float
|
|
115
|
+
"""
|
|
116
|
+
|
|
117
|
+
assert len(list_of_references) == len(hypotheses), "The number of hypotheses and their references should be the same"
|
|
118
|
+
|
|
119
|
+
# Iterate through each hypothesis and their corresponding references.
|
|
120
|
+
for reference, hypothesis in zip(list_of_references, hypotheses):
|
|
121
|
+
# Cheating condition to allow users to input strings instead of tokens.
|
|
122
|
+
if type(reference) and type(hypothesis) != str:
|
|
123
|
+
reference, hypothesis = ' '.join(reference), ' '.join(hypothesis)
|
|
124
|
+
# For each order of ngram, calculate the no. of ngram matches and
|
|
125
|
+
# keep track of no. of ngram in references.
|
|
126
|
+
ref_ngrams = Counter(everygrams(reference, min_len, max_len))
|
|
127
|
+
hyp_ngrams = Counter(everygrams(hypothesis, min_len, max_len))
|
|
128
|
+
overlap_ngrams = ref_ngrams & hyp_ngrams
|
|
129
|
+
tp = sum(overlap_ngrams.values()) # True positives.
|
|
130
|
+
tpfp = sum(hyp_ngrams.values()) # True positives + False positives.
|
|
131
|
+
tffn = sum(ref_ngrams.values()) # True posities + False negatives.
|
|
132
|
+
|
|
133
|
+
precision = tp / tpfp
|
|
134
|
+
recall = tp / tffn
|
|
135
|
+
factor = beta**2
|
|
136
|
+
score = (1+ factor ) * (precision * recall) / ( factor * precision + recall)
|
|
137
|
+
return score
|
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
|
|
3
3
|
# Natural Language Toolkit: Gale-Church Aligner
|
|
4
4
|
#
|
|
5
|
-
# Copyright (C) 2001-
|
|
5
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
6
6
|
# Author: Torsten Marek <marek@ifi.uzh.ch>
|
|
7
|
+
# Contributor: Cassidy Laidlaw, Liling Tan
|
|
7
8
|
# URL: <http://nltk.org/>
|
|
8
9
|
# For license information, see LICENSE.TXT
|
|
9
10
|
|
|
@@ -76,16 +77,30 @@ class LanguageIndependent(object):
|
|
|
76
77
|
VARIANCE_CHARACTERS = 6.8
|
|
77
78
|
|
|
78
79
|
|
|
79
|
-
def trace(backlinks,
|
|
80
|
+
def trace(backlinks, source_sents_lens, target_sents_lens):
|
|
81
|
+
"""
|
|
82
|
+
Traverse the alignment cost from the tracebacks and retrieves
|
|
83
|
+
appropriate sentence pairs.
|
|
84
|
+
|
|
85
|
+
:param backlinks: A dictionary where the key is the alignment points and value is the cost (referencing the LanguageIndependent.PRIORS)
|
|
86
|
+
:type backlinks: dict
|
|
87
|
+
:param source_sents_lens: A list of target sentences' lengths
|
|
88
|
+
:type source_sents_lens: list(int)
|
|
89
|
+
:param target_sents_lens: A list of target sentences' lengths
|
|
90
|
+
:type target_sents_lens: list(int)
|
|
91
|
+
"""
|
|
80
92
|
links = []
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
93
|
+
position = (len(source_sents_lens), len(target_sents_lens))
|
|
94
|
+
while position != (0, 0) and all(p >=0 for p in position):
|
|
95
|
+
try:
|
|
96
|
+
s, t = backlinks[position]
|
|
97
|
+
except TypeError:
|
|
98
|
+
position = (position[0]-1 , position[1]-1)
|
|
99
|
+
continue
|
|
85
100
|
for i in range(s):
|
|
86
101
|
for j in range(t):
|
|
87
|
-
links.append((
|
|
88
|
-
|
|
102
|
+
links.append((position[0] - i - 1, position[1] - j - 1))
|
|
103
|
+
position = (position[0] - s, position[1] - t)
|
|
89
104
|
|
|
90
105
|
return links[::-1]
|
|
91
106
|
|
|
@@ -116,7 +131,7 @@ def align_log_prob(i, j, source_sents, target_sents, alignment, params):
|
|
|
116
131
|
return - (LOG2 + norm_logsf(abs(delta)) + math.log(params.PRIORS[alignment]))
|
|
117
132
|
|
|
118
133
|
|
|
119
|
-
def align_blocks(
|
|
134
|
+
def align_blocks(source_sents_lens, target_sents_lens, params = LanguageIndependent):
|
|
120
135
|
"""Return the sentence alignment of two text blocks (usually paragraphs).
|
|
121
136
|
|
|
122
137
|
>>> align_blocks([5,5,5], [7,7,7])
|
|
@@ -128,8 +143,8 @@ def align_blocks(source_sents, target_sents, params = LanguageIndependent):
|
|
|
128
143
|
>>> align_blocks([10,2,10,10,2,10], [12,3,20,3,12])
|
|
129
144
|
[(0, 0), (1, 1), (2, 2), (3, 2), (4, 3), (5, 4)]
|
|
130
145
|
|
|
131
|
-
@param
|
|
132
|
-
@param
|
|
146
|
+
@param source_sents_lens: The list of source sentence lengths.
|
|
147
|
+
@param target_sents_lens: The list of target sentence lengths.
|
|
133
148
|
@param params: the sentence alignment parameters.
|
|
134
149
|
@return: The sentence alignments, a list of index pairs.
|
|
135
150
|
"""
|
|
@@ -141,8 +156,8 @@ def align_blocks(source_sents, target_sents, params = LanguageIndependent):
|
|
|
141
156
|
|
|
142
157
|
backlinks = {}
|
|
143
158
|
|
|
144
|
-
for i in range(len(
|
|
145
|
-
for j in range(len(
|
|
159
|
+
for i in range(len(source_sents_lens) + 1):
|
|
160
|
+
for j in range(len(target_sents_lens) + 1):
|
|
146
161
|
min_dist = float('inf')
|
|
147
162
|
min_align = None
|
|
148
163
|
for a in alignment_types:
|
|
@@ -150,7 +165,8 @@ def align_blocks(source_sents, target_sents, params = LanguageIndependent):
|
|
|
150
165
|
prev_j = j - a[1]
|
|
151
166
|
if prev_i < -len(D) or prev_j < 0:
|
|
152
167
|
continue
|
|
153
|
-
p = D[prev_i][prev_j] + align_log_prob(i, j,
|
|
168
|
+
p = D[prev_i][prev_j] + align_log_prob(i, j, source_sents_lens,
|
|
169
|
+
target_sents_lens, a, params)
|
|
154
170
|
if p < min_dist:
|
|
155
171
|
min_dist = p
|
|
156
172
|
min_align = a
|
|
@@ -164,8 +180,8 @@ def align_blocks(source_sents, target_sents, params = LanguageIndependent):
|
|
|
164
180
|
if len(D) > 2:
|
|
165
181
|
D.pop(0)
|
|
166
182
|
D.append([])
|
|
167
|
-
|
|
168
|
-
return trace(backlinks,
|
|
183
|
+
|
|
184
|
+
return trace(backlinks, source_sents_lens, target_sents_lens)
|
|
169
185
|
|
|
170
186
|
|
|
171
187
|
def align_texts(source_blocks, target_blocks, params = LanguageIndependent):
|
|
@@ -230,6 +246,3 @@ def parse_token_stream(stream, soft_delimiter, hard_delimiter):
|
|
|
230
246
|
# print align_texts(source, target)
|
|
231
247
|
|
|
232
248
|
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
# Natural Language Toolkit: GDFA word alignment symmetrization
|
|
3
3
|
#
|
|
4
|
-
# Copyright (C) 2001-
|
|
4
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
5
5
|
# Authors: Liling Tan
|
|
6
6
|
# URL: <http://nltk.org/>
|
|
7
7
|
# For license information, see LICENSE.TXT
|
|
8
8
|
|
|
9
|
-
import codecs
|
|
10
9
|
from collections import defaultdict
|
|
11
10
|
|
|
12
11
|
def grow_diag_final_and(srclen, trglen, e2f, f2e):
|
|
@@ -39,12 +38,12 @@ def grow_diag_final_and(srclen, trglen, e2f, f2e):
|
|
|
39
38
|
>>> trglen = len(trgtext.split())
|
|
40
39
|
>>>
|
|
41
40
|
>>> gdfa = grow_diag_final_and(srclen, trglen, forw, back)
|
|
42
|
-
>>> gdfa == set([(28, 18), (6, 6), (24, 17), (2, 1), (15, 12), (13, 12),
|
|
41
|
+
>>> gdfa == sorted(set([(28, 18), (6, 6), (24, 17), (2, 1), (15, 12), (13, 12),
|
|
43
42
|
... (2, 9), (3, 10), (26, 17), (25, 15), (8, 6), (9, 7), (20,
|
|
44
43
|
... 13), (18, 13), (0, 0), (10, 4), (13, 15), (23, 14), (7, 5),
|
|
45
44
|
... (25, 14), (1, 9), (17, 13), (4, 11), (11, 17), (9, 2), (22,
|
|
46
45
|
... 12), (27, 18), (24, 16), (21, 3), (19, 12), (17, 12), (5,
|
|
47
|
-
... 12), (11, 6), (12, 8)])
|
|
46
|
+
... 12), (11, 6), (12, 8)]))
|
|
48
47
|
True
|
|
49
48
|
|
|
50
49
|
References:
|
|
@@ -73,12 +72,12 @@ def grow_diag_final_and(srclen, trglen, e2f, f2e):
|
|
|
73
72
|
neighbors = [(-1,0),(0,-1),(1,0),(0,1),(-1,-1),(-1,1),(1,-1),(1,1)]
|
|
74
73
|
alignment = set(e2f).intersection(set(f2e)) # Find the intersection.
|
|
75
74
|
union = set(e2f).union(set(f2e))
|
|
76
|
-
|
|
75
|
+
|
|
77
76
|
# *aligned* is used to check if neighbors are aligned in grow_diag()
|
|
78
77
|
aligned = defaultdict(set)
|
|
79
78
|
for i,j in alignment:
|
|
80
79
|
aligned['e'].add(i)
|
|
81
|
-
aligned['
|
|
80
|
+
aligned['f'].add(j)
|
|
82
81
|
|
|
83
82
|
def grow_diag():
|
|
84
83
|
"""
|
|
@@ -88,6 +87,7 @@ def grow_diag_final_and(srclen, trglen, e2f, f2e):
|
|
|
88
87
|
prev_len = len(alignment) - 1
|
|
89
88
|
# iterate until no new points added
|
|
90
89
|
while prev_len < len(alignment):
|
|
90
|
+
no_new_points = True
|
|
91
91
|
# for english word e = 0 ... en
|
|
92
92
|
for e in range(srclen):
|
|
93
93
|
# for foreign word f = 0 ... fn
|
|
@@ -105,6 +105,11 @@ def grow_diag_final_and(srclen, trglen, e2f, f2e):
|
|
|
105
105
|
alignment.add(neighbor)
|
|
106
106
|
aligned['e'].add(e_new); aligned['f'].add(f_new)
|
|
107
107
|
prev_len+=1
|
|
108
|
+
no_new_points = False
|
|
109
|
+
# iterate until no new points added
|
|
110
|
+
if no_new_points:
|
|
111
|
+
break
|
|
112
|
+
|
|
108
113
|
|
|
109
114
|
def final_and(a):
|
|
110
115
|
"""
|
|
@@ -119,13 +124,12 @@ def grow_diag_final_and(srclen, trglen, e2f, f2e):
|
|
|
119
124
|
# and (e-new, f-new in union(e2f, f2e) )
|
|
120
125
|
if (e_new not in aligned
|
|
121
126
|
and f_new not in aligned
|
|
122
|
-
and (e_new, f_new) in
|
|
123
|
-
|
|
127
|
+
and (e_new, f_new) in union):
|
|
124
128
|
alignment.add((e_new, f_new))
|
|
125
129
|
aligned['e'].add(e_new); aligned['f'].add(f_new)
|
|
126
130
|
|
|
131
|
+
|
|
127
132
|
grow_diag()
|
|
128
133
|
final_and(e2f)
|
|
129
134
|
final_and(f2e)
|
|
130
|
-
return alignment
|
|
131
|
-
|
|
135
|
+
return sorted(alignment)
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
# -*- coding: utf-8 -*-
|
|
2
|
+
# Natural Language Toolkit: GLEU Score
|
|
3
|
+
#
|
|
4
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
5
|
+
# Authors:
|
|
6
|
+
# Contributors: Mike Schuster, Michael Wayne Goodman, Liling Tan
|
|
7
|
+
# URL: <http://nltk.org/>
|
|
8
|
+
# For license information, see LICENSE.TXT
|
|
9
|
+
|
|
10
|
+
""" GLEU score implementation. """
|
|
11
|
+
from __future__ import division
|
|
12
|
+
from collections import Counter
|
|
13
|
+
|
|
14
|
+
from nltk.util import ngrams, everygrams
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def sentence_gleu(references, hypothesis, min_len=1, max_len=4):
|
|
18
|
+
"""
|
|
19
|
+
Calculates the sentence level GLEU (Google-BLEU) score described in
|
|
20
|
+
|
|
21
|
+
Yonghui Wu, Mike Schuster, Zhifeng Chen, Quoc V. Le, Mohammad Norouzi,
|
|
22
|
+
Wolfgang Macherey, Maxim Krikun, Yuan Cao, Qin Gao, Klaus Macherey,
|
|
23
|
+
Jeff Klingner, Apurva Shah, Melvin Johnson, Xiaobing Liu, Lukasz Kaiser,
|
|
24
|
+
Stephan Gouws, Yoshikiyo Kato, Taku Kudo, Hideto Kazawa, Keith Stevens,
|
|
25
|
+
George Kurian, Nishant Patil, Wei Wang, Cliff Young, Jason Smith,
|
|
26
|
+
Jason Riesa, Alex Rudnick, Oriol Vinyals, Greg Corrado, Macduff Hughes,
|
|
27
|
+
Jeffrey Dean. (2016) Google’s Neural Machine Translation System:
|
|
28
|
+
Bridging the Gap between Human and Machine Translation.
|
|
29
|
+
eprint arXiv:1609.08144. https://arxiv.org/pdf/1609.08144v2.pdf
|
|
30
|
+
Retrieved on 27 Oct 2016.
|
|
31
|
+
|
|
32
|
+
From Wu et al. (2016):
|
|
33
|
+
"The BLEU score has some undesirable properties when used for single
|
|
34
|
+
sentences, as it was designed to be a corpus measure. We therefore
|
|
35
|
+
use a slightly different score for our RL experiments which we call
|
|
36
|
+
the 'GLEU score'. For the GLEU score, we record all sub-sequences of
|
|
37
|
+
1, 2, 3 or 4 tokens in output and target sequence (n-grams). We then
|
|
38
|
+
compute a recall, which is the ratio of the number of matching n-grams
|
|
39
|
+
to the number of total n-grams in the target (ground truth) sequence,
|
|
40
|
+
and a precision, which is the ratio of the number of matching n-grams
|
|
41
|
+
to the number of total n-grams in the generated output sequence. Then
|
|
42
|
+
GLEU score is simply the minimum of recall and precision. This GLEU
|
|
43
|
+
score's range is always between 0 (no matches) and 1 (all match) and
|
|
44
|
+
it is symmetrical when switching output and target. According to
|
|
45
|
+
our experiments, GLEU score correlates quite well with the BLEU
|
|
46
|
+
metric on a corpus level but does not have its drawbacks for our per
|
|
47
|
+
sentence reward objective."
|
|
48
|
+
|
|
49
|
+
Note: The initial implementation only allowed a single reference, but now
|
|
50
|
+
a list of references is required (which is consistent with
|
|
51
|
+
bleu_score.sentence_bleu()).
|
|
52
|
+
|
|
53
|
+
The infamous "the the the ... " example
|
|
54
|
+
|
|
55
|
+
>>> ref = 'the cat is on the mat'.split()
|
|
56
|
+
>>> hyp = 'the the the the the the the'.split()
|
|
57
|
+
>>> sentence_gleu([ref], hyp) # doctest: +ELLIPSIS
|
|
58
|
+
0.0909...
|
|
59
|
+
|
|
60
|
+
An example to evaluate normal machine translation outputs
|
|
61
|
+
|
|
62
|
+
>>> ref1 = str('It is a guide to action that ensures that the military '
|
|
63
|
+
... 'will forever heed Party commands').split()
|
|
64
|
+
>>> hyp1 = str('It is a guide to action which ensures that the military '
|
|
65
|
+
... 'always obeys the commands of the party').split()
|
|
66
|
+
>>> hyp2 = str('It is to insure the troops forever hearing the activity '
|
|
67
|
+
... 'guidebook that party direct').split()
|
|
68
|
+
>>> sentence_gleu([ref1], hyp1) # doctest: +ELLIPSIS
|
|
69
|
+
0.4393...
|
|
70
|
+
>>> sentence_gleu([ref1], hyp2) # doctest: +ELLIPSIS
|
|
71
|
+
0.1206...
|
|
72
|
+
|
|
73
|
+
:param references: a list of reference sentences
|
|
74
|
+
:type references: list(list(str))
|
|
75
|
+
:param hypothesis: a hypothesis sentence
|
|
76
|
+
:type hypothesis: list(str)
|
|
77
|
+
:param min_len: The minimum order of n-gram this function should extract.
|
|
78
|
+
:type min_len: int
|
|
79
|
+
:param max_len: The maximum order of n-gram this function should extract.
|
|
80
|
+
:type max_len: int
|
|
81
|
+
:return: the sentence level GLEU score.
|
|
82
|
+
:rtype: float
|
|
83
|
+
"""
|
|
84
|
+
return corpus_gleu(
|
|
85
|
+
[references],
|
|
86
|
+
[hypothesis],
|
|
87
|
+
min_len=min_len,
|
|
88
|
+
max_len=max_len
|
|
89
|
+
)
|
|
90
|
+
|
|
91
|
+
def corpus_gleu(list_of_references, hypotheses, min_len=1, max_len=4):
|
|
92
|
+
"""
|
|
93
|
+
Calculate a single corpus-level GLEU score (aka. system-level GLEU) for all
|
|
94
|
+
the hypotheses and their respective references.
|
|
95
|
+
|
|
96
|
+
Instead of averaging the sentence level GLEU scores (i.e. macro-average
|
|
97
|
+
precision), Wu et al. (2016) sum up the matching tokens and the max of
|
|
98
|
+
hypothesis and reference tokens for each sentence, then compute using the
|
|
99
|
+
aggregate values.
|
|
100
|
+
|
|
101
|
+
From Mike Schuster (via email):
|
|
102
|
+
"For the corpus, we just add up the two statistics n_match and
|
|
103
|
+
n_all = max(n_all_output, n_all_target) for all sentences, then
|
|
104
|
+
calculate gleu_score = n_match / n_all, so it is not just a mean of
|
|
105
|
+
the sentence gleu scores (in our case, longer sentences count more,
|
|
106
|
+
which I think makes sense as they are more difficult to translate)."
|
|
107
|
+
|
|
108
|
+
>>> hyp1 = ['It', 'is', 'a', 'guide', 'to', 'action', 'which',
|
|
109
|
+
... 'ensures', 'that', 'the', 'military', 'always',
|
|
110
|
+
... 'obeys', 'the', 'commands', 'of', 'the', 'party']
|
|
111
|
+
>>> ref1a = ['It', 'is', 'a', 'guide', 'to', 'action', 'that',
|
|
112
|
+
... 'ensures', 'that', 'the', 'military', 'will', 'forever',
|
|
113
|
+
... 'heed', 'Party', 'commands']
|
|
114
|
+
>>> ref1b = ['It', 'is', 'the', 'guiding', 'principle', 'which',
|
|
115
|
+
... 'guarantees', 'the', 'military', 'forces', 'always',
|
|
116
|
+
... 'being', 'under', 'the', 'command', 'of', 'the', 'Party']
|
|
117
|
+
>>> ref1c = ['It', 'is', 'the', 'practical', 'guide', 'for', 'the',
|
|
118
|
+
... 'army', 'always', 'to', 'heed', 'the', 'directions',
|
|
119
|
+
... 'of', 'the', 'party']
|
|
120
|
+
|
|
121
|
+
>>> hyp2 = ['he', 'read', 'the', 'book', 'because', 'he', 'was',
|
|
122
|
+
... 'interested', 'in', 'world', 'history']
|
|
123
|
+
>>> ref2a = ['he', 'was', 'interested', 'in', 'world', 'history',
|
|
124
|
+
... 'because', 'he', 'read', 'the', 'book']
|
|
125
|
+
|
|
126
|
+
>>> list_of_references = [[ref1a, ref1b, ref1c], [ref2a]]
|
|
127
|
+
>>> hypotheses = [hyp1, hyp2]
|
|
128
|
+
>>> corpus_gleu(list_of_references, hypotheses) # doctest: +ELLIPSIS
|
|
129
|
+
0.5673...
|
|
130
|
+
|
|
131
|
+
The example below show that corpus_gleu() is different from averaging
|
|
132
|
+
sentence_gleu() for hypotheses
|
|
133
|
+
|
|
134
|
+
>>> score1 = sentence_gleu([ref1a], hyp1)
|
|
135
|
+
>>> score2 = sentence_gleu([ref2a], hyp2)
|
|
136
|
+
>>> (score1 + score2) / 2 # doctest: +ELLIPSIS
|
|
137
|
+
0.6144...
|
|
138
|
+
|
|
139
|
+
:param list_of_references: a list of reference sentences, w.r.t. hypotheses
|
|
140
|
+
:type list_of_references: list(list(list(str)))
|
|
141
|
+
:param hypotheses: a list of hypothesis sentences
|
|
142
|
+
:type hypotheses: list(list(str))
|
|
143
|
+
:param min_len: The minimum order of n-gram this function should extract.
|
|
144
|
+
:type min_len: int
|
|
145
|
+
:param max_len: The maximum order of n-gram this function should extract.
|
|
146
|
+
:type max_len: int
|
|
147
|
+
:return: The corpus-level GLEU score.
|
|
148
|
+
:rtype: float
|
|
149
|
+
"""
|
|
150
|
+
# sanity check
|
|
151
|
+
assert len(list_of_references) == len(hypotheses), "The number of hypotheses and their reference(s) should be the same"
|
|
152
|
+
|
|
153
|
+
# sum matches and max-token-lengths over all sentences
|
|
154
|
+
corpus_n_match = 0
|
|
155
|
+
corpus_n_all = 0
|
|
156
|
+
|
|
157
|
+
for references, hypothesis in zip(list_of_references, hypotheses):
|
|
158
|
+
hyp_ngrams = Counter(everygrams(hypothesis, min_len, max_len))
|
|
159
|
+
tpfp = sum(hyp_ngrams.values()) # True positives + False positives.
|
|
160
|
+
|
|
161
|
+
hyp_counts = []
|
|
162
|
+
for reference in references:
|
|
163
|
+
ref_ngrams = Counter(everygrams(reference, min_len, max_len))
|
|
164
|
+
tpfn = sum(ref_ngrams.values()) # True positives + False negatives.
|
|
165
|
+
|
|
166
|
+
overlap_ngrams = ref_ngrams & hyp_ngrams
|
|
167
|
+
tp = sum(overlap_ngrams.values()) # True positives.
|
|
168
|
+
|
|
169
|
+
# While GLEU is defined as the minimum of precision and
|
|
170
|
+
# recall, we can reduce the number of division operations by one by
|
|
171
|
+
# instead finding the maximum of the denominators for the precision
|
|
172
|
+
# and recall formulae, since the numerators are the same:
|
|
173
|
+
# precision = tp / tpfp
|
|
174
|
+
# recall = tp / tpfn
|
|
175
|
+
# gleu_score = min(precision, recall) == tp / max(tpfp, tpfn)
|
|
176
|
+
n_all = max(tpfp, tpfn)
|
|
177
|
+
|
|
178
|
+
if n_all > 0:
|
|
179
|
+
hyp_counts.append((tp, n_all))
|
|
180
|
+
|
|
181
|
+
# use the reference yielding the highest score
|
|
182
|
+
if hyp_counts:
|
|
183
|
+
n_match, n_all = max(hyp_counts, key=lambda hc: hc[0]/hc[1])
|
|
184
|
+
corpus_n_match += n_match
|
|
185
|
+
corpus_n_all += n_all
|
|
186
|
+
|
|
187
|
+
# corner case: empty corpus or empty references---don't divide by zero!
|
|
188
|
+
if corpus_n_all == 0:
|
|
189
|
+
gleu_score = 0.0
|
|
190
|
+
else:
|
|
191
|
+
gleu_score = corpus_n_match / corpus_n_all
|
|
192
|
+
|
|
193
|
+
return gleu_score
|
|
@@ -15,16 +15,25 @@
|
|
|
15
15
|
"""
|
|
16
16
|
Lexical translation model that ignores word order.
|
|
17
17
|
|
|
18
|
-
In IBM Model 1, word order is ignored for simplicity.
|
|
19
|
-
|
|
18
|
+
In IBM Model 1, word order is ignored for simplicity. As long as the
|
|
19
|
+
word alignments are equivalent, it doesn't matter where the word occurs
|
|
20
|
+
in the source or target sentence. Thus, the following three alignments
|
|
21
|
+
are equally likely.
|
|
20
22
|
|
|
21
23
|
Source: je mange du jambon
|
|
22
24
|
Target: i eat some ham
|
|
23
|
-
Alignment: (1,1) (2,2) (3,3)
|
|
25
|
+
Alignment: (0,0) (1,1) (2,2) (3,3)
|
|
24
26
|
|
|
25
27
|
Source: je mange du jambon
|
|
26
28
|
Target: some ham eat i
|
|
27
|
-
Alignment: (
|
|
29
|
+
Alignment: (0,2) (1,3) (2,1) (3,1)
|
|
30
|
+
|
|
31
|
+
Source: du jambon je mange
|
|
32
|
+
Target: eat i some ham
|
|
33
|
+
Alignment: (0,3) (1,2) (2,0) (3,1)
|
|
34
|
+
|
|
35
|
+
Note that an alignment is represented here as
|
|
36
|
+
(word_index_in_target, word_index_in_source).
|
|
28
37
|
|
|
29
38
|
The EM algorithm used in Model 1 is:
|
|
30
39
|
E step - In the training data, count how many times a source language
|
|
@@ -130,7 +139,7 @@ class IBMModel1(IBMModel):
|
|
|
130
139
|
for n in range(0, iterations):
|
|
131
140
|
self.train(sentence_aligned_corpus)
|
|
132
141
|
|
|
133
|
-
self.
|
|
142
|
+
self.align_all(sentence_aligned_corpus)
|
|
134
143
|
|
|
135
144
|
def set_uniform_probabilities(self, sentence_aligned_corpus):
|
|
136
145
|
initial_prob = 1 / len(self.trg_vocab)
|
|
@@ -205,11 +214,11 @@ class IBMModel1(IBMModel):
|
|
|
205
214
|
|
|
206
215
|
return max(prob, IBMModel.MIN_PROB)
|
|
207
216
|
|
|
208
|
-
def
|
|
217
|
+
def align_all(self, parallel_corpus):
|
|
209
218
|
for sentence_pair in parallel_corpus:
|
|
210
|
-
self.
|
|
219
|
+
self.align(sentence_pair)
|
|
211
220
|
|
|
212
|
-
def
|
|
221
|
+
def align(self, sentence_pair):
|
|
213
222
|
"""
|
|
214
223
|
Determines the best word alignment for one sentence pair from
|
|
215
224
|
the corpus that the model was trained on.
|
|
@@ -136,7 +136,7 @@ class IBMModel2(IBMModel):
|
|
|
136
136
|
for n in range(0, iterations):
|
|
137
137
|
self.train(sentence_aligned_corpus)
|
|
138
138
|
|
|
139
|
-
self.
|
|
139
|
+
self.align_all(sentence_aligned_corpus)
|
|
140
140
|
|
|
141
141
|
def set_uniform_probabilities(self, sentence_aligned_corpus):
|
|
142
142
|
# a(i | j,l,m) = 1 / (l+1) for all i, j, l, m
|
|
@@ -245,11 +245,11 @@ class IBMModel2(IBMModel):
|
|
|
245
245
|
|
|
246
246
|
return max(prob, IBMModel.MIN_PROB)
|
|
247
247
|
|
|
248
|
-
def
|
|
248
|
+
def align_all(self, parallel_corpus):
|
|
249
249
|
for sentence_pair in parallel_corpus:
|
|
250
|
-
self.
|
|
250
|
+
self.align(sentence_pair)
|
|
251
251
|
|
|
252
|
-
def
|
|
252
|
+
def align(self, sentence_pair):
|
|
253
253
|
"""
|
|
254
254
|
Determines the best word alignment for one sentence pair from
|
|
255
255
|
the corpus that the model was trained on.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
# Natural Language Toolkit: IBM Model 4
|
|
3
3
|
#
|
|
4
|
-
# Copyright (C) 2001-
|
|
4
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
5
5
|
# Author: Tah Wei Hoon <hoon.tw@gmail.com>
|
|
6
6
|
# URL: <http://nltk.org/>
|
|
7
7
|
# For license information, see LICENSE.TXT
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
# Natural Language Toolkit: IBM Model 5
|
|
3
3
|
#
|
|
4
|
-
# Copyright (C) 2001-
|
|
4
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
5
5
|
# Author: Tah Wei Hoon <hoon.tw@gmail.com>
|
|
6
6
|
# URL: <http://nltk.org/>
|
|
7
7
|
# For license information, see LICENSE.TXT
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# -*- coding: utf-8 -*-
|
|
2
2
|
# Natural Language Toolkit: IBM Model Core
|
|
3
3
|
#
|
|
4
|
-
# Copyright (C) 2001-
|
|
4
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
5
5
|
# Author: Tah Wei Hoon <hoon.tw@gmail.com>
|
|
6
6
|
# URL: <http://nltk.org/>
|
|
7
7
|
# For license information, see LICENSE.TXT
|
|
@@ -496,6 +496,9 @@ class AlignmentInfo(object):
|
|
|
496
496
|
def __eq__(self, other):
|
|
497
497
|
return self.alignment == other.alignment
|
|
498
498
|
|
|
499
|
+
def __ne__(self, other):
|
|
500
|
+
return not self == other
|
|
501
|
+
|
|
499
502
|
def __hash__(self):
|
|
500
503
|
return hash(self.alignment)
|
|
501
504
|
|