Skip to content

Commit

Permalink
Added support for several languages
Browse files Browse the repository at this point in the history
  • Loading branch information
watzon committed Jul 9, 2019
1 parent 0ded76f commit 5a5c4cb
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 28 deletions.
55 changes: 30 additions & 25 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -141,38 +141,43 @@ tokenizer.tokenize("If we 'all' can't go. I'll stay home.")
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).

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

```crystal
text = "\"I said, 'what're you? Crazy?'\" said Sandowsky. \"I can't afford to do that.\""
Cadmium.pragmatic_tokenizer.new.tokenize(text)
# => ["\"", "i", "said", ",", "'", "what're", "you", "?", "crazy", "?", "'", "\"", "said", "sandowsky", ".", "\"", "i", "can't", "afford", "to", "do", "that", ".", "\""]
```

The initializer accepts the following options:

# You can pass many different options to #initialize:
options = {
language: :en, # the language of the string you are tokenizing
abbreviations: Set{"a.b", "a"}, # a user-supplied array of abbreviations (downcased with ending period removed)
stop_words: Set{"is", "the"}, # a user-supplied array of stop words (downcased)
remove_stop_words: true, # remove stop words
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)
expand_contractions: true, # (i.e. ["isn't"] will change to two tokens ["is", "not"])
filter_languages: [:en, :de], # process abbreviations, contractions and stop words for this array of languages
punctuation: :none, # see below for more details
numbers: :none, # see below for more details
remove_emoji: true, # remove any emoji tokens
remove_urls: true, # remove any urls
remove_emails: true, # remove any emails
remove_domains: true, # remove any domains
hashtags: :keep_and_clean, # remove the hastag prefix
mentions: :keep_and_clean, # remove the @ prefix
clean: true, # remove some special characters
classic_filter: true, # removes dots from acronyms and 's from the end of tokens
downcase: false, # do not downcase tokens
minimum_length: 3, # remove any tokens less than 3 characters
long_word_split: 10 # split tokens longer than 10 characters at hypens or underscores
}
```crystal
language: :en, # the language of the string you are tokenizing
abbreviations: Set{"a.b", "a"}, # a user-supplied array of abbreviations (downcased with ending period removed)
stop_words: Set{"is", "the"}, # a user-supplied array of stop words (downcased)
remove_stop_words: true, # remove stop words
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)
expand_contractions: true, # (i.e. ["isn't"] will change to two tokens ["is", "not"])
filter_languages: [:en, :de], # process abbreviations, contractions and stop words for this array of languages
punctuation: :none, # see below for more details
numbers: :none, # see below for more details
remove_emoji: true, # remove any emoji tokens
remove_urls: true, # remove any urls
remove_emails: true, # remove any emails
remove_domains: true, # remove any domains
hashtags: :keep_and_clean, # remove the hastag prefix
mentions: :keep_and_clean, # remove the @ prefix
clean: true, # remove some special characters
classic_filter: true, # removes dots from acronyms and 's from the end of tokens
downcase: false, # do not downcase tokens
minimum_length: 3, # remove any tokens less than 3 characters
long_word_split: 10 # split tokens longer than 10 characters at hypens or underscores
```

### String Distance
Expand Down
9 changes: 6 additions & 3 deletions src/cadmium/tokenizer/pragmatic/languages.cr
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
require "./languages/common"

require "./languages/english"
require "./languages/czech"
require "./languages/bulgarian"
require "./languages/deutsch"
require "./languages/spanish"
require "./languages/portuguese"

module Cadmium
class PragmaticTokenizer < Tokenizer
Expand All @@ -12,11 +15,11 @@ module Cadmium
# ar: Arabic,
bg: Bulgarian,
# ca: Catalan,
# cs: Czech,
cs: Czech,
# da: Danish,
de: Deutsch,
# el: Greek,
# es: Spanish,
es: Spanish,
# fa: Persian,
# fi: Finnish,
# fr: French,
Expand All @@ -28,7 +31,7 @@ module Cadmium
# nb: Norwegian,
# no: Norwegian,
# pl: Polish,
# pt: Portuguese,
pt: Portuguese,
# ro: Romanian,
# ru: Russian,
# sk: Slovak,
Expand Down
13 changes: 13 additions & 0 deletions src/cadmium/tokenizer/pragmatic/languages/czech.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
require "./common"

module Cadmium
class PragmaticTokenizer < Tokenizer
module Languages
class Czech < Languages::Common
ABBREVIATIONS = Set(String).new
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
CONTRACTIONS = {} of String => String
end
end
end
end
13 changes: 13 additions & 0 deletions src/cadmium/tokenizer/pragmatic/languages/portuguese.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
require "./common"

module Cadmium
class PragmaticTokenizer < Tokenizer
module Languages
class Portuguese < Languages::Common
ABBREVIATIONS = Set(String).new
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
CONTRACTIONS = {} of String => String
end
end
end
end
16 changes: 16 additions & 0 deletions src/cadmium/tokenizer/pragmatic/languages/spanish.cr
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
require "./common"

module Cadmium
class PragmaticTokenizer < Tokenizer
module Languages
class Spanish < Languages::Common
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
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
CONTRACTIONS = {
"al" => "a el",
"del" => "de el",
}
end
end
end
end

0 comments on commit 5a5c4cb

Please sign in to comment.