diff --git a/README.md b/README.md index 4d38b41..1f989d0 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/src/cadmium/tokenizer/pragmatic/languages.cr b/src/cadmium/tokenizer/pragmatic/languages.cr index 2b867b1..a10757e 100644 --- a/src/cadmium/tokenizer/pragmatic/languages.cr +++ b/src/cadmium/tokenizer/pragmatic/languages.cr @@ -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 @@ -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, @@ -28,7 +31,7 @@ module Cadmium # nb: Norwegian, # no: Norwegian, # pl: Polish, - # pt: Portuguese, + pt: Portuguese, # ro: Romanian, # ru: Russian, # sk: Slovak, diff --git a/src/cadmium/tokenizer/pragmatic/languages/czech.cr b/src/cadmium/tokenizer/pragmatic/languages/czech.cr new file mode 100644 index 0000000..c26da03 --- /dev/null +++ b/src/cadmium/tokenizer/pragmatic/languages/czech.cr @@ -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 diff --git a/src/cadmium/tokenizer/pragmatic/languages/portuguese.cr b/src/cadmium/tokenizer/pragmatic/languages/portuguese.cr new file mode 100644 index 0000000..e8dcf2c --- /dev/null +++ b/src/cadmium/tokenizer/pragmatic/languages/portuguese.cr @@ -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 diff --git a/src/cadmium/tokenizer/pragmatic/languages/spanish.cr b/src/cadmium/tokenizer/pragmatic/languages/spanish.cr new file mode 100644 index 0000000..53daf18 --- /dev/null +++ b/src/cadmium/tokenizer/pragmatic/languages/spanish.cr @@ -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