commit 48b4b9ab474fd3ffb86bb92ef234120d6e499d96 Author: Michal Szczepanski Date: Sun Aug 11 00:49:44 2019 +0200 Let's drink diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..136b93c --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +# Python +__pycache__ +build +dist +prosecco.egg-info +*.pyc + +# OS +.DS_Store + +# IDE +*.iml diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7c84354 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +The MIT License + +Copyright (c) 2019 Michal Szczepanski (michal@vane.pl) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..f242d90 --- /dev/null +++ b/README.md @@ -0,0 +1,48 @@ +nlp_engine +==== + +## Description + +Short, flexible and extendable NLP engine that can produce list of features +from text based on provided condtions. +I use it for +- word categorisation +- feature extraction + +## Usage + +```bash +git clone prosecco +python example.py +``` + +```python +text = """Chrząszcz brzmi w trzcinie w Szczebrzeszynie. +Ząb zupa zębowa, dąb zupa dębowa. +Gdzie Rzym, gdzie Krym. W Pacanowie kozy kują. +Tak, jeśli mam szczęśliwy być, to w Gdańsku muszę żyć! +""" + +cities = ["szczebrzeszyn", "pacanow", "gdansk", "rzym", "krym"] +conditions = [] +# accept all +for city in cities: + conditions.append(Condition(lemma_type="city", + compare=city, + normalizer=CharsetNormalizer(Charset.PL_EN), + stemmer=WordStemmer(language="pl"), + lower=True)) +# accept all +conditions.append(Condition(compare=r".*")) + +tokenizer = LanguageTokenizer(Charset.PL) +tokens = tokenizer.tokenize(text) +visitor = Visitor(conditions=conditions) +lexer = Lexer(tokens=tokens, visitor=visitor) +lemmas = lexer.lex() +found_cities = filter(lambda l: l.type == 'city', lemmas) +print(" ".join(map(str, found_cities))) +``` + +## Output +`Szczebrzeszynie[city] Rzym[city] Krym[city] Pacanowie[city] Gdańsku[city]` diff --git a/data/pl/bye.txt b/data/pl/bye.txt new file mode 100644 index 0000000..7bca780 --- /dev/null +++ b/data/pl/bye.txt @@ -0,0 +1,23 @@ +Do widzenia +dowidzenia +Dobranoc +Dobrej nocy +Do usłyszenia +Narka +Narta +Na razie +Narazie +Pa pa +papa +papapa +pa +Do zobaczenia +Dozo +Do jutra +Trzymaj się +3m sie +3maj sie +trzym sie +Z Bogiem +żegnaj +zegnaj \ No newline at end of file diff --git a/data/pl/hi.txt b/data/pl/hi.txt new file mode 100644 index 0000000..d8b624e --- /dev/null +++ b/data/pl/hi.txt @@ -0,0 +1,53 @@ +Cześć +Czesc +Cesc +Czołem +Czolem +Dzień dobry +Dzien dobry +Dobry wieczór +Dobry wieczor +Witam +Witamy +Witaj +powitac +powitać +Piątka +Piąteczka +Przybij piątkę +Żółwik +Kopę lat +Graba +Grabula +Witka +Strzała +Strzala +Joł +Jol +Sie masz +Siema +Sie ma +Siemka +Siemano +Siemandero +Szczęść Boże +Wszelki duch Pana Boga chwali +Niech będzie pochwalony +Elo +Hej +Serwus +dobry +pochwalony +ściema +jema +hejo +hejka +hejolek +Dziń dybry +Cze +heej +awe +ave +puk puk +kuku +heloł \ No newline at end of file diff --git a/data/pl/prefix.txt b/data/pl/prefix.txt new file mode 100644 index 0000000..53e71ea --- /dev/null +++ b/data/pl/prefix.txt @@ -0,0 +1,47 @@ +a +amfi +an +arcy +bez +chloro +choreo +co +daleko +de +do +dwu +e +hipo +hura +hurra +hydroksy +inter +ko +mega +meta +na +nad +naj +neo +nie +o +ob +od +około +per +post +prawo +prze +przeciw +przy +radio +re +równo +roz +samo +u +wiki +wpół +wy +wz +ze diff --git a/data/pl/preposition.txt b/data/pl/preposition.txt new file mode 100644 index 0000000..73b4c02 --- /dev/null +++ b/data/pl/preposition.txt @@ -0,0 +1,45 @@ +albo +bądź +bez +co +czy +dla +do +jako +k +ku +lub +między +mimo +na +nad +nade +o +obok +od +per +po +pod +pode +poza +prze +przed +przede +przez +przy +s +ś +spoza +spod +śród +u +w +we +wraz +wśród +z +za +ze +zez +znad +zza \ No newline at end of file diff --git a/data/pl/pronoun.txt b/data/pl/pronoun.txt new file mode 100644 index 0000000..4161587 --- /dev/null +++ b/data/pl/pronoun.txt @@ -0,0 +1,298 @@ +ja +ty +on +ona +ono +my +wy +oni +one +mnie +mię +mi +mną +mnie +ciebie +cię +tobie +ci +tobą +jego +go +niego +jemu +mu +niemu +nim +jej +niej +ją +nią +nas +was +ich +nich +nimi +doń +zeń +nań +mój +twój +swój +mojego +mego +twojego +twego +swojego +swego +mojemu +memu +twojemu +twemu +swojemu +swemu +moim +mym +twoim +twym +swoim +swym +moja +ma +twoja +twa +swoja +swa +mojej +mej +twojej +twej +swojej +swej +moją +mą +twoją +twą +swoją +swą +moi +twoi +swoi +moje +me +twoje +twe +swoje +swe +moich +mych +twoich +twych +swoich +swych +moimi +mymi +twoimi +twymi +swoimi +swymi +nasz +wasz +naszego +waszego +naszemu +waszemu +naszym +waszym +nasza +wasza +naszej +waszej +naszą +waszą +nasze +wasze +naszego +waszego +nasi +wasi +naszymi +waszymi +naszych +waszych +czyj +niczyj +czyjego +niczyjego +czyjemu +niczyjemu +czyjego +niczyjego +czyim +niczyim +czyja +niczyja +czyjej +niczyjej +czyją +niczyją +czyje +niczyje +czyi +niczyi +czyich +niczyich +czyimi +niczyimi +czyjś +czyjemuś +czyjejś +czyjegoś +czyjkolwiek +czyjkomukolwiek +się +siebie +sobie +sobą +ten +tego +temu +tym +ta +tej +tą +tę +to +ci +te +tych +te +tymi +tamten +tamtego +tamtemu +tamtego +tamtym +tamta +tamtej +tamtą +tamto +tamtego +tamtemu +tamto +tamtym +tamci +tamte +tamtych +tamtym +tamtymi +tamtych +ów +owego +owemu +owym +owa +owej +ową +owo +owi +owe +owych +owymi +taki +takiego +takiemu +takim +taka +takiej +taką +takiej +takie +tacy +takich +takimi +tak +tu +tam +stąd +stamtąd +tędy +wtędy +kto +komu +kogo +kim +co +czego +czemu +czym +który +którego +któremu +którym +która +której +którą +które +którzy +których +którymi +jaki +jakiego +jakiemu +jakim +jakiej +jaką +jaka +jakie +jacy +jakich +jakimi +kiedy +gdzie +jak +którędy +skąd +dokąd +ile +każdy +każdego +każdemu +każdym +każda +każdej +każdą +każde +wszyscy +wszystkie +wszystkich +wszystkimi +wszystko +wszystkiego +wszystkiemu +wszystkim +nikt +nikogo +nikomu +nikim +nic +niczego +niczemu +niczym +żaden +żadna +żadne +żadni +żadnego +żadnej +żadnych +żadnemu +żadnym +żadną +żadną +żadnymi +nigdzie +nigdy +znikąd +donikąd +nijak \ No newline at end of file diff --git a/data/pl/stopwords.txt b/data/pl/stopwords.txt new file mode 100644 index 0000000..c92ecdd --- /dev/null +++ b/data/pl/stopwords.txt @@ -0,0 +1,344 @@ +i +a +albo +bądź +bez +co +czy +dla +do +jako +ku +lub +między +mimo +na +nad +nade +o +obok +od +per +po +pod +pode +poza +prze +przed +przede +przez +przy +s +ś +spoza +spod +śród +u +w +we +wraz +wśród +z +za +ze +zez +znad +zza +ja +ty +on +ona +ono +my +wy +oni +one +mnie +mię +mi +mną +mnie +ciebie +cię +tobie +ci +tobą +jego +go +niego +jemu +mu +niemu +nim +jej +niej +ją +nią +nas +was +ich +nich +nimi +doń +zeń +nań +mój +twój +swój +mojego +mego +twojego +twego +swojego +swego +mojemu +memu +twojemu +twemu +swojemu +swemu +moim +mym +twoim +twym +swoim +swym +moja +ma +twoja +twa +swoja +swa +mojej +mej +twojej +twej +swojej +swej +moją +mą +twoją +twą +swoją +swą +moi +twoi +swoi +moje +me +twoje +twe +swoje +swe +moich +mych +twoich +twych +swoich +swych +moimi +mymi +twoimi +twymi +swoimi +swymi +nasz +wasz +naszego +waszego +naszemu +waszemu +naszym +waszym +nasza +wasza +naszej +waszej +naszą +waszą +nasze +wasze +naszego +waszego +nasi +wasi +naszymi +waszymi +naszych +waszych +czyj +niczyj +czyjego +niczyjego +czyjemu +niczyjemu +czyjego +niczyjego +czyim +niczyim +czyja +niczyja +czyjej +niczyjej +czyją +niczyją +czyje +niczyje +czyi +niczyi +czyich +niczyich +czyimi +niczyimi +czyjś +czyjemuś +czyjejś +czyjegoś +czyjkolwiek +czyjkomukolwiek +się +siebie +sobie +sobą +ten +tego +temu +tym +ta +tej +tą +tę +to +ci +te +tych +te +tymi +tamten +tamtego +tamtemu +tamtego +tamtym +tamta +tamtej +tamtą +tamto +tamtego +tamtemu +tamto +tamtym +tamci +tamte +tamtych +tamtym +tamtymi +tamtych +ów +owego +owemu +owym +owa +owej +ową +owo +owi +owe +owych +owymi +taki +takiego +takiemu +takim +taka +takiej +taką +takiej +takie +tacy +takich +takimi +tak +tu +tam +stąd +stamtąd +tędy +wtędy +kto +komu +kogo +kim +co +czego +czemu +czym +który +którego +któremu +którym +która +której +którą +które +którzy +których +którymi +jaki +jakiego +jakiemu +jakim +jakiej +jaką +jaka +jakie +jacy +jakich +jakimi +kiedy +gdzie +jak +którędy +skąd +dokąd +ile +każdy +każdego +każdemu +każdym +każda +każdej +każdą +każde +wszyscy +wszystkie +wszystkich +wszystkimi +wszystko +wszystkiego +wszystkiemu +wszystkim +nikt +nikogo +nikomu +nikim +nic +niczego +niczemu +niczym +żaden +żadna +żadne +żadni +żadnego +żadnej +żadnych +żadnemu +żadnym +żadną +żadną +żadnymi +nigdzie +nigdy +znikąd +donikąd +nijak diff --git a/data/pl/suffix.txt b/data/pl/suffix.txt new file mode 100644 index 0000000..c235d1e --- /dev/null +++ b/data/pl/suffix.txt @@ -0,0 +1,117 @@ +a +ą +ać +acz +ak +anie +anin +anka +ant +arka +arz +aszek +ątko +aty +awo +awy +ba +by +centryzm +cept +czyk +czyńca +e +ę +eć +ęcie +eczek +eczka +eczko +ek +el +enie +eńka +gnozja +graf +holizm +i +ik +in +ina +iny +isia +isko +iszek +iwo +izacja +izm +jad +ka +ko +kradztwo +letni +lit +liwy +lnia +lubny +mab +ń +naście +nauta +nia +nica +nik +ny +o +ość +ota +ów +owa +ówa +ować +owate +owce +owczyni +owicz +owiczka +owiec +ówka +ówna +owski +owy +pol +ś +ski +sko +stwo +twórczy +uchna +unia +unio +uś +usia +uszek +uszko +u +wieczny +wóz +yć +yk +yni +ysko +ysty +ystyczny +yzm +yzna +y +ż +że +żer +żerca +żerny +złotowy +ego +emu +ule +ół +ie diff --git a/data/pl/swear.txt b/data/pl/swear.txt new file mode 100644 index 0000000..236eb1c --- /dev/null +++ b/data/pl/swear.txt @@ -0,0 +1,624 @@ +chuj +chuja +chujek +chuju +chujem +chujnia +chujowy +chujowa +chujowe +cipa +cipą +cipe +cipę +cipie +dojebać +dojebac +dojebie +dojebał +dojebal +dojebała +dojebala +dojebałem +dojebalem +dojebałam +dojebalam +dojebię +dojebie +dopieprzać +dopieprzac +dopierdalać +dopierdalac +dopierdala +dopierdalał +dopierdalal +dopierdalała +dopierdalala +dopierdoli +dopierdolił +dopierdolil +dopierdolę +dopierdole +dopierdoli +dopierdalający +dopierdalajacy +dopierdolić +dopierdolic +dupa +dupie +dupą +dupcia +dupeczka +dupy +dupe +huj +hujek +hujnia +huja +huje +hujem +huju +jebać +jebac +jebał +jebal +jebie +jebią +jebia +jebak +jebaka +jebal +jebał +jebany +jebane +jebanka +jebanko +jebankiem +jebanymi +jebana +jebanym +jebanej +jebaną +jebana +jebani +jebanych +jebanymi +jebcie +jebiący +jebiacy +jebiąca +jebiaca +jebiącego +jebiacego +jebiącej +jebiacej +jebia +jebią +jebie +jebię +jebliwy +jebnąć +jebnac +jebnąc +jebnać +jebnął +jebnal +jebną +jebna +jebnęła +jebnela +jebnie +jebnij +jebut +koorwa +kórwa +kurestwo +kurew +kurewski +kurewska +kurewskiej +kurewską +kurewska +kurewsko +kurewstwo +kurwa +kurwaa +kurwami +kurwą +kurwe +kurwę +kurwie +kurwiska +kurwo +kurwy +kurwach +kurwami +kurewski +kurwiarz +kurwiący +kurwica +kurwić +kurwic +kurwidołek +kurwik +kurwiki +kurwiszcze +kurwiszon +kurwiszona +kurwiszonem +kurwiszony +kutas +kutasa +kutasie +kutasem +kutasy +kutasów +kutasow +kutasach +kutasami +matkojebca +matkojebcy +matkojebcą +matkojebca +matkojebcami +matkojebcach +nabarłożyć +najebać +najebac +najebał +najebal +najebała +najebala +najebane +najebany +najebanł +najebana +najebie +najebię +najebia +naopierdalać +naopierdalac +naopierdalał +naopierdalal +naopierdalała +naopierdalala +naopierdalała +napierdalać +napierdalac +napierdalający +napierdalajacy +napierdolić +napierdolic +nawpierdalać +nawpierdalac +nawpierdalał +nawpierdalal +nawpierdalała +nawpierdalala +obsrywać +obsrywac +obsrywający +obsrywajacy +odpieprzać +odpieprzac +odpieprzy +odpieprzył +odpieprzyl +odpieprzyła +odpieprzyla +odpierdalać +odpierdalac +odpierdol +odpierdolił +odpierdolil +odpierdoliła +odpierdolila +odpierdoli +odpierdalający +odpierdalajacy +odpierdalająca +odpierdalajaca +odpierdolić +odpierdolic +odpierdoli +odpierdolił +opieprzający +opierdalać +opierdalac +opierdala +opierdalający +opierdalajacy +opierdol +opierdolić +opierdolic +opierdoli +opierdolą +opierdola +piczka +pieprznięty +pieprzniety +pieprzony +pierdel +pierdlu +pierdolą +pierdola +pierdolący +pierdolacy +pierdoląca +pierdolaca +pierdol +pierdole +pierdolenie +pierdoleniem +pierdoleniu +pierdolę +pierdolec +pierdola +pierdolą +pierdolić +pierdolicie +pierdolic +pierdolił +pierdolil +pierdoliła +pierdolila +pierdoli +pierdolnięty +pierdolniety +pierdolisz +pierdolnąć +pierdolnac +pierdolnął +pierdolnal +pierdolnęła +pierdolnela +pierdolnie +pierdolnięty +pierdolnij +pierdolnik +pierdolona +pierdolone +pierdolony +pierdołki +pierdzący +pierdzieć +pierdziec +pizda +pizdą +pizde +pizdę +piździe +pizdzie +pizdnąć +pizdnac +pizdu +podpierdalać +podpierdalac +podpierdala +podpierdalający +podpierdalajacy +podpierdolić +podpierdolic +podpierdoli +pojeb +pojeba +pojebami +pojebani +pojebanego +pojebanemu +pojebani +pojebany +pojebanych +pojebanym +pojebanymi +pojebem +pojebać +pojebac +pojebalo +popierdala +popierdalac +popierdalać +popierdolić +popierdolic +popierdoli +popierdolonego +popierdolonemu +popierdolonym +popierdolone +popierdoleni +popierdolony +porozpierdalać +porozpierdala +porozpierdalac +poruchac +poruchać +przejebać +przejebane +przejebac +przyjebali +przepierdalać +przepierdalac +przepierdala +przepierdalający +przepierdalajacy +przepierdalająca +przepierdalajaca +przepierdolić +przepierdolic +przyjebać +przyjebac +przyjebie +przyjebała +przyjebala +przyjebał +przyjebal +przypieprzać +przypieprzac +przypieprzający +przypieprzajacy +przypieprzająca +przypieprzajaca +przypierdalać +przypierdalac +przypierdala +przypierdoli +przypierdalający +przypierdalajacy +przypierdolić +przypierdolic +qrwa +rozjebać +rozjebac +rozjebie +rozjebała +rozjebią +rozpierdalać +rozpierdalac +rozpierdala +rozpierdolić +rozpierdolic +rozpierdole +rozpierdoli +rozpierducha +skurwić +skurwiel +skurwiela +skurwielem +skurwielu +skurwysyn +skurwysynów +skurwysynow +skurwysyna +skurwysynem +skurwysynu +skurwysyny +skurwysyński +skurwysynski +skurwysyństwo +skurwysynstwo +spieprzać +spieprzac +spieprza +spieprzaj +spieprzajcie +spieprzają +spieprzaja +spieprzający +spieprzajacy +spieprzająca +spieprzajaca +spierdalać +spierdalac +spierdala +spierdalał +spierdalała +spierdalal +spierdalalcie +spierdalala +spierdalający +spierdalajacy +spierdolić +spierdolic +spierdoli +spierdoliła +spierdoliło +spierdolą +spierdola +srać +srac +srający +srajacy +srając +srajac +sraj +sukinsyn +sukinsyny +sukinsynom +sukinsynowi +sukinsynów +sukinsynow +śmierdziel +udupić +ujebać +ujebac +ujebał +ujebal +ujebana +ujebany +ujebie +ujebała +ujebala +upierdalać +upierdalac +upierdala +upierdoli +upierdolić +upierdolic +upierdoli +upierdolą +upierdola +upierdoleni +wjebać +wjebac +wjebie +wjebią +wjebia +wjebiemy +wjebiecie +wkurwiać +wkurwiac +wkurwi +wkurwia +wkurwiał +wkurwial +wkurwiający +wkurwiajacy +wkurwiająca +wkurwiajaca +wkurwić +wkurwic +wkurwi +wkurwiacie +wkurwiają +wkurwiali +wkurwią +wkurwia +wkurwimy +wkurwicie +wkurwiacie +wkurwić +wkurwic +wkurwia +wpierdalać +wpierdalac +wpierdalający +wpierdalajacy +wpierdol +wpierdolić +wpierdolic +wpizdu +wyjebać +wyjebac +wyjebali +wyjebał +wyjebac +wyjebała +wyjebały +wyjebie +wyjebią +wyjebia +wyjebiesz +wyjebie +wyjebiecie +wyjebiemy +wypieprzać +wypieprzac +wypieprza +wypieprzał +wypieprzal +wypieprzała +wypieprzala +wypieprzy +wypieprzyła +wypieprzyla +wypieprzył +wypieprzyl +wypierdal +wypierdalać +wypierdalac +wypierdala +wypierdalaj +wypierdalał +wypierdalal +wypierdalała +wypierdalala +wypierdalać +wypierdolić +wypierdolic +wypierdoli +wypierdolimy +wypierdolicie +wypierdolą +wypierdola +wypierdolili +wypierdolił +wypierdolil +wypierdoliła +wypierdolila +zajebać +zajebac +zajebie +zajebią +zajebia +zajebiał +zajebial +zajebała +zajebiala +zajebali +zajebana +zajebani +zajebane +zajebany +zajebanych +zajebanym +zajebanymi +zajebiste +zajebisty +zajebistych +zajebista +zajebistym +zajebistymi +zajebiście +zajebiscie +zapieprzyć +zapieprzyc +zapieprzy +zapieprzył +zapieprzyl +zapieprzyła +zapieprzyla +zapieprzą +zapieprza +zapieprzy +zapieprzymy +zapieprzycie +zapieprzysz +zapierdala +zapierdalać +zapierdalac +zapierdalaja +zapierdalał +zapierdalaj +zapierdalajcie +zapierdalała +zapierdalala +zapierdalali +zapierdalający +zapierdalajacy +zapierdolić +zapierdolic +zapierdoli +zapierdolił +zapierdolil +zapierdoliła +zapierdolila +zapierdolą +zapierdola +zapierniczać +zapierniczający +zasrać +zasranym +zasrywać +zasrywający +zesrywać +zesrywający +zjebać +zjebac +zjebał +zjebal +zjebała +zjebala +zjebana +zjebią +zjebali +zjeby diff --git a/data/pl/thx.txt b/data/pl/thx.txt new file mode 100644 index 0000000..2a6a2fe --- /dev/null +++ b/data/pl/thx.txt @@ -0,0 +1,5 @@ +dziękuję +dzięki +dzienks +dzieki +dziekuje \ No newline at end of file diff --git a/example.py b/example.py new file mode 100644 index 0000000..4f27bdd --- /dev/null +++ b/example.py @@ -0,0 +1,29 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +from prosecco import * + +text = """Chrząszcz brzmi w trzcinie w Szczebrzeszynie. +Ząb zupa zębowa, dąb zupa dębowa. +Gdzie Rzym, gdzie Krym. W Pacanowie kozy kują. +Tak, jeśli mam szczęśliwy być, to w Gdańsku muszę żyć! +""" + +cities = ["szczebrzeszyn", "pacanow", "gdansk", "rzym", "krym"] +conditions = [] +# accept all +for city in cities: + conditions.append(Condition(lemma_type="city", + compare=city, + normalizer=CharsetNormalizer(Charset.PL_EN), + stemmer=WordStemmer(language="pl"), + lower=True)) +# accept all +conditions.append(Condition(compare=r".*")) + +tokenizer = LanguageTokenizer(Charset.PL) +tokens = tokenizer.tokenize(text) +visitor = Visitor(conditions=conditions) +lexer = Lexer(tokens=tokens, visitor=visitor) +lemmas = lexer.lex() +found_cities = filter(lambda l: l.type == 'city', lemmas) +print(" ".join(map(str, found_cities))) diff --git a/prosecco.py b/prosecco.py new file mode 100644 index 0000000..bd4313f --- /dev/null +++ b/prosecco.py @@ -0,0 +1,183 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Short, flexible and extendable NLP engine that can produce list of features from text based on provided condtions. +I use it for : +- word categorisation +- feature extraction +""" +__version__ = '0.0.1' +import os +import re + + +# ------------- +# Charset +# ------------- +class Charset: + """ + Provides information about character set for LanguageTokenizer + All other characters will be treet as single tokens + """ + EN = "qwertyuiopasdfghjklzxcvbnm1234567890" + PL = EN+'ęóąśłżźćń' + PL_EN = { "ę": "e", "ó": "o", "ą": "a", "ś": "s", "ł": "l", "ż": "z", "ź": "z", "ć": "c", "ń": "n", } + + +class CharsetNormalizer: + def __init__(self, charset): + self.charset = charset + + def normalize(self, word): + out = "" + for c in word: + if c in self.charset: + if c.istitle(): + c = self.charset[c].upper() + else: + c = self.charset[c] + out += c + return out + + +# ------------- +# Stemmer +# ------------- +class WordStemmer: + """ + Base class for stemming words + Return tuple of stemmed outputs + """ + def __init__(self, language, path=None): + self.language = language + self.stemwords = () + if path is None: + path = "data/{}/suffix.txt".format(language) + with open(path) as f: + # read file strip \n sort by length and save as tuple + w = [w.strip() for w in f.readlines()] + w.sort(key=len) + self.stemwords = tuple(w) + + def stem(self, word): + stem_list = [] + for s in self.stemwords: + if word.endswith(s): + stem_list.append(word[:-len(s)]) + return tuple(stem_list) + + +# ------------- +# Tokenzier +# ------------- +class LanguageTokenizer: + """Tokenize string of data to array of tokens""" + def __init__(self, charset): + self.charset = charset + + def tokenize(self, text): + tokens = [] + partial = "" + for c in text: + # pick + if c.lower() in self.charset: + partial += c + else: + if len(partial) > 0: + tokens.append(partial) + partial = "" + tokens.append(c) + return tokens + + +# ------------- +# Lexer / Visitor +# ------------- +class Visitor: + """ + Utility class for Lexer that use Condition class to check wheather + we add Lemma to Lexer output or process list of tokens further + """ + def __init__(self, conditions, empty=True, auto_space=True): + self.conditions = conditions + # empty lexer token list + self.empty = empty + self.auto_space = auto_space + self.lemma = None + + def filter_space(self, data): + return list(filter(lambda x: x != " ", data)) + + def __contains__(self, item): + if self.auto_space: + data = self.filter_space(item) + sentence = " ".join(data) + else: + sentence = " ".join(item) + for condition in self.conditions: + if condition == sentence: + self.lemma = Lemma(type=condition.lemma_type, data=sentence) + return True + return False + + +class Lexer: + """ + Converts list of tokens based on conditions in LexVisitor + """ + def __init__(self, tokens, visitor): + self.tokens = tokens + self.visitor = visitor + + def lex(self): + lemma_list = [] + token_list = [] + for token in self.tokens: + token_list.append(token) + if token_list in self.visitor: + lemma_list.append(self.visitor.lemma) + if self.visitor.empty: + token_list = [] + return lemma_list + + +# ------------- +# Lemma +# ------------- + +class LemmaType: + SKIP = "skip" + KEY = "key" + +class Lemma: + """Base lemma class output for lexer""" + def __init__(self, type, data): + self.type = type + self.data = data + + def __repr__(self): + return "{}[{}]".format(self.data, self.type) + + +class Condition: + """Base condition class contain compare statement""" + def __init__(self, lemma_type=LemmaType.SKIP, compare=None, normalizer=None, stemmer=None, lower=False): + self.lemma_type = lemma_type + self.lower = lower + self.compare = compare + self.normalizer = normalizer + self.stemmer = stemmer + + def __eq__(self, data): + if self.lower: + data = data.lower() + if self.normalizer: + data = self.normalizer.normalize(data) + if self.stemmer: + words = self.stemmer.stem(data) + # we got list of words so compare if we found one + for word in words: + if word == self.compare: + return True + # regex comparasion + return re.match(self.compare, data) diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..3532ef2 --- /dev/null +++ b/setup.py @@ -0,0 +1,28 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import setuptools + +import prosecco + +with open("README.md", "r") as fh: + long_description = fh.read() + +setuptools.setup( + name="prosecco", + version=prosecco.__version__, + author="Michal Szczepanski", + author_email="michal@vane.pl", + description="Short, flexible and extendable NLP engine that can produce list of features from text based on provided condtions.", + long_description=long_description, + long_description_content_type="text/markdown", + license='MIT', + url="https://github.com/vane/prosecco", + packages=setuptools.find_packages(), + classifiers=[ + "Programming Language :: Python :: 2", + "Programming Language :: Python :: 3", + "License :: OSI Approved :: MIT License", + "Operating System :: OS Independent", + 'License :: OSI Approved :: MIT License', + ], +)