Skip to content

Commit 5a5c4cb

Browse files
committed
Added support for several languages
1 parent 0ded76f commit 5a5c4cb

File tree

5 files changed

+78
-28
lines changed

5 files changed

+78
-28
lines changed

README.md

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -141,38 +141,43 @@ tokenizer.tokenize("If we 'all' can't go. I'll stay home.")
141141
The pragmatic tokenizer is based off of the ruby gem from diasks2 which you can find [here](https://github.com/diasks2/pragmatic_tokenizer). It is a multilengual tokenizer which provides a wide array of options for tokenizing strings. For complete documentation check [here](https://watzon.github.io/cadmium/Cadmium/Tokenizer/Pragmatic.html).
142142

143143
Example is taken directly from the diasks2/pragmatic_tokenizer documentation, with a few modifications. Currently supported languages are:
144-
- English (:en)
145-
- Deutsch (:de)
144+
- English (**:en**)
145+
- Deutsch (**:de**)
146+
- Czech (**:cz**)
147+
- Bulgarian (**:bg**)
148+
- Spanish (**:sp**)
149+
- Portuguese (**:pt**)
146150

147151
```crystal
148152
text = "\"I said, 'what're you? Crazy?'\" said Sandowsky. \"I can't afford to do that.\""
149153
150154
Cadmium.pragmatic_tokenizer.new.tokenize(text)
151155
# => ["\"", "i", "said", ",", "'", "what're", "you", "?", "crazy", "?", "'", "\"", "said", "sandowsky", ".", "\"", "i", "can't", "afford", "to", "do", "that", ".", "\""]
156+
```
157+
158+
The initializer accepts the following options:
152159

153-
# You can pass many different options to #initialize:
154-
options = {
155-
language: :en, # the language of the string you are tokenizing
156-
abbreviations: Set{"a.b", "a"}, # a user-supplied array of abbreviations (downcased with ending period removed)
157-
stop_words: Set{"is", "the"}, # a user-supplied array of stop words (downcased)
158-
remove_stop_words: true, # remove stop words
159-
contractions: { "i'm" => "i am" }, # a user-supplied hash of contractions (key is the contracted form; value is the expanded form - both the key and value should be downcased)
160-
expand_contractions: true, # (i.e. ["isn't"] will change to two tokens ["is", "not"])
161-
filter_languages: [:en, :de], # process abbreviations, contractions and stop words for this array of languages
162-
punctuation: :none, # see below for more details
163-
numbers: :none, # see below for more details
164-
remove_emoji: true, # remove any emoji tokens
165-
remove_urls: true, # remove any urls
166-
remove_emails: true, # remove any emails
167-
remove_domains: true, # remove any domains
168-
hashtags: :keep_and_clean, # remove the hastag prefix
169-
mentions: :keep_and_clean, # remove the @ prefix
170-
clean: true, # remove some special characters
171-
classic_filter: true, # removes dots from acronyms and 's from the end of tokens
172-
downcase: false, # do not downcase tokens
173-
minimum_length: 3, # remove any tokens less than 3 characters
174-
long_word_split: 10 # split tokens longer than 10 characters at hypens or underscores
175-
}
160+
```crystal
161+
language: :en, # the language of the string you are tokenizing
162+
abbreviations: Set{"a.b", "a"}, # a user-supplied array of abbreviations (downcased with ending period removed)
163+
stop_words: Set{"is", "the"}, # a user-supplied array of stop words (downcased)
164+
remove_stop_words: true, # remove stop words
165+
contractions: { "i'm" => "i am" }, # a user-supplied hash of contractions (key is the contracted form; value is the expanded form - both the key and value should be downcased)
166+
expand_contractions: true, # (i.e. ["isn't"] will change to two tokens ["is", "not"])
167+
filter_languages: [:en, :de], # process abbreviations, contractions and stop words for this array of languages
168+
punctuation: :none, # see below for more details
169+
numbers: :none, # see below for more details
170+
remove_emoji: true, # remove any emoji tokens
171+
remove_urls: true, # remove any urls
172+
remove_emails: true, # remove any emails
173+
remove_domains: true, # remove any domains
174+
hashtags: :keep_and_clean, # remove the hastag prefix
175+
mentions: :keep_and_clean, # remove the @ prefix
176+
clean: true, # remove some special characters
177+
classic_filter: true, # removes dots from acronyms and 's from the end of tokens
178+
downcase: false, # do not downcase tokens
179+
minimum_length: 3, # remove any tokens less than 3 characters
180+
long_word_split: 10 # split tokens longer than 10 characters at hypens or underscores
176181
```
177182

178183
### String Distance

src/cadmium/tokenizer/pragmatic/languages.cr

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
require "./languages/common"
22

33
require "./languages/english"
4+
require "./languages/czech"
45
require "./languages/bulgarian"
56
require "./languages/deutsch"
7+
require "./languages/spanish"
8+
require "./languages/portuguese"
69

710
module Cadmium
811
class PragmaticTokenizer < Tokenizer
@@ -12,11 +15,11 @@ module Cadmium
1215
# ar: Arabic,
1316
bg: Bulgarian,
1417
# ca: Catalan,
15-
# cs: Czech,
18+
cs: Czech,
1619
# da: Danish,
1720
de: Deutsch,
1821
# el: Greek,
19-
# es: Spanish,
22+
es: Spanish,
2023
# fa: Persian,
2124
# fi: Finnish,
2225
# fr: French,
@@ -28,7 +31,7 @@ module Cadmium
2831
# nb: Norwegian,
2932
# no: Norwegian,
3033
# pl: Polish,
31-
# pt: Portuguese,
34+
pt: Portuguese,
3235
# ro: Romanian,
3336
# ru: Russian,
3437
# sk: Slovak,
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
require "./common"
2+
3+
module Cadmium
4+
class PragmaticTokenizer < Tokenizer
5+
module Languages
6+
class Czech < Languages::Common
7+
ABBREVIATIONS = Set(String).new
8+
STOP_WORDS = Set.new(%w[ačkoli ahoj ale anebo ano asi aspoň během bez beze blízko bohužel brzo bude budeme budeš budete budou budu byl byla byli bylo byly bys čau chce chceme chceš chcete chci chtějí chtít chut' chuti co čtrnáct čtyři dál dále daleko děkovat děkujeme děkuji den deset devatenáct devět do dobrý docela dva dvacet dvanáct dvě hodně já jak jde je jeden jedenáct jedna jedno jednou jedou jeho její jejich jemu jen jenom ještě jestli jestliže jí jich jím jimi jinak jsem jsi jsme jsou jste kam kde kdo kdy když ke kolik kromě která které kteří který kvůli má mají málo mám máme máš máte mé mě mezi mí mít mně mnou moc mohl mohou moje moji možná můj musí může my na nad nade nám námi naproti nás náš naše naši ne ně nebo nebyl nebyla nebyli nebyly něco nedělá nedělají nedělám neděláme neděláš neděláte nějak nejsi někde někdo nemají nemáme nemáte neměl němu není nestačí nevadí než nic nich ním nimi nula od ode on ona oni ono ony osm osmnáct pak patnáct pět po pořád potom pozdě před přes přese pro proč prosím prostě proti protože rovně se sedm sedmnáct šest šestnáct skoro smějí smí snad spolu sta sté sto ta tady tak takhle taky tam tamhle tamhleto tamto tě tebe tebou ted' tedy ten ti tisíc tisíce to tobě tohle toto třeba tři třináct trošku tvá tvé tvoje tvůj ty určitě už vám vámi vás váš vaše vaši ve večer vedle vlastně všechno všichni vůbec vy vždy za zač zatímco ze že aby aj ani az budem budes by byt ci clanek clanku clanky coz cz dalsi design dnes email ho jako jej jeji jeste ji jine jiz jses kdyz ktera ktere kteri kterou ktery ma mate mi mit muj muze nam napiste nas nasi nejsou neni nez nove novy pod podle pokud pouze prave pred pres pri proc proto protoze prvni pta re si strana sve svych svym svymi take takze tato tema tento teto tim timto tipy toho tohoto tom tomto tomuto tu tuto tyto uz vam vas vase vice vsak zda zde zpet zpravy a aniž až být což či článek článku články další i jenž jiné již jseš jšte k každý kteři ku me ná napište nechť ní nové nový o práve první přede při s sice své svůj svých svým svými také takže te těma této tím tímto u v více však všechen z zpět zprávy]).freeze
9+
CONTRACTIONS = {} of String => String
10+
end
11+
end
12+
end
13+
end
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
require "./common"
2+
3+
module Cadmium
4+
class PragmaticTokenizer < Tokenizer
5+
module Languages
6+
class Portuguese < Languages::Common
7+
ABBREVIATIONS = Set(String).new
8+
STOP_WORDS = Set.new(%w[acerca agora algmas alguns ali ambos antes apontar aquela aquelas aquele aqueles aqui atrás bem bom cada caminho cima com como comprido conhecido corrente das debaixo dentro desde desligado deve devem deverá direita diz dizer dois dos e é ela ele eles em enquanto então está estado estão estar estará este estes esteve estive estivemos estiveram eu fará faz fazer fazia fez fim foi fora horas iniciar inicio ir irá ista iste isto ligado maioria maiorias mais mas mesmo meu muito muitos não nome nós nosso novo o onde os ou outro para parte pegar pelo pessoas pode poderá podia por porque povo promeiro qual qualquer quando quê quem quieto saber são sem ser seu somente tal também tem têm tempo tenho tentar tentaram tente tentei teu teve tipo tive todos trabalhar trabalho tu último um uma umas uns usa usar valor veja ver verdade verdadeiro você a à adeus aí ainda além algo algumas ano anos ao aos apenas apoio após aquilo área as às assim até através baixo bastante boa boas bons breve cá catorze cedo cento certamente certeza cinco coisa conselho contra custa da dá dão daquela daquelas daquele daqueles dar de demais depois dessa dessas desse desses desta destas deste destes dez dezanove dezasseis dezassete dezoito dia diante dizem do doze duas dúvida elas embora entre era és essa essas esse esses esta estas estás estava estiveste estivestes estou exemplo faço falta favor fazeis fazem fazemos fazes final fomos for foram forma foste fostes fui geral grande grandes grupo há hoje hora isso já lá lado local logo longe lugar maior mal máximo me meio menor menos mês meses meus mil minha minhas momento na nada naquela naquelas naquele naqueles nas nem nenhuma nessa nessas nesse nesses nesta nestas neste nestes nível no noite nos nossa nossas nossos nova novas nove novos num numa número nunca obra obrigada obrigado oitava oitavo oito ontem onze outra outras outros parece partir paucas pela pelas pelos perto pôde podem poder põe põem ponto pontos porquê posição possível possivelmente posso pouca pouco poucos primeira primeiras primeiro primeiros própria próprias próprio próprios próxima próximas próximo próximos puderam quáis quanto quarta quarto quatro que quer quereis querem queremas queres quero questão quinta quinto quinze relação sabe sabem se segunda segundo sei seis sempre seria sete sétima sétimo seus sexta sexto sim sistema sob sobre sois somos sou sua suas talvez tanta tantas tanto tão tarde te temos tendes tens ter terceira terceiro teus tivemos tiveram tiveste tivestes toda todas todo três treze tua tuas tudo vai vais vão vários vem vêm vens vez vezes viagem vindo vinte vocês vos vós vossa vossas vosso vossos zero and]).freeze
9+
CONTRACTIONS = {} of String => String
10+
end
11+
end
12+
end
13+
end
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
require "./common"
2+
3+
module Cadmium
4+
class PragmaticTokenizer < Tokenizer
5+
module Languages
6+
class Spanish < Languages::Common
7+
ABBREVIATIONS = Set.new(["a", "a.c", "a/c", "abr", "adj", "admón", "aero", "afmo", "ago", "almte", "ambi", "an", "anfi", "ante", "anti", "ap", "apdo", "archi", "arci", "arq", "art", "atte", "auto", "av", "avda", "bco", "bi", "bibl", "bien", "bis", "bs. as", "c", "c.f", "c.g", "c/c", "c/u", "cap", "cc.aa", "cdad", "cm", "co", "com", "con", "contra", "cra", "crio", "cta", "cuadri", "cuasi", "cuatri", "cv", "d.e.p", "da", "das", "dcha", "dcho", "de", "deci", "dep", "des", "di", "dic", "dicc", "dir", "dis", "dn", "do", "doc", "dom", "dpto", "dr", "dra", "dto", "ecto", "ee", "ej", "en", "endo", "entlo", "entre", "epi", "equi", "esq", "etc", "ex", "excmo", "ext", "extra", "f.c", "fca", "fdo", "febr", "ff. aa", "ff.cc", "fig", "fil", "fra", "g.p", "g/p", "geo", "gob", "gr", "gral", "grs", "hemi", "hetero", "hiper", "hipo", "hnos", "homo", "hs", "i", "igl", "iltre", "im", "imp", "impr", "impto", "in", "incl", "infra", "ing", "inst", "inter", "intra", "iso", "izdo", "izq", "izqdo", "j.c", "jue", "jul", "jun", "kg", "km", "lcdo", "ldo", "let", "lic", "ltd", "lun", "macro", "mar", "may", "mega", "mg", "micro", "min", "mini", "mié", "mm", "mono", "mt", "multi", "máx", "mín", "n. del t", "n.b", "neo", "no", "nos", "nov", "ntra. sra", "núm", "oct", "omni", "p", "p.a", "p.d", "p.ej", "p.v.p", "para", "pen", "ph", "ph.d", "pluri", "poli", "pos", "post", "pp", "ppal", "pre", "prev", "pro", "prof", "prov", "pseudo", "ptas", "pts", "pza", "pág", "págs", "párr", "párrf", "q.e.g.e", "q.e.p.d", "q.e.s.m", "re", "reg", "rep", "retro", "rr. hh", "rte", "s", "s. a", "s.a.r", "s.e", "s.l", "s.r.c", "s.r.l", "s.s.s", "s/n", "sdad", "seg", "semi", "sept", "seudo", "sig", "sobre", "sr", "sra", "sres", "srta", "sta", "sto", "sub", "super", "supra", "sáb", "t.v.e", "tamb", "tel", "tfno", "trans", "tras", "tri", "ud", "uds", "ulter", "ultra", "un", "uni", "univ", "uu", "v.b", "v.e", "vd", "vds", "vice", "vid", "vie", "vol", "vs", "vto", "yuxta"]).freeze
8+
STOP_WORDS = Set.new(["algún", "alguna", "algunas", "alguno", "algunos", "ambos", "ampleamos", "ante", "antes", "aquel", "aquellas", "aquellos", "aqui", "arriba", "atras", "bajo", "bastante", "bien", "cada", "cierta", "ciertas", "cierto", "ciertos", "como", "con", "conseguimos", "conseguir", "consigo", "consigue", "consiguen", "consigues", "cual", "cuando", "dentro", "desde", "donde", "dos", "el", "ellas", "ellos", "empleais", "emplean", "emplear", "empleas", "empleo", "en", "encima", "entonces", "entre", "era", "eramos", "eran", "eras", "eres", "es", "esta", "estaba", "estado", "estais", "estamos", "estan", "estoy", "fin", "fue", "fueron", "fui", "fuimos", "gueno", "ha", "hace", "haceis", "hacemos", "hacen", "hacer", "haces", "hago", "incluso", "intenta", "intentais", "intentamos", "intentan", "intentar", "intentas", "intento", "ir", "la", "largo", "las", "lo", "los", "mientras", "mio", "modo", "muchos", "muy", "nos", "nosotros", "otro", "para", "pero", "podeis", "podemos", "poder", "podria", "podriais", "podriamos", "podrian", "podrias", "por", "por qué", "porque", "primero", "puede", "pueden", "puedo", "quien", "sabe", "sabeis", "sabemos", "saben", "saber", "sabes", "ser", "si", "siendo", "sin", "sobre", "sois", "solamente", "solo", "somos", "soy", "su", "sus", "también", "teneis", "tenemos", "tener", "tengo", "tiempo", "tiene", "tienen", "todo", "trabaja", "trabajais", "trabajamos", "trabajan", "trabajar", "trabajas", "trabajo", "tras", "tuyo", "ultimo", "un", "una", "unas", "uno", "unos", "usa", "usais", "usamos", "usan", "usar", "usas", "uso", "va", "vais", "valor", "vamos", "van", "vaya", "verdad", "verdadera", "verdadero", "vosotras", "vosotros", "voy", "yo", "él", "ésta", "éstas", "éste", "éstos", "última", "últimas", "último", "últimos", "a", "añadió", "aún", "actualmente", "adelante", "además", "afirmó", "agregó", "ahí", "ahora", "al", "algún", "algo", "alrededor", "anterior", "apenas", "aproximadamente", "aquí", "así", "aseguró", "aunque", "ayer", "buen", "buena", "buenas", "bueno", "buenos", "cómo", "casi", "cerca", "cinco", "comentó", "conocer", "consideró", "considera", "contra", "cosas", "creo", "cuales", "cualquier", "cuanto", "cuatro", "cuenta", "da", "dado", "dan", "dar", "de", "debe", "deben", "debido", "decir", "dejó", "del", "demás", "después", "dice", "dicen", "dicho", "dieron", "diferente", "diferentes", "dijeron", "dijo", "dio", "durante", "e", "ejemplo", "ella", "ello", "embargo", "encuentra", "esa", "esas", "ese", "eso", "esos", "está", "están", "estaban", "estar", "estará", "estas", "este", "esto", "estos", "estuvo", "ex", "existe", "existen", "explicó", "expresó", "fuera", "gran", "grandes", "había", "habían", "haber", "habrá", "hacerlo", "hacia", "haciendo", "han", "hasta", "hay", "haya", "he", "hecho", "hemos", "hicieron", "hizo", "hoy", "hubo", "igual", "indicó", "informó", "junto", "lado", "le", "les", "llegó", "lleva", "llevar", "luego", "lugar", "más", "manera", "manifestó", "mayor", "me", "mediante", "mejor", "mencionó", "menos", "mi", "misma", "mismas", "mismo", "mismos", "momento", "mucha", "muchas", "mucho", "nada", "nadie", "ni", "ningún", "ninguna", "ningunas", "ninguno", "ningunos", "no", "nosotras", "nuestra", "nuestras", "nuestro", "nuestros", "nueva", "nuevas", "nuevo", "nuevos", "nunca", "o", "ocho", "otra", "otras", "otros", "parece", "parte", "partir", "pasada", "pasado", "pesar", "poca", "pocas", "poco", "pocos", "podrá", "podrán", "podría", "podrían", "poner", "posible", "próximo", "próximos", "primer", "primera", "primeros", "principalmente", "propia", "propias", "propio", "propios", "pudo", "pueda", "pues", "qué", "que", "quedó", "queremos", "quién", "quienes", "quiere", "realizó", "realizado", "realizar", "respecto", "sí", "sólo", "se", "señaló", "sea", "sean", "según", "segunda", "segundo", "seis", "será", "serán", "sería", "sido", "siempre", "siete", "sigue", "siguiente", "sino", "sola", "solas", "solos", "son", "tal", "tampoco", "tan", "tanto", "tenía", "tendrá", "tendrán", "tenga", "tenido", "tercera", "toda", "todas", "todavía", "todos", "total", "trata", "través", "tres", "tuvo", "usted", "varias", "varios", "veces", "ver", "vez", "y", "ya"]).freeze
9+
CONTRACTIONS = {
10+
"al" => "a el",
11+
"del" => "de el",
12+
}
13+
end
14+
end
15+
end
16+
end

0 commit comments

Comments
 (0)