Let's drink

This commit is contained in:
Michal Szczepanski 2019-08-11 00:49:44 +02:00
commit 48b4b9ab47
No known key found for this signature in database
GPG Key ID: 3DCEFDDFCCB1DC69
15 changed files with 1877 additions and 0 deletions

12
.gitignore vendored Normal file

@ -0,0 +1,12 @@
# Python
__pycache__
build
dist
prosecco.egg-info
*.pyc
# OS
.DS_Store
# IDE
*.iml

21
LICENSE Normal file

@ -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.

48
README.md Normal file

@ -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]`

23
data/pl/bye.txt Normal file

@ -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

53
data/pl/hi.txt Normal file

@ -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ł

47
data/pl/prefix.txt Normal file

@ -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

45
data/pl/preposition.txt Normal file

@ -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

298
data/pl/pronoun.txt Normal file

@ -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
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ą
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
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

344
data/pl/stopwords.txt Normal file

@ -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
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ą
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
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

117
data/pl/suffix.txt Normal file

@ -0,0 +1,117 @@
a
ą
acz
ak
anie
anin
anka
ant
arka
arz
aszek
ątko
aty
awo
awy
ba
by
centryzm
cept
czyk
czyńca
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
usia
uszek
uszko
u
wieczny
wóz
yk
yni
ysko
ysty
ystyczny
yzm
yzna
y
ż
że
żer
żerca
żerny
złotowy
ego
emu
ule
ół
ie

624
data/pl/swear.txt Normal file

@ -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

5
data/pl/thx.txt Normal file

@ -0,0 +1,5 @@
dziękuję
dzięki
dzienks
dzieki
dziekuje

29
example.py Normal file

@ -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)))

183
prosecco.py Normal file

@ -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)

28
setup.py Normal file

@ -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',
],
)