nltk 3.2.1__zip → 3.3__zip
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {nltk-3.2.1 → nltk-3.3}/LICENSE.txt +1 -1
- {nltk-3.2.1/nltk.egg-info → nltk-3.3}/PKG-INFO +13 -5
- nltk-3.3/README.md +49 -0
- nltk-3.3/nltk/VERSION +1 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/__init__.py +3 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/app/__init__.py +2 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/app/chartparser_app.py +92 -92
- {nltk-3.2.1 → nltk-3.3}/nltk/app/chunkparser_app.py +11 -13
- {nltk-3.2.1 → nltk-3.3}/nltk/app/collocations_app.py +8 -11
- {nltk-3.2.1 → nltk-3.3}/nltk/app/concordance_app.py +9 -11
- {nltk-3.2.1 → nltk-3.3}/nltk/app/nemo_app.py +18 -17
- {nltk-3.2.1 → nltk-3.3}/nltk/app/rdparser_app.py +10 -12
- {nltk-3.2.1 → nltk-3.3}/nltk/app/srparser_app.py +16 -16
- {nltk-3.2.1 → nltk-3.3}/nltk/app/wordfreq_app.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/app/wordnet_app.py +11 -11
- {nltk-3.2.1 → nltk-3.3}/nltk/book.py +2 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/ccg/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/ccg/api.py +67 -47
- {nltk-3.2.1 → nltk-3.3}/nltk/ccg/chart.py +7 -5
- {nltk-3.2.1 → nltk-3.3}/nltk/ccg/combinator.py +42 -11
- {nltk-3.2.1 → nltk-3.3}/nltk/ccg/lexicon.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/ccg/logic.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/chat/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/chat/eliza.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/chat/iesha.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/chat/rude.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/chat/suntsu.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/chat/util.py +12 -10
- {nltk-3.2.1 → nltk-3.3}/nltk/chat/zen.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/chunk/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/chunk/api.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/chunk/named_entity.py +13 -13
- {nltk-3.2.1 → nltk-3.3}/nltk/chunk/regexp.py +9 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/chunk/util.py +12 -12
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/api.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/decisiontree.py +18 -18
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/maxent.py +26 -8
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/megam.py +5 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/naivebayes.py +29 -26
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/rte_classify.py +58 -89
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/scikitlearn.py +4 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/senna.py +24 -22
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/svm.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/tadm.py +4 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/textcat.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/util.py +13 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/weka.py +7 -6
- {nltk-3.2.1 → nltk-3.3}/nltk/cluster/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/cluster/api.py +9 -5
- {nltk-3.2.1 → nltk-3.3}/nltk/cluster/em.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/cluster/gaac.py +3 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/cluster/kmeans.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/cluster/util.py +35 -20
- nltk-3.3/nltk/collections.py +640 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/collocations.py +2 -2
- nltk-3.3/nltk/compat.py +365 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/__init__.py +37 -16
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/europarl_raw.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/__init__.py +4 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/aligned.py +4 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/api.py +12 -10
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/bnc.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/bracket_parse.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/categorized_sents.py +4 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/chasen.py +5 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/childes.py +8 -9
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/chunked.py +4 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/cmudict.py +4 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/comparative_sents.py +4 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/conll.py +19 -12
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/crubadan.py +2 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/dependency.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/framenet.py +1085 -119
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/ieer.py +4 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/indian.py +4 -5
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/ipipan.py +6 -5
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/knbc.py +2 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/lin.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/mte.py +5 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/nkjp.py +4 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/nombank.py +8 -8
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/nps_chat.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/opinion_lexicon.py +3 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/panlex_lite.py +1 -1
- nltk-3.3/nltk/corpus/reader/pl196x.py +292 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/plaintext.py +3 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/ppattach.py +4 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/propbank.py +8 -10
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/pros_cons.py +5 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/reviews.py +3 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/rte.py +5 -7
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/semcor.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/senseval.py +4 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/sentiwordnet.py +3 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/sinica_treebank.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/string_category.py +4 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/switchboard.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/tagged.py +4 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/timit.py +10 -8
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/toolbox.py +4 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/twitter.py +4 -6
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/util.py +7 -3
- nltk-3.3/nltk/corpus/reader/verbnet.py +595 -0
- nltk-3.3/nltk/corpus/reader/wordlist.py +134 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/wordnet.py +357 -285
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/xmldocs.py +10 -5
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/ycoe.py +25 -24
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/util.py +22 -5
- {nltk-3.2.1 → nltk-3.3}/nltk/data.py +65 -29
- {nltk-3.2.1 → nltk-3.3}/nltk/decorators.py +5 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/downloader.py +59 -55
- {nltk-3.2.1 → nltk-3.3}/nltk/draw/__init__.py +4 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/draw/cfg.py +5 -8
- {nltk-3.2.1 → nltk-3.3}/nltk/draw/dispersion.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/draw/table.py +4 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/draw/tree.py +2 -5
- {nltk-3.2.1 → nltk-3.3}/nltk/draw/util.py +17 -17
- {nltk-3.2.1 → nltk-3.3}/nltk/featstruct.py +290 -173
- {nltk-3.2.1 → nltk-3.3}/nltk/grammar.py +87 -44
- {nltk-3.2.1 → nltk-3.3}/nltk/help.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/inference/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/inference/api.py +27 -19
- {nltk-3.2.1 → nltk-3.3}/nltk/inference/discourse.py +20 -16
- {nltk-3.2.1 → nltk-3.3}/nltk/inference/nonmonotonic.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/inference/prover9.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/inference/resolution.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/inference/tableau.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/internals.py +44 -44
- {nltk-3.2.1 → nltk-3.3}/nltk/jsontags.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/metrics/__init__.py +2 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/metrics/agreement.py +29 -9
- nltk-3.3/nltk/metrics/aline.py +607 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/metrics/association.py +8 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/metrics/confusionmatrix.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/metrics/distance.py +12 -7
- {nltk-3.2.1 → nltk-3.3}/nltk/metrics/paice.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/metrics/scores.py +7 -7
- {nltk-3.2.1 → nltk-3.3}/nltk/metrics/segmentation.py +4 -5
- {nltk-3.2.1 → nltk-3.3}/nltk/metrics/spearman.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/misc/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/misc/chomsky.py +4 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/misc/minimalset.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/misc/sort.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/misc/wordfinder.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/__init__.py +2 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/api.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/bllip.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/chart.py +8 -7
- nltk-3.3/nltk/parse/corenlp.py +780 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/dependencygraph.py +4 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/earleychart.py +4 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/evaluate.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/featurechart.py +6 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/generate.py +15 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/malt.py +2 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/nonprojectivedependencyparser.py +3 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/pchart.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/projectivedependencyparser.py +6 -5
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/recursivedescent.py +2 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/shiftreduce.py +2 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/stanford.py +53 -28
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/transitionparser.py +11 -9
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/util.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/parse/viterbi.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/probability.py +75 -20
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/boxer.py +15 -15
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/chat80.py +6 -6
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/cooper_storage.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/drt.py +9 -8
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/drt_glue_demo.py +5 -9
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/evaluate.py +9 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/glue.py +8 -6
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/hole.py +4 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/lfg.py +4 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/linearlogic.py +4 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/logic.py +14 -14
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/relextract.py +11 -18
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/skolemize.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/sem/util.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/sentiment/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/sentiment/sentiment_analyzer.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/sentiment/util.py +14 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/sentiment/vader.py +41 -42
- {nltk-3.2.1 → nltk-3.3}/nltk/stem/__init__.py +1 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/stem/api.py +7 -4
- nltk-3.3/nltk/stem/arlstem.py +369 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/stem/isri.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/stem/lancaster.py +39 -12
- nltk-3.3/nltk/stem/porter.py +710 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/stem/regexp.py +2 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/stem/rslp.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/stem/snowball.py +537 -13
- {nltk-3.2.1 → nltk-3.3}/nltk/stem/util.py +11 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/stem/wordnet.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/__init__.py +32 -7
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/api.py +13 -8
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/brill.py +4 -6
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/crf.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/hmm.py +11 -11
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/hunpos.py +4 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/mapping.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/perceptron.py +25 -10
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/senna.py +25 -23
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/sequential.py +19 -15
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/stanford.py +59 -36
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/tnt.py +11 -20
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/util.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/tbl/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/tbl/demo.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/tbl/erroranalysis.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/tbl/feature.py +5 -7
- {nltk-3.2.1 → nltk-3.3}/nltk/tbl/rule.py +6 -6
- {nltk-3.2.1 → nltk-3.3}/nltk/tbl/template.py +18 -23
- {nltk-3.2.1 → nltk-3.3}/nltk/test/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/all.py +7 -6
- {nltk-3.2.1 → nltk-3.3}/nltk/test/bnc.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/ccg.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/ccg_semantics.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/chat80.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/childes_fixt.py +1 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/chunk.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/classify.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/classify_fixt.py +2 -1
- nltk-3.3/nltk/test/collections.doctest +20 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/collocations.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/compat.doctest +0 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/test/compat_fixt.py +1 -0
- nltk-3.3/nltk/test/concordance.doctest +55 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/corpus.doctest +38 -49
- {nltk-3.2.1 → nltk-3.3}/nltk/test/crubadan.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/data.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/dependency.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/discourse.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/discourse_fixt.py +1 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/doctest_nose_plugin.py +8 -5
- {nltk-3.2.1 → nltk-3.3}/nltk/test/drt.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/featgram.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/featstruct.doctest +2 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/test/framenet.doctest +82 -33
- {nltk-3.2.1 → nltk-3.3}/nltk/test/generate.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/gensim.doctest +6 -7
- {nltk-3.2.1 → nltk-3.3}/nltk/test/gensim_fixt.py +1 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/gluesemantics.doctest +13 -15
- {nltk-3.2.1 → nltk-3.3}/nltk/test/gluesemantics_malt.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/gluesemantics_malt_fixt.py +1 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/grammar.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/grammartestsuites.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/index.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/inference.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/inference_fixt.py +1 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/internals.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/japanese.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/logic.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/metrics.doctest +3 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/test/misc.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/nonmonotonic.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/nonmonotonic_fixt.py +1 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/parse.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/portuguese_en.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/probability.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/probability_fixt.py +2 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/propbank.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/relextract.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/resolution.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/runtests.py +35 -13
- {nltk-3.2.1 → nltk-3.3}/nltk/test/semantics.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/sentiment.doctest +3 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/test/sentiwordnet.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/simple.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/stem.doctest +2 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/test/tag.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/tokenize.doctest +109 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/test/toolbox.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/translate.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/tree.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/treeprettyprinter.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/treetransforms.doctest +1 -1
- nltk-3.3/nltk/test/unit/test_aline.py +52 -0
- nltk-3.3/nltk/test/unit/test_chunk.py +56 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_classify.py +20 -18
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_collocations.py +16 -7
- nltk-3.3/nltk/test/unit/test_concordance.py +98 -0
- nltk-3.3/nltk/test/unit/test_corenlp.py +1000 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_corpora.py +18 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_json2csv_corpus.py +4 -3
- nltk-3.3/nltk/test/unit/test_rte_classify.py +86 -0
- nltk-3.3/nltk/test/unit/test_senna.py +74 -0
- nltk-3.3/nltk/test/unit/test_stem.py +121 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_tgrep.py +4 -2
- nltk-3.3/nltk/test/unit/test_tokenize.py +168 -0
- nltk-3.3/nltk/test/unit/test_wordnet.py +134 -0
- nltk-3.3/nltk/test/unit/translate/test_bleu.py +244 -0
- nltk-3.3/nltk/test/unit/translate/test_gdfa.py +57 -0
- nltk-3.3/nltk/test/unit/translate/test_nist.py +37 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/translate/test_stack_decoder.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/util.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/wordnet.doctest +17 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/test/wordnet_fixt.py +1 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/wordnet_lch.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/test/wsd.doctest +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/text.py +92 -39
- {nltk-3.2.1 → nltk-3.3}/nltk/tgrep.py +8 -7
- {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/__init__.py +37 -15
- {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/api.py +3 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/casual.py +10 -9
- {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/mwe.py +2 -2
- nltk-3.3/nltk/tokenize/nist.py +173 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/punkt.py +186 -167
- {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/regexp.py +13 -7
- nltk-3.3/nltk/tokenize/repp.py +151 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/sexpr.py +4 -6
- {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/simple.py +7 -5
- {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/stanford.py +18 -14
- nltk-3.3/nltk/tokenize/stanford_segmenter.py +246 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/tokenize/texttiling.py +43 -45
- nltk-3.3/nltk/tokenize/toktok.py +155 -0
- nltk-3.3/nltk/tokenize/treebank.py +363 -0
- nltk-3.3/nltk/tokenize/util.py +261 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/toolbox.py +4 -2
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/api.py +50 -40
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/bleu_score.py +221 -156
- nltk-3.3/nltk/translate/chrf_score.py +137 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/gale_church.py +32 -19
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/gdfa.py +14 -10
- nltk-3.3/nltk/translate/gleu_score.py +193 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/ibm1.py +17 -8
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/ibm2.py +4 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/ibm4.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/ibm5.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/ibm_model.py +4 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/metrics.py +1 -1
- nltk-3.3/nltk/translate/nist_score.py +178 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/phrase_based.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/ribes_score.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/stack_decoder.py +5 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/tree.py +10 -8
- {nltk-3.2.1 → nltk-3.3}/nltk/treeprettyprinter.py +6 -6
- {nltk-3.2.1 → nltk-3.3}/nltk/twitter/__init__.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/twitter/api.py +8 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/twitter/common.py +9 -3
- {nltk-3.2.1 → nltk-3.3}/nltk/twitter/twitter_demo.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/twitter/twitterclient.py +1 -1
- {nltk-3.2.1 → nltk-3.3}/nltk/twitter/util.py +5 -4
- {nltk-3.2.1 → nltk-3.3}/nltk/util.py +41 -654
- {nltk-3.2.1 → nltk-3.3}/nltk/wsd.py +2 -2
- {nltk-3.2.1 → nltk-3.3/nltk.egg-info}/PKG-INFO +13 -5
- {nltk-3.2.1 → nltk-3.3}/nltk.egg-info/SOURCES.txt +23 -1
- nltk-3.3/nltk.egg-info/requires.txt +31 -0
- {nltk-3.2.1 → nltk-3.3}/setup.cfg +0 -1
- {nltk-3.2.1 → nltk-3.3}/setup.py +32 -5
- nltk-3.2.1/nltk/VERSION +0 -1
- nltk-3.2.1/nltk/compat.py +0 -706
- nltk-3.2.1/nltk/corpus/reader/pl196x.py +0 -278
- nltk-3.2.1/nltk/corpus/reader/verbnet.py +0 -408
- nltk-3.2.1/nltk/corpus/reader/wordlist.py +0 -37
- nltk-3.2.1/nltk/six.py +0 -868
- nltk-3.2.1/nltk/stem/porter.py +0 -692
- nltk-3.2.1/nltk/test/unit/test_stem.py +0 -36
- nltk-3.2.1/nltk/test/unit/test_tokenize.py +0 -23
- nltk-3.2.1/nltk/test/unit/translate/test_bleu.py +0 -138
- nltk-3.2.1/nltk/tokenize/stanford_segmenter.py +0 -157
- nltk-3.2.1/nltk/tokenize/treebank.py +0 -124
- nltk-3.2.1/nltk/tokenize/util.py +0 -90
- {nltk-3.2.1 → nltk-3.3}/INSTALL.txt +0 -0
- {nltk-3.2.1 → nltk-3.3}/MANIFEST.in +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/classify/positivenaivebayes.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/corpus/reader/udhr.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/inference/mace.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/lazyimport.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/misc/babelfish.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/tag/brill_trainer.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/tbl/api.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/bleu.doctest +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/childes.doctest +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/corpus_fixt.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/paice.doctest +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/portuguese_en_fixt.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/segmentation_fixt.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/semantics_fixt.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/translate_fixt.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/__init__.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_2x_compat.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_corpus_views.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_hmm.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_naivebayes.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_seekable_unicode_stream_reader.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_tag.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/test_twitter_auth.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/translate/__init__.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/translate/test_ibm1.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/translate/test_ibm2.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/translate/test_ibm3.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/translate/test_ibm4.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/translate/test_ibm5.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/translate/test_ibm_model.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/test/unit/utils.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/translate/ibm3.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk/treetransforms.py +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk.egg-info/dependency_links.txt +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk.egg-info/not-zip-safe +0 -0
- {nltk-3.2.1 → nltk-3.3}/nltk.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Natural Language Toolkit: Stemmers
|
|
2
2
|
#
|
|
3
|
-
# Copyright (C) 2001-
|
|
3
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
4
4
|
# Author: Trevor Cohn <tacohn@cs.mu.oz.au>
|
|
5
5
|
# Edward Loper <edloper@gmail.com>
|
|
6
6
|
# Steven Bird <stevenbird1@gmail.com>
|
|
@@ -54,7 +54,7 @@ class RegexpStemmer(StemmerI):
|
|
|
54
54
|
return self._regexp.sub('', word)
|
|
55
55
|
|
|
56
56
|
def __repr__(self):
|
|
57
|
-
return '<RegexpStemmer:
|
|
57
|
+
return '<RegexpStemmer: {!r}>'.format(self._regexp.pattern)
|
|
58
58
|
|
|
59
59
|
|
|
60
60
|
|
|
@@ -2,10 +2,15 @@
|
|
|
2
2
|
#
|
|
3
3
|
# Natural Language Toolkit: Snowball Stemmer
|
|
4
4
|
#
|
|
5
|
-
# Copyright (C) 2001-
|
|
5
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
6
6
|
# Author: Peter Michael Stahl <pemistahl@gmail.com>
|
|
7
7
|
# Peter Ljunglof <peter.ljunglof@heatherleaf.se> (revisions)
|
|
8
|
+
# Lakhdar Benzahia <lakhdar.benzahia@gmail.com> (co-writer)
|
|
9
|
+
# Assem Chelli <assem.ch@gmail.com> (reviewer arabicstemmer)
|
|
10
|
+
# Abdelkrim Aries <ab_aries@esi.dz> (reviewer arabicstemmer)
|
|
8
11
|
# Algorithms: Dr Martin Porter <martin@tartarus.org>
|
|
12
|
+
# Assem Chelli <assem.ch@gmail.com> arabic stemming algorithm
|
|
13
|
+
# Benzahia Lakhdar <lakhdar.benzahia@gmail.com>
|
|
9
14
|
# URL: <http://nltk.org/>
|
|
10
15
|
# For license information, see LICENSE.TXT
|
|
11
16
|
|
|
@@ -20,10 +25,13 @@ There is also a demo function: `snowball.demo()`.
|
|
|
20
25
|
"""
|
|
21
26
|
from __future__ import unicode_literals, print_function
|
|
22
27
|
|
|
28
|
+
from six.moves import input
|
|
29
|
+
import re
|
|
30
|
+
|
|
23
31
|
from nltk import compat
|
|
24
32
|
from nltk.corpus import stopwords
|
|
25
33
|
from nltk.stem import porter
|
|
26
|
-
from nltk.stem.util import suffix_replace
|
|
34
|
+
from nltk.stem.util import suffix_replace, prefix_replace
|
|
27
35
|
|
|
28
36
|
from nltk.stem.api import StemmerI
|
|
29
37
|
|
|
@@ -34,7 +42,7 @@ class SnowballStemmer(StemmerI):
|
|
|
34
42
|
Snowball Stemmer
|
|
35
43
|
|
|
36
44
|
The following languages are supported:
|
|
37
|
-
Danish, Dutch, English, Finnish, French, German,
|
|
45
|
+
Arabic, Danish, Dutch, English, Finnish, French, German,
|
|
38
46
|
Hungarian, Italian, Norwegian, Portuguese, Romanian, Russian,
|
|
39
47
|
Spanish and Swedish.
|
|
40
48
|
|
|
@@ -53,7 +61,7 @@ class SnowballStemmer(StemmerI):
|
|
|
53
61
|
|
|
54
62
|
>>> from nltk.stem import SnowballStemmer
|
|
55
63
|
>>> print(" ".join(SnowballStemmer.languages)) # See which languages are supported
|
|
56
|
-
danish dutch english finnish french german hungarian
|
|
64
|
+
arabic danish dutch english finnish french german hungarian
|
|
57
65
|
italian norwegian porter portuguese romanian russian
|
|
58
66
|
spanish swedish
|
|
59
67
|
>>> stemmer = SnowballStemmer("german") # Choose a language
|
|
@@ -79,17 +87,20 @@ class SnowballStemmer(StemmerI):
|
|
|
79
87
|
language, a ValueError is raised.
|
|
80
88
|
"""
|
|
81
89
|
|
|
82
|
-
languages = ("danish", "dutch", "english", "finnish", "french", "german",
|
|
90
|
+
languages = ("arabic", "danish", "dutch", "english", "finnish", "french", "german",
|
|
83
91
|
"hungarian", "italian", "norwegian", "porter", "portuguese",
|
|
84
92
|
"romanian", "russian", "spanish", "swedish")
|
|
85
93
|
|
|
86
94
|
def __init__(self, language, ignore_stopwords=False):
|
|
87
95
|
if language not in self.languages:
|
|
88
|
-
raise ValueError("The language '
|
|
96
|
+
raise ValueError("The language '{0}' is not supported.".format(language))
|
|
89
97
|
stemmerclass = globals()[language.capitalize() + "Stemmer"]
|
|
90
98
|
self.stemmer = stemmerclass(ignore_stopwords)
|
|
91
99
|
self.stem = self.stemmer.stem
|
|
92
100
|
self.stopwords = self.stemmer.stopwords
|
|
101
|
+
|
|
102
|
+
def stem(self, token):
|
|
103
|
+
return self.stemmer.stem(self, token)
|
|
93
104
|
|
|
94
105
|
|
|
95
106
|
@compat.python_2_unicode_compatible
|
|
@@ -120,15 +131,15 @@ class _LanguageSpecificStemmer(StemmerI):
|
|
|
120
131
|
for word in stopwords.words(language):
|
|
121
132
|
self.stopwords.add(word)
|
|
122
133
|
except IOError:
|
|
123
|
-
raise ValueError("
|
|
124
|
-
" 'ignore_stopwords' to 'False'."
|
|
134
|
+
raise ValueError("{!r} has no list of stopwords. Please set"
|
|
135
|
+
" 'ignore_stopwords' to 'False'.".format(self))
|
|
125
136
|
|
|
126
137
|
def __repr__(self):
|
|
127
138
|
"""
|
|
128
139
|
Print out the string representation of the respective class.
|
|
129
140
|
|
|
130
141
|
"""
|
|
131
|
-
return "
|
|
142
|
+
return "<{0}>".format(type(self).__name__)
|
|
132
143
|
|
|
133
144
|
|
|
134
145
|
class PorterStemmer(_LanguageSpecificStemmer, porter.PorterStemmer):
|
|
@@ -283,6 +294,520 @@ class _StandardStemmer(_LanguageSpecificStemmer):
|
|
|
283
294
|
|
|
284
295
|
return rv
|
|
285
296
|
|
|
297
|
+
class ArabicStemmer(_LanguageSpecificStemmer):
|
|
298
|
+
"""
|
|
299
|
+
https://github.com/snowballstem/snowball/blob/master/algorithms/arabic/stem_Unicode.sbl (Original Algorithm)
|
|
300
|
+
The Snowball Arabic light Stemmer
|
|
301
|
+
Algorithm : Assem Chelli
|
|
302
|
+
Abdelkrim Aries
|
|
303
|
+
Lakhdar Benzahia
|
|
304
|
+
Nltk Version Author : Lakhdar Benzahia
|
|
305
|
+
"""
|
|
306
|
+
# Normalize_pre stes
|
|
307
|
+
__vocalization = re.compile(r'[\u064b-\u064c-\u064d-\u064e-\u064f-\u0650-\u0651-\u0652]') # ً، ٌ، ٍ، َ، ُ، ِ، ّ، ْ
|
|
308
|
+
|
|
309
|
+
__kasheeda = re.compile(r'[\u0640]') # ـ tatweel/kasheeda
|
|
310
|
+
|
|
311
|
+
__arabic_punctuation_marks = re.compile(r'[\u060C-\u061B-\u061F]') # ؛ ، ؟
|
|
312
|
+
|
|
313
|
+
# Normalize_post
|
|
314
|
+
__last_hamzat = ('\u0623', '\u0625', '\u0622', '\u0624', '\u0626') # أ، إ، آ، ؤ، ئ
|
|
315
|
+
|
|
316
|
+
# normalize other hamza's
|
|
317
|
+
__initial_hamzat = re.compile(r'^[\u0622\u0623\u0625]') # أ، إ، آ
|
|
318
|
+
|
|
319
|
+
__waw_hamza = re.compile(r'[\u0624]') # ؤ
|
|
320
|
+
|
|
321
|
+
__yeh_hamza = re.compile(r'[\u0626]') # ئ
|
|
322
|
+
|
|
323
|
+
__alefat = re.compile(r'[\u0623\u0622\u0625]') # أ، إ، آ
|
|
324
|
+
|
|
325
|
+
# Checks
|
|
326
|
+
__checks1 = ('\u0643\u0627\u0644', '\u0628\u0627\u0644', # بال، كال
|
|
327
|
+
'\u0627\u0644', '\u0644\u0644' # لل، ال
|
|
328
|
+
)
|
|
329
|
+
|
|
330
|
+
__checks2 = ('\u0629', # ة
|
|
331
|
+
'\u0627\u062a' # female plural ات
|
|
332
|
+
)
|
|
333
|
+
|
|
334
|
+
# Suffixes
|
|
335
|
+
__suffix_noun_step1a = ('\u064a', '\u0643', '\u0647', # ي، ك، ه
|
|
336
|
+
'\u0646\u0627', '\u0643\u0645', '\u0647\u0627', '\u0647\u0646', '\u0647\u0645', # نا، كم، ها، هن، هم
|
|
337
|
+
'\u0643\u0645\u0627', '\u0647\u0645\u0627' # كما، هما
|
|
338
|
+
)
|
|
339
|
+
|
|
340
|
+
__suffix_noun_step1b = ('\u0646') # ن
|
|
341
|
+
|
|
342
|
+
__suffix_noun_step2a = ('\u0627', '\u064a', '\u0648') # ا، ي، و
|
|
343
|
+
|
|
344
|
+
__suffix_noun_step2b = ('\u0627\u062a') # ات
|
|
345
|
+
|
|
346
|
+
__suffix_noun_step2c1 = ('\u062a') # ت
|
|
347
|
+
|
|
348
|
+
__suffix_noun_step2c2 = ('\u0629') # ة
|
|
349
|
+
|
|
350
|
+
__suffix_noun_step3 = ('\u064a') # ي
|
|
351
|
+
|
|
352
|
+
__suffix_verb_step1 = ('\u0647', '\u0643', # ه، ك
|
|
353
|
+
'\u0646\u064a', '\u0646\u0627', '\u0647\u0627', '\u0647\u0645', # ني، نا، ها، هم
|
|
354
|
+
'\u0647\u0646', '\u0643\u0645', '\u0643\u0646', # هن، كم، كن
|
|
355
|
+
'\u0647\u0645\u0627', '\u0643\u0645\u0627', '\u0643\u0645\u0648' # هما، كما، كمو
|
|
356
|
+
)
|
|
357
|
+
|
|
358
|
+
__suffix_verb_step2a = ( '\u062a', '\u0627', '\u0646' , '\u064a', # ت، ا، ن، ي
|
|
359
|
+
'\u0646\u0627', '\u062a\u0627', '\u062a\u0646', # نا، تا، تن Past
|
|
360
|
+
'\u0627\u0646', '\u0648\u0646', '\u064a\u0646', # ان، هن، ين Present
|
|
361
|
+
'\u062a\u0645\u0627' # تما
|
|
362
|
+
)
|
|
363
|
+
|
|
364
|
+
__suffix_verb_step2b = ('\u0648\u0627','\u062a\u0645') # وا، تم
|
|
365
|
+
|
|
366
|
+
__suffix_verb_step2c = ('\u0648', # و
|
|
367
|
+
'\u062a\u0645\u0648' # تمو
|
|
368
|
+
)
|
|
369
|
+
|
|
370
|
+
__suffix_all_alef_maqsura = ('\u0649') # ى
|
|
371
|
+
|
|
372
|
+
# Prefixes
|
|
373
|
+
__prefix_step1 = ('\u0623', # أ
|
|
374
|
+
'\u0623\u0623', '\u0623\u0622', '\u0623\u0624', '\u0623\u0627', '\u0623\u0625', # أأ، أآ، أؤ، أا، أإ
|
|
375
|
+
)
|
|
376
|
+
|
|
377
|
+
__prefix_step2a = ('\u0641\u0627\u0644', '\u0648\u0627\u0644') # فال، وال
|
|
378
|
+
|
|
379
|
+
__prefix_step2b = ('\u0641', '\u0648') # ف، و
|
|
380
|
+
|
|
381
|
+
__prefix_step3a_noun = ('\u0627\u0644', '\u0644\u0644', # لل، ال
|
|
382
|
+
'\u0643\u0627\u0644', '\u0628\u0627\u0644', # بال، كال
|
|
383
|
+
)
|
|
384
|
+
|
|
385
|
+
__prefix_step3b_noun = ('\u0628', '\u0643', '\u0644', # ب، ك، ل
|
|
386
|
+
'\u0628\u0628', '\u0643\u0643' # بب، كك
|
|
387
|
+
)
|
|
388
|
+
|
|
389
|
+
__prefix_step3_verb = ('\u0633\u064a', '\u0633\u062a', '\u0633\u0646', '\u0633\u0623') # سي، ست، سن، سأ
|
|
390
|
+
|
|
391
|
+
__prefix_step4_verb = ('\u064a\u0633\u062a', '\u0646\u0633\u062a', '\u062a\u0633\u062a') # يست، نست، تست
|
|
392
|
+
|
|
393
|
+
# Suffixes added due to Conjugation Verbs
|
|
394
|
+
__conjugation_suffix_verb_1 = ('\u0647', '\u0643') # ه، ك
|
|
395
|
+
|
|
396
|
+
__conjugation_suffix_verb_2 = ('\u0646\u064a', '\u0646\u0627','\u0647\u0627', # ني، نا، ها
|
|
397
|
+
'\u0647\u0645', '\u0647\u0646', '\u0643\u0645', # هم، هن، كم
|
|
398
|
+
'\u0643\u0646' # كن
|
|
399
|
+
)
|
|
400
|
+
__conjugation_suffix_verb_3 = ('\u0647\u0645\u0627', '\u0643\u0645\u0627', '\u0643\u0645\u0648') # هما، كما، كمو
|
|
401
|
+
|
|
402
|
+
__conjugation_suffix_verb_4 = ('\u0627', '\u0646', '\u064a') # ا، ن، ي
|
|
403
|
+
|
|
404
|
+
__conjugation_suffix_verb_past = ('\u0646\u0627', '\u062a\u0627', '\u062a\u0646') # نا، تا، تن
|
|
405
|
+
|
|
406
|
+
__conjugation_suffix_verb_present = ('\u0627\u0646', '\u0648\u0646', '\u064a\u0646') # ان، ون، ين
|
|
407
|
+
|
|
408
|
+
# Suffixes added due to derivation Names
|
|
409
|
+
__conjugation_suffix_noun_1 = ('\u064a', '\u0643', '\u0647') # ي، ك، ه
|
|
410
|
+
|
|
411
|
+
__conjugation_suffix_noun_2 = ('\u0646\u0627', '\u0643\u0645', # نا، كم
|
|
412
|
+
'\u0647\u0627', '\u0647\u0646', '\u0647\u0645' # ها، هن، هم
|
|
413
|
+
)
|
|
414
|
+
|
|
415
|
+
__conjugation_suffix_noun_3 = ('\u0643\u0645\u0627', '\u0647\u0645\u0627') # كما، هما
|
|
416
|
+
|
|
417
|
+
# Prefixes added due to derivation Names
|
|
418
|
+
__prefixes1 = ('\u0648\u0627', '\u0641\u0627') # فا، وا
|
|
419
|
+
|
|
420
|
+
__articles_3len = ('\u0643\u0627\u0644', '\u0628\u0627\u0644') # بال كال
|
|
421
|
+
|
|
422
|
+
__articles_2len = ('\u0627\u0644', '\u0644\u0644') # ال لل
|
|
423
|
+
|
|
424
|
+
# Prepositions letters
|
|
425
|
+
__prepositions1 = ('\u0643', '\u0644') # ك، ل
|
|
426
|
+
__prepositions2 = ('\u0628\u0628', '\u0643\u0643') # بب، كك
|
|
427
|
+
|
|
428
|
+
is_verb = True
|
|
429
|
+
is_noun = True
|
|
430
|
+
is_defined = False
|
|
431
|
+
|
|
432
|
+
suffixes_verb_step1_success = False
|
|
433
|
+
suffix_verb_step2a_success = False
|
|
434
|
+
suffix_verb_step2b_success = False
|
|
435
|
+
suffix_noun_step2c2_success = False
|
|
436
|
+
suffix_noun_step1a_success = False
|
|
437
|
+
suffix_noun_step2a_success = False
|
|
438
|
+
suffix_noun_step2b_success = False
|
|
439
|
+
suffixe_noun_step1b_success = False
|
|
440
|
+
prefix_step2a_success = False
|
|
441
|
+
prefix_step3a_noun_success = False
|
|
442
|
+
prefix_step3b_noun_success = False
|
|
443
|
+
|
|
444
|
+
def __normalize_pre(self, token):
|
|
445
|
+
"""
|
|
446
|
+
:param token: string
|
|
447
|
+
:return: normalized token type string
|
|
448
|
+
"""
|
|
449
|
+
# strip diacritics
|
|
450
|
+
token = self.__vocalization.sub('', token)
|
|
451
|
+
#strip kasheeda
|
|
452
|
+
token = self.__kasheeda.sub('', token)
|
|
453
|
+
# strip punctuation marks
|
|
454
|
+
token = self.__arabic_punctuation_marks.sub('', token)
|
|
455
|
+
return token
|
|
456
|
+
|
|
457
|
+
def __normalize_post(self, token):
|
|
458
|
+
# normalize last hamza
|
|
459
|
+
for hamza in self.__last_hamzat:
|
|
460
|
+
if token.endswith(hamza):
|
|
461
|
+
token = suffix_replace(token, hamza, '\u0621')
|
|
462
|
+
break
|
|
463
|
+
# normalize other hamzat
|
|
464
|
+
token = self.__initial_hamzat.sub('\u0627', token)
|
|
465
|
+
token = self.__waw_hamza.sub('\u0648', token)
|
|
466
|
+
token = self.__yeh_hamza.sub('\u064a', token)
|
|
467
|
+
token = self.__alefat.sub('\u0627', token)
|
|
468
|
+
return token
|
|
469
|
+
|
|
470
|
+
def __checks_1(self, token):
|
|
471
|
+
for prefix in self.__checks1 :
|
|
472
|
+
if token.startswith(prefix):
|
|
473
|
+
if prefix in self.__articles_3len and len(token) > 4 :
|
|
474
|
+
self.is_noun = True
|
|
475
|
+
self.is_verb = False
|
|
476
|
+
self.is_defined = True
|
|
477
|
+
break
|
|
478
|
+
|
|
479
|
+
if prefix in self.__articles_2len and len(token) > 3 :
|
|
480
|
+
self.is_noun = True
|
|
481
|
+
self.is_verb = False
|
|
482
|
+
self.is_defined = True
|
|
483
|
+
break
|
|
484
|
+
|
|
485
|
+
def __checks_2(self, token):
|
|
486
|
+
for suffix in self.__checks2:
|
|
487
|
+
if token.endswith(suffix):
|
|
488
|
+
if suffix == '\u0629' and len(token) > 2:
|
|
489
|
+
self.is_noun = True
|
|
490
|
+
self.is_verb = False
|
|
491
|
+
break
|
|
492
|
+
|
|
493
|
+
if suffix == '\u0627\u062a' and len(token) > 3:
|
|
494
|
+
self.is_noun = True
|
|
495
|
+
self.is_verb = False
|
|
496
|
+
break
|
|
497
|
+
|
|
498
|
+
def __Suffix_Verb_Step1(self, token):
|
|
499
|
+
for suffix in self.__suffix_verb_step1:
|
|
500
|
+
if token.endswith(suffix):
|
|
501
|
+
if suffix in self.__conjugation_suffix_verb_1 and len(token) >= 4:
|
|
502
|
+
token = token[:-1]
|
|
503
|
+
self.suffixes_verb_step1_success = True
|
|
504
|
+
break
|
|
505
|
+
|
|
506
|
+
if suffix in self.__conjugation_suffix_verb_2 and len(token) >= 5:
|
|
507
|
+
token = token[:-2]
|
|
508
|
+
self.suffixes_verb_step1_success = True
|
|
509
|
+
break
|
|
510
|
+
|
|
511
|
+
if suffix in self.__conjugation_suffix_verb_3 and len(token) >= 6:
|
|
512
|
+
token = token[:-3]
|
|
513
|
+
self.suffixes_verb_step1_success = True
|
|
514
|
+
break
|
|
515
|
+
return token
|
|
516
|
+
|
|
517
|
+
def __Suffix_Verb_Step2a(self, token):
|
|
518
|
+
for suffix in self.__suffix_verb_step2a:
|
|
519
|
+
if token.endswith(suffix):
|
|
520
|
+
if suffix == '\u062a' and len(token) >= 4:
|
|
521
|
+
token = token[:-1]
|
|
522
|
+
self.suffix_verb_step2a_success = True
|
|
523
|
+
break
|
|
524
|
+
|
|
525
|
+
if suffix in self.__conjugation_suffix_verb_4 and len(token) >= 4:
|
|
526
|
+
token = token[:-1]
|
|
527
|
+
self.suffix_verb_step2a_success = True
|
|
528
|
+
break
|
|
529
|
+
|
|
530
|
+
if suffix in self.__conjugation_suffix_verb_past and len(token) >= 5:
|
|
531
|
+
token = token[:-2] # past
|
|
532
|
+
self.suffix_verb_step2a_success = True
|
|
533
|
+
break
|
|
534
|
+
|
|
535
|
+
if suffix in self.__conjugation_suffix_verb_present and len(token) > 5:
|
|
536
|
+
token = token[:-2] # present
|
|
537
|
+
self.suffix_verb_step2a_success = True
|
|
538
|
+
break
|
|
539
|
+
|
|
540
|
+
if suffix == '\u062a\u0645\u0627' and len(token) >= 6:
|
|
541
|
+
token = token[:-3]
|
|
542
|
+
self.suffix_verb_step2a_success = True
|
|
543
|
+
break
|
|
544
|
+
return token
|
|
545
|
+
|
|
546
|
+
def __Suffix_Verb_Step2c(self, token):
|
|
547
|
+
for suffix in self.__suffix_verb_step2c:
|
|
548
|
+
if token.endswith(suffix):
|
|
549
|
+
if suffix == '\u062a\u0645\u0648' and len(token) >= 6:
|
|
550
|
+
token = token[:-3]
|
|
551
|
+
break
|
|
552
|
+
|
|
553
|
+
if suffix == '\u0648' and len(token) >= 4:
|
|
554
|
+
token = token[:-1]
|
|
555
|
+
break
|
|
556
|
+
return token
|
|
557
|
+
|
|
558
|
+
def __Suffix_Verb_Step2b(self, token):
|
|
559
|
+
for suffix in self.__suffix_verb_step2b:
|
|
560
|
+
if token.endswith(suffix) and len(token) >= 5:
|
|
561
|
+
token = token[:-2]
|
|
562
|
+
self.suffix_verb_step2b_success = True
|
|
563
|
+
break
|
|
564
|
+
return token
|
|
565
|
+
|
|
566
|
+
def __Suffix_Noun_Step2c2(self, token):
|
|
567
|
+
for suffix in self.__suffix_noun_step2c2:
|
|
568
|
+
if token.endswith(suffix) and len(token) >= 3:
|
|
569
|
+
token = token[:-1]
|
|
570
|
+
self.suffix_noun_step2c2_success = True
|
|
571
|
+
break
|
|
572
|
+
return token
|
|
573
|
+
|
|
574
|
+
def __Suffix_Noun_Step1a(self, token):
|
|
575
|
+
for suffix in self.__suffix_noun_step1a:
|
|
576
|
+
if token.endswith(suffix):
|
|
577
|
+
if suffix in self.__conjugation_suffix_noun_1 and len(token) >= 4:
|
|
578
|
+
token = token[:-1]
|
|
579
|
+
self.suffix_noun_step1a_success = True
|
|
580
|
+
break
|
|
581
|
+
|
|
582
|
+
if suffix in self.__conjugation_suffix_noun_2 and len(token) >= 5:
|
|
583
|
+
token = token[:-2]
|
|
584
|
+
self.suffix_noun_step1a_success = True
|
|
585
|
+
break
|
|
586
|
+
|
|
587
|
+
if suffix in self.__conjugation_suffix_noun_3 and len(token) >= 6:
|
|
588
|
+
token = token[:-3]
|
|
589
|
+
self.suffix_noun_step1a_success = True
|
|
590
|
+
break
|
|
591
|
+
return token
|
|
592
|
+
|
|
593
|
+
def __Suffix_Noun_Step2a(self, token):
|
|
594
|
+
for suffix in self.__suffix_noun_step2a:
|
|
595
|
+
if token.endswith(suffix) and len(token) > 4:
|
|
596
|
+
token = token[:-1]
|
|
597
|
+
self.suffix_noun_step2a_success = True
|
|
598
|
+
break
|
|
599
|
+
return token
|
|
600
|
+
|
|
601
|
+
def __Suffix_Noun_Step2b(self, token):
|
|
602
|
+
for suffix in self.__suffix_noun_step2b:
|
|
603
|
+
if token.endswith(suffix) and len(token) >= 5:
|
|
604
|
+
token = token[:-2]
|
|
605
|
+
self.suffix_noun_step2b_success = True
|
|
606
|
+
break
|
|
607
|
+
return token
|
|
608
|
+
|
|
609
|
+
def __Suffix_Noun_Step2c1(self, token):
|
|
610
|
+
for suffix in self.__suffix_noun_step2c1:
|
|
611
|
+
if token.endswith(suffix) and len(token) >= 4:
|
|
612
|
+
token = token[:-1]
|
|
613
|
+
break
|
|
614
|
+
return token
|
|
615
|
+
|
|
616
|
+
def __Suffix_Noun_Step1b(self, token):
|
|
617
|
+
for suffix in self.__suffix_noun_step1b:
|
|
618
|
+
if token.endswith(suffix) and len(token) > 5:
|
|
619
|
+
token = token[:-1]
|
|
620
|
+
self.suffixe_noun_step1b_success = True
|
|
621
|
+
break
|
|
622
|
+
return token
|
|
623
|
+
|
|
624
|
+
def __Suffix_Noun_Step3(self, token):
|
|
625
|
+
for suffix in self.__suffix_noun_step3:
|
|
626
|
+
if token.endswith(suffix) and len(token) >= 3:
|
|
627
|
+
token = token[:-1] # ya' nisbiya
|
|
628
|
+
break
|
|
629
|
+
return token
|
|
630
|
+
|
|
631
|
+
def __Suffix_All_alef_maqsura(self, token):
|
|
632
|
+
for suffix in self.__suffix_all_alef_maqsura:
|
|
633
|
+
if token.endswith(suffix):
|
|
634
|
+
token = suffix_replace(token, suffix, '\u064a')
|
|
635
|
+
return token
|
|
636
|
+
|
|
637
|
+
def __Prefix_Step1(self, token):
|
|
638
|
+
for prefix in self.__prefix_step1:
|
|
639
|
+
if token.startswith(prefix) and len(token) > 3:
|
|
640
|
+
if prefix == '\u0623\u0623':
|
|
641
|
+
token = prefix_replace(token, prefix, '\u0623')
|
|
642
|
+
break
|
|
643
|
+
|
|
644
|
+
elif prefix == '\u0623\u0622':
|
|
645
|
+
token = prefix_replace(token, prefix, '\u0622')
|
|
646
|
+
break
|
|
647
|
+
|
|
648
|
+
elif prefix == '\u0623\u0624':
|
|
649
|
+
token = prefix_replace(token, prefix, '\u0624')
|
|
650
|
+
break
|
|
651
|
+
|
|
652
|
+
elif prefix == '\u0623\u0627' :
|
|
653
|
+
token = prefix_replace(token, prefix, '\u0627')
|
|
654
|
+
break
|
|
655
|
+
|
|
656
|
+
elif prefix == '\u0623\u0625' :
|
|
657
|
+
token = prefix_replace(token, prefix, '\u0625')
|
|
658
|
+
break
|
|
659
|
+
return token
|
|
660
|
+
|
|
661
|
+
def __Prefix_Step2a(self, token):
|
|
662
|
+
for prefix in self.__prefix_step2a:
|
|
663
|
+
if token.startswith(prefix) and len(token) > 5:
|
|
664
|
+
token = token[len(prefix):]
|
|
665
|
+
self.prefix_step2a_success = True
|
|
666
|
+
break
|
|
667
|
+
return token
|
|
668
|
+
|
|
669
|
+
def __Prefix_Step2b(self, token):
|
|
670
|
+
for prefix in self.__prefix_step2b:
|
|
671
|
+
if token.startswith(prefix) and len(token) > 3 :
|
|
672
|
+
if token[:2] not in self.__prefixes1:
|
|
673
|
+
token = token[len(prefix):]
|
|
674
|
+
break
|
|
675
|
+
return token
|
|
676
|
+
|
|
677
|
+
def __Prefix_Step3a_Noun(self, token):
|
|
678
|
+
for prefix in self.__prefix_step3a_noun:
|
|
679
|
+
if token.startswith(prefix):
|
|
680
|
+
if prefix in self.__articles_2len and len(token) > 4:
|
|
681
|
+
token = token[len(prefix):]
|
|
682
|
+
self.prefix_step3a_noun_success = True
|
|
683
|
+
break
|
|
684
|
+
if prefix in self.__articles_3len and len(token) > 5:
|
|
685
|
+
token = token[len(prefix):]
|
|
686
|
+
break
|
|
687
|
+
return token
|
|
688
|
+
|
|
689
|
+
def __Prefix_Step3b_Noun(self, token):
|
|
690
|
+
for prefix in self.__prefix_step3b_noun:
|
|
691
|
+
if token.startswith(prefix):
|
|
692
|
+
if len(token) > 3:
|
|
693
|
+
if prefix == '\u0628':
|
|
694
|
+
token = token[len(prefix):]
|
|
695
|
+
self.prefix_step3b_noun_success = True
|
|
696
|
+
break
|
|
697
|
+
|
|
698
|
+
if prefix in self.__prepositions2:
|
|
699
|
+
token = prefix_replace(token, prefix, prefix[1])
|
|
700
|
+
self.prefix_step3b_noun_success = True
|
|
701
|
+
break
|
|
702
|
+
|
|
703
|
+
if prefix in self.__prepositions1 and len(token) > 4:
|
|
704
|
+
token = token[len(prefix):] # BUG: cause confusion
|
|
705
|
+
self.prefix_step3b_noun_success = True
|
|
706
|
+
break
|
|
707
|
+
return token
|
|
708
|
+
|
|
709
|
+
def __Prefix_Step3_Verb(self, token):
|
|
710
|
+
for prefix in self.__prefix_step3_verb:
|
|
711
|
+
if token.startswith(prefix) and len(token) > 4:
|
|
712
|
+
token = prefix_replace(token, prefix, prefix[1])
|
|
713
|
+
break
|
|
714
|
+
return token
|
|
715
|
+
|
|
716
|
+
def __Prefix_Step4_Verb(self, token):
|
|
717
|
+
for prefix in self.__prefix_step4_verb:
|
|
718
|
+
if token.startswith(prefix) and len(token) > 4:
|
|
719
|
+
token = prefix_replace(token, prefix, '\u0627\u0633\u062a')
|
|
720
|
+
self.is_verb = True
|
|
721
|
+
self.is_noun = False
|
|
722
|
+
break
|
|
723
|
+
return token
|
|
724
|
+
|
|
725
|
+
def stem(self, word):
|
|
726
|
+
"""
|
|
727
|
+
Stem an Arabic word and return the stemmed form.
|
|
728
|
+
:param word: string
|
|
729
|
+
:return: string
|
|
730
|
+
"""
|
|
731
|
+
# set initial values
|
|
732
|
+
self.is_verb = True
|
|
733
|
+
self.is_noun = True
|
|
734
|
+
self.is_defined = False
|
|
735
|
+
|
|
736
|
+
self.suffix_verb_step2a_success = False
|
|
737
|
+
self.suffix_verb_step2b_success = False
|
|
738
|
+
self.suffix_noun_step2c2_success = False
|
|
739
|
+
self.suffix_noun_step1a_success = False
|
|
740
|
+
self.suffix_noun_step2a_success = False
|
|
741
|
+
self.suffix_noun_step2b_success = False
|
|
742
|
+
self.suffixe_noun_step1b_success = False
|
|
743
|
+
self.prefix_step2a_success = False
|
|
744
|
+
self.prefix_step3a_noun_success = False
|
|
745
|
+
self.prefix_step3b_noun_success = False
|
|
746
|
+
|
|
747
|
+
modified_word = word
|
|
748
|
+
# guess type and properties
|
|
749
|
+
# checks1
|
|
750
|
+
self.__checks_1(modified_word)
|
|
751
|
+
# checks2
|
|
752
|
+
self.__checks_2(modified_word)
|
|
753
|
+
modified_word = self.__normalize_pre(modified_word)
|
|
754
|
+
if self.is_verb:
|
|
755
|
+
modified_word = self.__Suffix_Verb_Step1(modified_word)
|
|
756
|
+
if self.suffixes_verb_step1_success:
|
|
757
|
+
modified_word = self.__Suffix_Verb_Step2a(modified_word)
|
|
758
|
+
if not self.suffix_verb_step2a_success :
|
|
759
|
+
modified_word = self.__Suffix_Verb_Step2c(modified_word)
|
|
760
|
+
#or next
|
|
761
|
+
else:
|
|
762
|
+
modified_word = self.__Suffix_Verb_Step2b(modified_word)
|
|
763
|
+
if not self.suffix_verb_step2b_success:
|
|
764
|
+
modified_word = self.__Suffix_Verb_Step2a(modified_word)
|
|
765
|
+
if self.is_noun:
|
|
766
|
+
modified_word = self.__Suffix_Noun_Step2c2(modified_word)
|
|
767
|
+
if not self.suffix_noun_step2c2_success:
|
|
768
|
+
if not self.is_defined:
|
|
769
|
+
modified_word = self.__Suffix_Noun_Step1a(modified_word)
|
|
770
|
+
#if self.suffix_noun_step1a_success:
|
|
771
|
+
modified_word = self.__Suffix_Noun_Step2a(modified_word)
|
|
772
|
+
if not self.suffix_noun_step2a_success:
|
|
773
|
+
modified_word = self.__Suffix_Noun_Step2b(modified_word)
|
|
774
|
+
if not self.suffix_noun_step2b_success and not self.suffix_noun_step2a_success:
|
|
775
|
+
modified_word = self.__Suffix_Noun_Step2c1(modified_word)
|
|
776
|
+
# or next ? todo : how to deal with or next
|
|
777
|
+
else:
|
|
778
|
+
modified_word = self.__Suffix_Noun_Step1b(modified_word)
|
|
779
|
+
if self.suffixe_noun_step1b_success:
|
|
780
|
+
modified_word = self.__Suffix_Noun_Step2a(modified_word)
|
|
781
|
+
if not self.suffix_noun_step2a_success:
|
|
782
|
+
modified_word = self.__Suffix_Noun_Step2b(modified_word)
|
|
783
|
+
if not self.suffix_noun_step2b_success and not self.suffix_noun_step2a_success:
|
|
784
|
+
modified_word = self.__Suffix_Noun_Step2c1(modified_word)
|
|
785
|
+
else:
|
|
786
|
+
if not self.is_defined:
|
|
787
|
+
modified_word = self.__Suffix_Noun_Step2a(modified_word)
|
|
788
|
+
modified_word = self.__Suffix_Noun_Step2b(modified_word)
|
|
789
|
+
modified_word = self.__Suffix_Noun_Step3(modified_word)
|
|
790
|
+
if not self.is_noun and self.is_verb:
|
|
791
|
+
modified_word = self.__Suffix_All_alef_maqsura(modified_word)
|
|
792
|
+
|
|
793
|
+
# prefixes
|
|
794
|
+
modified_word = self.__Prefix_Step1(modified_word)
|
|
795
|
+
modified_word = self.__Prefix_Step2a(modified_word)
|
|
796
|
+
if not self.prefix_step2a_success:
|
|
797
|
+
modified_word = self.__Prefix_Step2b(modified_word)
|
|
798
|
+
modified_word = self.__Prefix_Step3a_Noun(modified_word)
|
|
799
|
+
if not self.prefix_step3a_noun_success and self.is_noun:
|
|
800
|
+
modified_word = self.__Prefix_Step3b_Noun(modified_word)
|
|
801
|
+
else:
|
|
802
|
+
if not self.prefix_step3b_noun_success and self.is_verb:
|
|
803
|
+
modified_word = self.__Prefix_Step3_Verb(modified_word)
|
|
804
|
+
modified_word = self.__Prefix_Step4_Verb(modified_word)
|
|
805
|
+
|
|
806
|
+
# post normalization stemming
|
|
807
|
+
modified_word = self.__normalize_post(modified_word)
|
|
808
|
+
stemmed_word = modified_word
|
|
809
|
+
return stemmed_word
|
|
810
|
+
|
|
286
811
|
class DanishStemmer(_ScandinavianStemmer):
|
|
287
812
|
|
|
288
813
|
"""
|
|
@@ -3653,7 +4178,8 @@ def demo():
|
|
|
3653
4178
|
import re
|
|
3654
4179
|
from nltk.corpus import udhr
|
|
3655
4180
|
|
|
3656
|
-
udhr_corpus = {"
|
|
4181
|
+
udhr_corpus = {"arabic": "Arabic_Alarabia-Arabic",
|
|
4182
|
+
"danish": "Danish_Dansk-Latin1",
|
|
3657
4183
|
"dutch": "Dutch_Nederlands-Latin1",
|
|
3658
4184
|
"english": "English-Latin1",
|
|
3659
4185
|
"finnish": "Finnish_Suomi-Latin1",
|
|
@@ -3677,7 +4203,7 @@ def demo():
|
|
|
3677
4203
|
|
|
3678
4204
|
while True:
|
|
3679
4205
|
|
|
3680
|
-
language =
|
|
4206
|
+
language = input("Please enter the name of the language " +
|
|
3681
4207
|
"to be demonstrated\n" +
|
|
3682
4208
|
"/".join(SnowballStemmer.languages) +
|
|
3683
4209
|
"\n" +
|
|
@@ -3708,5 +4234,3 @@ def demo():
|
|
|
3708
4234
|
print(stemmed)
|
|
3709
4235
|
print('-' * 70)
|
|
3710
4236
|
print("\n")
|
|
3711
|
-
|
|
3712
|
-
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Natural Language Toolkit: Stemmer Utilities
|
|
2
2
|
#
|
|
3
|
-
# Copyright (C) 2001-
|
|
3
|
+
# Copyright (C) 2001-2018 NLTK Project
|
|
4
4
|
# Author: Helder <he7d3r@gmail.com>
|
|
5
5
|
# URL: <http://nltk.org/>
|
|
6
6
|
# For license information, see LICENSE.TXT
|
|
@@ -10,3 +10,13 @@ def suffix_replace(original, old, new):
|
|
|
10
10
|
Replaces the old suffix of the original string by a new suffix
|
|
11
11
|
"""
|
|
12
12
|
return original[:-len(old)] + new
|
|
13
|
+
|
|
14
|
+
def prefix_replace(original, old, new):
|
|
15
|
+
"""
|
|
16
|
+
Replaces the old prefix of the original string by a new suffix
|
|
17
|
+
:param original: string
|
|
18
|
+
:param old: string
|
|
19
|
+
:param new: string
|
|
20
|
+
:return: string
|
|
21
|
+
"""
|
|
22
|
+
return new + original[len(old):]
|