pragmatic_tokenizer 2.1.0 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +77 -13
  3. data/README.md +3 -3
  4. data/lib/pragmatic_tokenizer/full_stop_separator.rb +2 -2
  5. data/lib/pragmatic_tokenizer/languages.rb +27 -26
  6. data/lib/pragmatic_tokenizer/languages/arabic.rb +2 -2
  7. data/lib/pragmatic_tokenizer/languages/bulgarian.rb +2 -2
  8. data/lib/pragmatic_tokenizer/languages/catalan.rb +2 -2
  9. data/lib/pragmatic_tokenizer/languages/common.rb +11 -11
  10. data/lib/pragmatic_tokenizer/languages/czech.rb +2 -2
  11. data/lib/pragmatic_tokenizer/languages/danish.rb +2 -2
  12. data/lib/pragmatic_tokenizer/languages/deutsch.rb +4 -4
  13. data/lib/pragmatic_tokenizer/languages/dutch.rb +2 -2
  14. data/lib/pragmatic_tokenizer/languages/english.rb +2 -2
  15. data/lib/pragmatic_tokenizer/languages/finnish.rb +2 -2
  16. data/lib/pragmatic_tokenizer/languages/french.rb +2 -2
  17. data/lib/pragmatic_tokenizer/languages/greek.rb +2 -2
  18. data/lib/pragmatic_tokenizer/languages/indonesian.rb +2 -2
  19. data/lib/pragmatic_tokenizer/languages/italian.rb +2 -2
  20. data/lib/pragmatic_tokenizer/languages/latvian.rb +2 -2
  21. data/lib/pragmatic_tokenizer/languages/norwegian.rb +2 -2
  22. data/lib/pragmatic_tokenizer/languages/persian.rb +2 -2
  23. data/lib/pragmatic_tokenizer/languages/polish.rb +2 -2
  24. data/lib/pragmatic_tokenizer/languages/portuguese.rb +2 -2
  25. data/lib/pragmatic_tokenizer/languages/romanian.rb +2 -2
  26. data/lib/pragmatic_tokenizer/languages/russian.rb +2 -2
  27. data/lib/pragmatic_tokenizer/languages/slovak.rb +2 -2
  28. data/lib/pragmatic_tokenizer/languages/spanish.rb +2 -2
  29. data/lib/pragmatic_tokenizer/languages/swedish.rb +2 -2
  30. data/lib/pragmatic_tokenizer/languages/turkish.rb +2 -2
  31. data/lib/pragmatic_tokenizer/post_processor.rb +11 -13
  32. data/lib/pragmatic_tokenizer/tokenizer.rb +195 -187
  33. data/lib/pragmatic_tokenizer/version.rb +1 -1
  34. data/pragmatic_tokenizer.gemspec +1 -1
  35. data/spec/languages/bulgarian_spec.rb +4 -8
  36. data/spec/languages/deutsch_spec.rb +25 -49
  37. data/spec/languages/english_spec.rb +238 -364
  38. data/spec/languages/french_spec.rb +1 -2
  39. data/spec/performance_spec.rb +15 -16
  40. metadata +4 -4
@@ -2,8 +2,8 @@ module PragmaticTokenizer
2
2
  module Languages
3
3
  module Norwegian
4
4
  include Languages::Common
5
- ABBREVIATIONS = [].freeze
6
- STOP_WORDS = %w(alle andre arbeid av bare begge bli bort bra bruk bruke da deg denne der deres det dette din disse du eller en ene eneste enhver enn er et folk for fordi forsûke fra få før fûr fûrst gjorde gjûre god gå ha hadde han hans har hennes her hun hva hvem hver hvilken hvis hvor hvordan hvorfor i ikke inn innen jeg kan kunne lage lang lik like makt mange med meg meget men mens mer mest min mot mye må måte navn nei noen ny nå når og også om opp oss over part punkt på rett riktig samme sant seg sett si siden sist skulle slik slutt som start stille så tid til tilbake tilstand under ut uten var ved verdi vi vil ville vite vår vöre vört å).freeze
5
+ ABBREVIATIONS = Set.new([]).freeze
6
+ STOP_WORDS = Set.new(%w(alle andre arbeid av bare begge bli bort bra bruk bruke da deg denne der deres det dette din disse du eller en ene eneste enhver enn er et folk for fordi forsûke fra få før fûr fûrst gjorde gjûre god gå ha hadde han hans har hennes her hun hva hvem hver hvilken hvis hvor hvordan hvorfor i ikke inn innen jeg kan kunne lage lang lik like makt mange med meg meget men mens mer mest min mot mye må måte navn nei noen ny nå når og også om opp oss over part punkt på rett riktig samme sant seg sett si siden sist skulle slik slutt som start stille så tid til tilbake tilstand under ut uten var ved verdi vi vil ville vite vår vöre vört å)).freeze
7
7
  CONTRACTIONS = {}.freeze
8
8
  end
9
9
  end
@@ -2,8 +2,8 @@ module PragmaticTokenizer
2
2
  module Languages
3
3
  module Persian
4
4
  include Languages::Common
5
- ABBREVIATIONS = [].freeze
6
- STOP_WORDS = %w(و در به از كه مي اين است را با هاي براي آن يك شود شده خود ها كرد شد اي تا كند بر بود گفت نيز وي هم كنند دارد ما كرده يا اما بايد دو اند هر خواهد او مورد آنها باشد ديگر مردم نمي بين پيش پس اگر همه صورت يكي هستند بي من دهد هزار نيست استفاده داد داشته راه داشت چه همچنين كردند داده بوده دارند همين ميليون سوي شوند بيشتر بسيار روي گرفته هايي تواند اول نام هيچ چند جديد بيش شدن كردن كنيم نشان حتي اينكه ولی توسط چنين برخي نه ديروز دوم درباره بعد مختلف گيرد شما گفته آنان بار طور گرفت دهند گذاري بسياري طي بودند ميليارد بدون تمام كل تر براساس شدند ترين امروز باشند ندارد چون قابل گويد ديگري همان خواهند قبل آمده اكنون تحت طريق گيري جاي هنوز چرا البته كنيد سازي سوم كنم بلكه زير توانند ضمن فقط بودن حق آيد وقتي اش يابد نخستين مقابل خدمات امسال تاكنون مانند تازه آورد فكر آنچه نخست نشده شايد چهار جريان پنج ساخته زيرا نزديك برداري كسي ريزي رفت گردد مثل آمد ام بهترين دانست كمتر دادن تمامي جلوگيري بيشتري ايم ناشي چيزي آنكه بالا بنابراين ايشان بعضي دادند داشتند برخوردار نخواهد هنگام نبايد غير نبود ديده وگو داريم چگونه بندي خواست فوق ده نوعي هستيم ديگران همچنان سراسر ندارند گروهي سعي روزهاي آنجا يكديگر كردم بيست بروز سپس رفته آورده نمايد باشيم گويند زياد خويش همواره گذاشته شش نداشته شناسي خواهيم آباد داشتن نظير همچون باره نكرده شان سابق هفت دانند جايي بی جز زیرِ رویِ سریِ تویِ جلویِ پیشِ عقبِ بالایِ خارجِ وسطِ بیرونِ سویِ کنارِ پاعینِ نزدِ نزدیکِ دنبالِ حدودِ برابرِ طبقِ مانندِ ضدِّ هنگامِ برایِ مثلِ بارة اثرِ تولِ علّتِ سمتِ عنوانِ قصدِ روب جدا کی که چیست هست کجا کجاست کَی چطور کدام آیا مگر چندین یک چیزی دیگر کسی بعری هیچ چیز جا کس هرگز یا تنها بلکه خیاه بله بلی آره آری مرسی البتّه لطفاً ّه انکه وقتیکه همین پیش مدّتی هنگامی مان تان).freeze
5
+ ABBREVIATIONS = Set.new([]).freeze
6
+ STOP_WORDS = Set.new(%w(و در به از كه مي اين است را با هاي براي آن يك شود شده خود ها كرد شد اي تا كند بر بود گفت نيز وي هم كنند دارد ما كرده يا اما بايد دو اند هر خواهد او مورد آنها باشد ديگر مردم نمي بين پيش پس اگر همه صورت يكي هستند بي من دهد هزار نيست استفاده داد داشته راه داشت چه همچنين كردند داده بوده دارند همين ميليون سوي شوند بيشتر بسيار روي گرفته هايي تواند اول نام هيچ چند جديد بيش شدن كردن كنيم نشان حتي اينكه ولی توسط چنين برخي نه ديروز دوم درباره بعد مختلف گيرد شما گفته آنان بار طور گرفت دهند گذاري بسياري طي بودند ميليارد بدون تمام كل تر براساس شدند ترين امروز باشند ندارد چون قابل گويد ديگري همان خواهند قبل آمده اكنون تحت طريق گيري جاي هنوز چرا البته كنيد سازي سوم كنم بلكه زير توانند ضمن فقط بودن حق آيد وقتي اش يابد نخستين مقابل خدمات امسال تاكنون مانند تازه آورد فكر آنچه نخست نشده شايد چهار جريان پنج ساخته زيرا نزديك برداري كسي ريزي رفت گردد مثل آمد ام بهترين دانست كمتر دادن تمامي جلوگيري بيشتري ايم ناشي چيزي آنكه بالا بنابراين ايشان بعضي دادند داشتند برخوردار نخواهد هنگام نبايد غير نبود ديده وگو داريم چگونه بندي خواست فوق ده نوعي هستيم ديگران همچنان سراسر ندارند گروهي سعي روزهاي آنجا يكديگر كردم بيست بروز سپس رفته آورده نمايد باشيم گويند زياد خويش همواره گذاشته شش نداشته شناسي خواهيم آباد داشتن نظير همچون باره نكرده شان سابق هفت دانند جايي بی جز زیرِ رویِ سریِ تویِ جلویِ پیشِ عقبِ بالایِ خارجِ وسطِ بیرونِ سویِ کنارِ پاعینِ نزدِ نزدیکِ دنبالِ حدودِ برابرِ طبقِ مانندِ ضدِّ هنگامِ برایِ مثلِ بارة اثرِ تولِ علّتِ سمتِ عنوانِ قصدِ روب جدا کی که چیست هست کجا کجاست کَی چطور کدام آیا مگر چندین یک چیزی دیگر کسی بعری هیچ چیز جا کس هرگز یا تنها بلکه خیاه بله بلی آره آری مرسی البتّه لطفاً ّه انکه وقتیکه همین پیش مدّتی هنگامی مان تان)).freeze
7
7
  CONTRACTIONS = {}.freeze
8
8
  end
9
9
  end
@@ -2,8 +2,8 @@ module PragmaticTokenizer
2
2
  module Languages
3
3
  module Polish
4
4
  include Languages::Common
5
- ABBREVIATIONS = ['ags', 'alb', 'ang', 'aor', 'awest', 'bałt', 'bojkow', 'bret', 'brus', 'bsł', 'bułg', 'c.b.d.o', 'c.b.d.u', 'celt', 'chorw', 'cs', 'czakaw', 'czerw', 'czes', 'dłuż', 'dniem', 'dor', 'dubrow', 'duń', 'ekaw', 'fiń', 'franc', 'gal', 'germ', 'głuż', 'gniem', 'goc', 'gr', 'grudz', 'hebr', 'het', 'hol', 'I cont', 'ie', 'ikaw', 'irań', 'irl', 'islandz', 'itd', 'itd.', 'itp', 'jekaw', 'kajkaw', 'kasz', 'kirg', 'kwiec', 'łac', 'lip', 'listop', 'lit', 'łot', 'lp', 'maced', 'mar', 'młpol', 'moraw', 'n.e', 'nb.', 'ngr', 'niem', 'nord', 'norw', 'np', 'np.', 'ok.', 'orm', 'oset', 'osk', 'p.n', 'p.n.e', 'p.o', 'pazdz', 'pers', 'pie', 'pod red.', 'podhal', 'pol', 'połab', 'port', 'prekm', 'pskow', 'psł', 'R cont', 'rez', 'rom', 'rozdz.', 'rum', 'rus', 'rys.', 'sas', 'sch', 'scs', 'serb', 'sierp', 'śl', 'sła', 'słe', 'słi', 'słow', 'sp. z o.o', 'śrdniem', 'śrgniem', 'śrirl', 'stbułg', 'stind', 'stpol', 'stpr', 'str.', 'strus', 'stwniem', 'stycz', 'sztokaw', 'szwedz', 't.', 'tj.', 'tłum.', 'toch', 'tur', 'tzn', 'ukr', 'ul', 'umbr', 'wed', 'węg', 'wlkpol', 'włos', 'wrzes', 'wyd.', 'zakarp'].freeze
6
- STOP_WORDS = %w(ach aj albo bardzo bez bo być ci cię ciebie co czy daleko dla dlaczego dlatego do dobrze dokąd dość dużo dwa dwaj dwie dwoje dziś dzisiaj gdyby gdzie go ich ile im inny ja ją jak jakby jaki je jeden jedna jedno jego jej jemu jeśli jest jestem jeżeli już każdy kiedy kierunku kto ku lub ma mają mam mi mną mnie moi mój moja moje może mu my na nam nami nas nasi nasz nasza nasze natychmiast nią nic nich nie niego niej niemu nigdy nim nimi niż obok od około on ona one oni ono owszem po pod ponieważ przed przedtem są sam sama się skąd tak taki tam ten to tobą tobie tu tutaj twoi twój twoja twoje ty wam wami was wasi wasz wasza wasze we więc wszystko wtedy wy żaden zawsze że a aby ach acz aczkolwiek ale ależ aż bardziej bowiem by byli bynajmniej był była było były będzie będą cali cała cały cokolwiek coś czasami czasem czemu czyli gdy gdyż gdziekolwiek gdzieś i inna inne innych iż jakaś jakichś jakie jakiś jakiż jakkolwiek jako jakoś jednak jednakże jeszcze kilka kimś ktokolwiek ktoś która które którego której który których którym którzy lat lecz mimo między mogą moim możliwe można musi nad naszego naszych natomiast nawet no o oraz pan pana pani podczas pomimo ponad powinien powinna powinni powinno poza prawie przecież przede przez przy roku również sobie sobą sposób swoje ta taka takie także te tego tej teraz też totobą toteż trzeba twoim twym tych tylko tym u w według wiele wielu więcej wszyscy wszystkich wszystkie wszystkim właśnie z za zapewne zeznowu znów został żadna żadne żadnych żeby).freeze
5
+ ABBREVIATIONS = Set.new(['ags', 'alb', 'ang', 'aor', 'awest', 'bałt', 'bojkow', 'bret', 'brus', 'bsł', 'bułg', 'c.b.d.o', 'c.b.d.u', 'celt', 'chorw', 'cs', 'czakaw', 'czerw', 'czes', 'dłuż', 'dniem', 'dor', 'dubrow', 'duń', 'ekaw', 'fiń', 'franc', 'gal', 'germ', 'głuż', 'gniem', 'goc', 'gr', 'grudz', 'hebr', 'het', 'hol', 'I cont', 'ie', 'ikaw', 'irań', 'irl', 'islandz', 'itd', 'itd.', 'itp', 'jekaw', 'kajkaw', 'kasz', 'kirg', 'kwiec', 'łac', 'lip', 'listop', 'lit', 'łot', 'lp', 'maced', 'mar', 'młpol', 'moraw', 'n.e', 'nb.', 'ngr', 'niem', 'nord', 'norw', 'np', 'np.', 'ok.', 'orm', 'oset', 'osk', 'p.n', 'p.n.e', 'p.o', 'pazdz', 'pers', 'pie', 'pod red.', 'podhal', 'pol', 'połab', 'port', 'prekm', 'pskow', 'psł', 'R cont', 'rez', 'rom', 'rozdz.', 'rum', 'rus', 'rys.', 'sas', 'sch', 'scs', 'serb', 'sierp', 'śl', 'sła', 'słe', 'słi', 'słow', 'sp. z o.o', 'śrdniem', 'śrgniem', 'śrirl', 'stbułg', 'stind', 'stpol', 'stpr', 'str.', 'strus', 'stwniem', 'stycz', 'sztokaw', 'szwedz', 't.', 'tj.', 'tłum.', 'toch', 'tur', 'tzn', 'ukr', 'ul', 'umbr', 'wed', 'węg', 'wlkpol', 'włos', 'wrzes', 'wyd.', 'zakarp']).freeze
6
+ STOP_WORDS = Set.new(%w(ach aj albo bardzo bez bo być ci cię ciebie co czy daleko dla dlaczego dlatego do dobrze dokąd dość dużo dwa dwaj dwie dwoje dziś dzisiaj gdyby gdzie go ich ile im inny ja ją jak jakby jaki je jeden jedna jedno jego jej jemu jeśli jest jestem jeżeli już każdy kiedy kierunku kto ku lub ma mają mam mi mną mnie moi mój moja moje może mu my na nam nami nas nasi nasz nasza nasze natychmiast nią nic nich nie niego niej niemu nigdy nim nimi niż obok od około on ona one oni ono owszem po pod ponieważ przed przedtem są sam sama się skąd tak taki tam ten to tobą tobie tu tutaj twoi twój twoja twoje ty wam wami was wasi wasz wasza wasze we więc wszystko wtedy wy żaden zawsze że a aby ach acz aczkolwiek ale ależ aż bardziej bowiem by byli bynajmniej był była było były będzie będą cali cała cały cokolwiek coś czasami czasem czemu czyli gdy gdyż gdziekolwiek gdzieś i inna inne innych iż jakaś jakichś jakie jakiś jakiż jakkolwiek jako jakoś jednak jednakże jeszcze kilka kimś ktokolwiek ktoś która które którego której który których którym którzy lat lecz mimo między mogą moim możliwe można musi nad naszego naszych natomiast nawet no o oraz pan pana pani podczas pomimo ponad powinien powinna powinni powinno poza prawie przecież przede przez przy roku również sobie sobą sposób swoje ta taka takie także te tego tej teraz też totobą toteż trzeba twoim twym tych tylko tym u w według wiele wielu więcej wszyscy wszystkich wszystkie wszystkim właśnie z za zapewne zeznowu znów został żadna żadne żadnych żeby)).freeze
7
7
  CONTRACTIONS = {}.freeze
8
8
  end
9
9
  end
@@ -2,8 +2,8 @@ module PragmaticTokenizer
2
2
  module Languages
3
3
  module Portuguese
4
4
  include Languages::Common
5
- ABBREVIATIONS = [].freeze
6
- STOP_WORDS = %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
5
+ ABBREVIATIONS = Set.new([]).freeze
6
+ 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
7
7
  CONTRACTIONS = {}.freeze
8
8
  end
9
9
  end
@@ -2,8 +2,8 @@ module PragmaticTokenizer
2
2
  module Languages
3
3
  module Romanian
4
4
  include Languages::Common
5
- ABBREVIATIONS = [].freeze
6
- STOP_WORDS = ["acea", "aceasta", "această", "aceea", "acei", "aceia", "acel", "acela", "acele", "acelea", "acest", "acesta", "aceste", "acestea", "aceşti", "aceştia", "acolo", "acord", "acum", "ai", "aia", "aibă", "aici", "al", "ăla", "ale", "alea", "ălea", "altceva", "altcineva", "am", "ar", "are", "aş", "aşadar", "asemenea", "asta", "ăsta", "astăzi", "astea", "ăstea", "ăştia", "asupra", "aţi", "au", "avea", "avem", "aveţi", "azi", "bine", "bucur", "bună", "ca", "că", "căci", "când", "care", "cărei", "căror", "cărui", "cât", "câte", "câţi", "către", "câtva", "caut", "ce", "cel", "ceva", "chiar", "cinci", "cînd", "cine", "cineva", "cît", "cîte", "cîţi", "cîtva", "contra", "cu", "cum", "cumva", "curând", "curînd", "da", "dă", "dacă", "dar", "dată", "datorită", "dau", "de", "deci", "deja", "deoarece", "departe", "deşi", "din", "dinaintea", "dintr-", "dintre", "doi", "doilea", "două", "drept", "după", "ea", "ei", "el", "ele", "eram", "este", "eşti", "eu", "face", "fără", "fata", "fi", "fie", "fiecare", "fii", "fim", "fiţi", "fiu", "frumos", "graţie", "halbă", "iar", "ieri", "îi", "îl", "îmi", "împotriva", "în", "înainte", "înaintea", "încât", "încît", "încotro", "între", "întrucât", "întrucît", "îţi", "la", "lângă", "le", "li", "lîngă", "lor", "lui", "mă", "mai", "mâine", "mea", "mei", "mele", "mereu", "meu", "mi", "mie", "mîine", "mine", "mult", "multă", "mulţi", "mulţumesc", "ne", "nevoie", "nicăieri", "nici", "nimeni", "nimeri", "nimic", "nişte", "noastră", "noastre", "noi", "noroc", "noştri", "nostru", "nouă", "nu", "opt", "ori", "oricând", "oricare", "oricât", "orice", "oricînd", "oricine", "oricît", "oricum", "oriunde", "până", "patra", "patru", "patrulea", "pe", "pentru", "peste", "pic", "pînă", "poate", "pot", "prea", "prima", "primul", "prin", "puţin", "puţina", "puţină", "rog", "sa", "să", "săi", "sale", "şapte", "şase", "sau", "său", "se", "şi", "sînt", "sîntem", "sînteţi", "spate", "spre", "ştiu", "sub", "sunt", "suntem", "sunteţi", "sută", "ta", "tăi", "tale", "tău", "te", "ţi", "ţie", "timp", "tine", "toată", "toate", "tot", "toţi", "totuşi", "trei", "treia", "treilea", "tu", "un", "una", "unde", "undeva", "unei", "uneia", "unele", "uneori", "unii", "unor", "unora", "unu", "unui", "unuia", "unul", "vă", "vi", "voastră", "voastre", "voi", "vor", "voştri", "vostru", "vouă", "vreme", "vreo", "vreun", "zece", "zero", "zi", "zice"].freeze
5
+ ABBREVIATIONS = Set.new([]).freeze
6
+ STOP_WORDS = Set.new(["acea", "aceasta", "această", "aceea", "acei", "aceia", "acel", "acela", "acele", "acelea", "acest", "acesta", "aceste", "acestea", "aceşti", "aceştia", "acolo", "acord", "acum", "ai", "aia", "aibă", "aici", "al", "ăla", "ale", "alea", "ălea", "altceva", "altcineva", "am", "ar", "are", "aş", "aşadar", "asemenea", "asta", "ăsta", "astăzi", "astea", "ăstea", "ăştia", "asupra", "aţi", "au", "avea", "avem", "aveţi", "azi", "bine", "bucur", "bună", "ca", "că", "căci", "când", "care", "cărei", "căror", "cărui", "cât", "câte", "câţi", "către", "câtva", "caut", "ce", "cel", "ceva", "chiar", "cinci", "cînd", "cine", "cineva", "cît", "cîte", "cîţi", "cîtva", "contra", "cu", "cum", "cumva", "curând", "curînd", "da", "dă", "dacă", "dar", "dată", "datorită", "dau", "de", "deci", "deja", "deoarece", "departe", "deşi", "din", "dinaintea", "dintr-", "dintre", "doi", "doilea", "două", "drept", "după", "ea", "ei", "el", "ele", "eram", "este", "eşti", "eu", "face", "fără", "fata", "fi", "fie", "fiecare", "fii", "fim", "fiţi", "fiu", "frumos", "graţie", "halbă", "iar", "ieri", "îi", "îl", "îmi", "împotriva", "în", "înainte", "înaintea", "încât", "încît", "încotro", "între", "întrucât", "întrucît", "îţi", "la", "lângă", "le", "li", "lîngă", "lor", "lui", "mă", "mai", "mâine", "mea", "mei", "mele", "mereu", "meu", "mi", "mie", "mîine", "mine", "mult", "multă", "mulţi", "mulţumesc", "ne", "nevoie", "nicăieri", "nici", "nimeni", "nimeri", "nimic", "nişte", "noastră", "noastre", "noi", "noroc", "noştri", "nostru", "nouă", "nu", "opt", "ori", "oricând", "oricare", "oricât", "orice", "oricînd", "oricine", "oricît", "oricum", "oriunde", "până", "patra", "patru", "patrulea", "pe", "pentru", "peste", "pic", "pînă", "poate", "pot", "prea", "prima", "primul", "prin", "puţin", "puţina", "puţină", "rog", "sa", "să", "săi", "sale", "şapte", "şase", "sau", "său", "se", "şi", "sînt", "sîntem", "sînteţi", "spate", "spre", "ştiu", "sub", "sunt", "suntem", "sunteţi", "sută", "ta", "tăi", "tale", "tău", "te", "ţi", "ţie", "timp", "tine", "toată", "toate", "tot", "toţi", "totuşi", "trei", "treia", "treilea", "tu", "un", "una", "unde", "undeva", "unei", "uneia", "unele", "uneori", "unii", "unor", "unora", "unu", "unui", "unuia", "unul", "vă", "vi", "voastră", "voastre", "voi", "vor", "voştri", "vostru", "vouă", "vreme", "vreo", "vreun", "zece", "zero", "zi", "zice"]).freeze
7
7
  CONTRACTIONS = {}.freeze
8
8
  end
9
9
  end
@@ -2,8 +2,8 @@ module PragmaticTokenizer
2
2
  module Languages
3
3
  module Russian
4
4
  include Languages::Common
5
- ABBREVIATIONS = ["y", "y.e", "а", "авт", "адм.-терр", "акад", "в", "вв", "вкз", "вост.-европ", "г", "гг", "гос", "гр", "д", "деп", "дисс", "дол", "долл", "ежедн", "ж", "жен", "з", "зап", "зап.-европ", "заруб", "и", "ин", "иностр", "инст", "к", "канд", "кв", "кг", "куб", "л", "л.h", "л.н", "м", "мин", "моск", "муж", "н", "нед", "о", "п", "пгт", "пер", "пп", "пр", "просп", "проф", "р", "руб", "с", "сек", "см", "спб", "стр", "т", "тел", "тов", "тт", "тыс", "у", "у.е", "ул", "ф", "ч"].freeze
6
- STOP_WORDS = %w(а е и ж м о на не ни об но он мне мои мож она они оно мной много многочисленное многочисленная многочисленные многочисленный мною мой мог могут можно может можхо мор моя моё мочь над нее оба нам нем нами ними мимо немного одной одного менее однажды однако меня нему меньше ней наверху него ниже мало надо один одиннадцать одиннадцатый назад наиболее недавно миллионов недалеко между низко меля нельзя нибудь непрерывно наконец никогда никуда нас наш нет нею неё них мира наша наше наши ничего начала нередко несколько обычно опять около мы ну нх от отовсюду особенно нужно очень отсюда в во вон вниз внизу вокруг вот восемнадцать восемнадцатый восемь восьмой вверх вам вами важное важная важные важный вдали везде ведь вас ваш ваша ваше ваши впрочем весь вдруг вы все второй всем всеми времени время всему всего всегда всех всею всю вся всё всюду г год говорил говорит года году где да ее за из ли же им до по ими под иногда довольно именно долго позже более должно пожалуйста значит иметь больше пока ему имя пор пора потом потому после почему почти посреди ей два две двенадцать двенадцатый двадцать двадцатый двух его дел или без день занят занята занято заняты действительно давно девятнадцать девятнадцатый девять девятый даже алло жизнь далеко близко здесь дальше для лет зато даром первый перед затем зачем лишь десять десятый ею её их бы еще при был про процентов против просто бывает бывь если люди была были было будем будет будете будешь прекрасно буду будь будто будут ещё пятнадцать пятнадцатый друго другое другой другие другая других есть пять быть лучше пятый к ком конечно кому кого когда которой которого которая которые который которых кем каждое каждая каждые каждый кажется как какой какая кто кроме куда кругом с т у я та те уж со то том снова тому совсем того тогда тоже собой тобой собою тобою сначала только уметь тот тою хорошо хотеть хочешь хоть хотя свое свои твой своей своего своих свою твоя твоё раз уже сам там тем чем сама сами теми само рано самом самому самой самого семнадцать семнадцатый самим самими самих саму семь чему раньше сейчас чего сегодня себе тебе сеаой человек разве теперь себя тебя седьмой спасибо слишком так такое такой такие также такая сих тех чаще четвертый через часто шестой шестнадцать шестнадцатый шесть четыре четырнадцать четырнадцатый сколько сказал сказала сказать ту ты три эта эти что это чтоб этом этому этой этого чтобы этот стал туда этим этими рядом тринадцать тринадцатый этих третий тут эту суть чуть тысяч).freeze
5
+ ABBREVIATIONS = Set.new(["y", "y.e", "а", "авт", "адм.-терр", "акад", "в", "вв", "вкз", "вост.-европ", "г", "гг", "гос", "гр", "д", "деп", "дисс", "дол", "долл", "ежедн", "ж", "жен", "з", "зап", "зап.-европ", "заруб", "и", "ин", "иностр", "инст", "к", "канд", "кв", "кг", "куб", "л", "л.h", "л.н", "м", "мин", "моск", "муж", "н", "нед", "о", "п", "пгт", "пер", "пп", "пр", "просп", "проф", "р", "руб", "с", "сек", "см", "спб", "стр", "т", "тел", "тов", "тт", "тыс", "у", "у.е", "ул", "ф", "ч"]).freeze
6
+ STOP_WORDS = Set.new(%w(а е и ж м о на не ни об но он мне мои мож она они оно мной много многочисленное многочисленная многочисленные многочисленный мною мой мог могут можно может можхо мор моя моё мочь над нее оба нам нем нами ними мимо немного одной одного менее однажды однако меня нему меньше ней наверху него ниже мало надо один одиннадцать одиннадцатый назад наиболее недавно миллионов недалеко между низко меля нельзя нибудь непрерывно наконец никогда никуда нас наш нет нею неё них мира наша наше наши ничего начала нередко несколько обычно опять около мы ну нх от отовсюду особенно нужно очень отсюда в во вон вниз внизу вокруг вот восемнадцать восемнадцатый восемь восьмой вверх вам вами важное важная важные важный вдали везде ведь вас ваш ваша ваше ваши впрочем весь вдруг вы все второй всем всеми времени время всему всего всегда всех всею всю вся всё всюду г год говорил говорит года году где да ее за из ли же им до по ими под иногда довольно именно долго позже более должно пожалуйста значит иметь больше пока ему имя пор пора потом потому после почему почти посреди ей два две двенадцать двенадцатый двадцать двадцатый двух его дел или без день занят занята занято заняты действительно давно девятнадцать девятнадцатый девять девятый даже алло жизнь далеко близко здесь дальше для лет зато даром первый перед затем зачем лишь десять десятый ею её их бы еще при был про процентов против просто бывает бывь если люди была были было будем будет будете будешь прекрасно буду будь будто будут ещё пятнадцать пятнадцатый друго другое другой другие другая других есть пять быть лучше пятый к ком конечно кому кого когда которой которого которая которые который которых кем каждое каждая каждые каждый кажется как какой какая кто кроме куда кругом с т у я та те уж со то том снова тому совсем того тогда тоже собой тобой собою тобою сначала только уметь тот тою хорошо хотеть хочешь хоть хотя свое свои твой своей своего своих свою твоя твоё раз уже сам там тем чем сама сами теми само рано самом самому самой самого семнадцать семнадцатый самим самими самих саму семь чему раньше сейчас чего сегодня себе тебе сеаой человек разве теперь себя тебя седьмой спасибо слишком так такое такой такие также такая сих тех чаще четвертый через часто шестой шестнадцать шестнадцатый шесть четыре четырнадцать четырнадцатый сколько сказал сказала сказать ту ты три эта эти что это чтоб этом этому этой этого чтобы этот стал туда этим этими рядом тринадцать тринадцатый этих третий тут эту суть чуть тысяч)).freeze
7
7
  CONTRACTIONS = {}.freeze
8
8
  end
9
9
  end
@@ -2,8 +2,8 @@ module PragmaticTokenizer
2
2
  module Languages
3
3
  module Slovak
4
4
  include Languages::Common
5
- ABBREVIATIONS = [].freeze
6
- STOP_WORDS = %w(a aby aj ak ako ale alebo and ani áno asi až bez bude budem budeš budeme budete budú by bol bola boli bolo byť cez čo či ďalší ďalšia ďalšie dnes do ho ešte for i ja je jeho jej ich iba iné iný som si sme sú k kam každý každá každé každí kde keď kto ktorá ktoré ktorou ktorý ktorí ku lebo len ma mať má máte medzi mi mna mne mnou musieť môcť môj môže my na nad nám náš naši nie nech než nič niektorý nové nový nová noví o od odo of on ona ono oni ony po pod podľa pokiaľ potom práve pre prečo preto pretože prvý prvá prvé prví pred predo pri pýta s sa so svoje svoj svojich svojím svojími ta tak takže táto teda te tě ten tento the tieto tým týmto tiež to toto toho tohoto tom tomto tomuto tu tú túto tvoj ty tvojími už v vám váš vaše vo viac však všetok vy z za zo že a buď ju menej moja moje späť ste tá tam).freeze
5
+ ABBREVIATIONS = Set.new([]).freeze
6
+ STOP_WORDS = Set.new(%w(a aby aj ak ako ale alebo and ani áno asi až bez bude budem budeš budeme budete budú by bol bola boli bolo byť cez čo či ďalší ďalšia ďalšie dnes do ho ešte for i ja je jeho jej ich iba iné iný som si sme sú k kam každý každá každé každí kde keď kto ktorá ktoré ktorou ktorý ktorí ku lebo len ma mať má máte medzi mi mna mne mnou musieť môcť môj môže my na nad nám náš naši nie nech než nič niektorý nové nový nová noví o od odo of on ona ono oni ony po pod podľa pokiaľ potom práve pre prečo preto pretože prvý prvá prvé prví pred predo pri pýta s sa so svoje svoj svojich svojím svojími ta tak takže táto teda te tě ten tento the tieto tým týmto tiež to toto toho tohoto tom tomto tomuto tu tú túto tvoj ty tvojími už v vám váš vaše vo viac však všetok vy z za zo že a buď ju menej moja moje späť ste tá tam)).freeze
7
7
  CONTRACTIONS = {}.freeze
8
8
  end
9
9
  end
@@ -2,8 +2,8 @@ module PragmaticTokenizer
2
2
  module Languages
3
3
  module Spanish
4
4
  include Languages::Common
5
- ABBREVIATIONS = ["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
6
- STOP_WORDS = ["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
5
+ 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
6
+ 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
7
7
  CONTRACTIONS = {
8
8
  "al" => "a el",
9
9
  "del" => "de el"
@@ -2,8 +2,8 @@ module PragmaticTokenizer
2
2
  module Languages
3
3
  module Swedish
4
4
  include Languages::Common
5
- ABBREVIATIONS = [].freeze
6
- STOP_WORDS = %w(aderton adertonde adjö aldrig alla allas allt alltid alltså än andra andras annan annat ännu artonde artonn åtminstone att åtta åttio åttionde åttonde av även båda bådas bakom bara bäst bättre behöva behövas behövde behövt beslut beslutat beslutit bland blev bli blir blivit bort borta bra då dag dagar dagarna dagen där därför de del delen dem den deras dess det detta dig din dina dit ditt dock du efter eftersom elfte eller elva en enkel enkelt enkla enligt er era ert ett ettusen få fanns får fått fem femte femtio femtionde femton femtonde fick fin finnas finns fjärde fjorton fjortonde fler flera flesta följande för före förlåt förra första fram framför från fyra fyrtio fyrtionde gå gälla gäller gällt går gärna gått genast genom gick gjorde gjort god goda godare godast gör göra gott ha hade haft han hans har här heller hellre helst helt henne hennes hit hög höger högre högst hon honom hundra hundraen hundraett hur i ibland idag igår igen imorgon in inför inga ingen ingenting inget innan inne inom inte inuti ja jag jämfört kan kanske knappast kom komma kommer kommit kr kunde kunna kunnat kvar länge längre långsam långsammare långsammast långsamt längst långt lätt lättare lättast legat ligga ligger lika likställd likställda lilla lite liten litet man många måste med mellan men mer mera mest mig min mina mindre minst mitt mittemot möjlig möjligen möjligt möjligtvis mot mycket någon någonting något några när nästa ned nederst nedersta nedre nej ner ni nio nionde nittio nittionde nitton nittonde nödvändig nödvändiga nödvändigt nödvändigtvis nog noll nr nu nummer och också ofta oftast olika olikt om oss över övermorgon överst övre på rakt rätt redan så sade säga säger sagt samma sämre sämst sedan senare senast sent sex sextio sextionde sexton sextonde sig sin sina sist sista siste sitt sjätte sju sjunde sjuttio sjuttionde sjutton sjuttonde ska skall skulle slutligen små smått snart som stor stora större störst stort tack tidig tidigare tidigast tidigt till tills tillsammans tio tionde tjugo tjugoen tjugoett tjugonde tjugotre tjugotvå tjungo tolfte tolv tre tredje trettio trettionde tretton trettonde två tvåhundra under upp ur ursäkt ut utan utanför ute vad vänster vänstra var vår vara våra varför varifrån varit varken värre varsågod vart vårt vem vems verkligen vi vid vidare viktig viktigare viktigast viktigt vilka vilken vilket vill aderton).freeze
5
+ ABBREVIATIONS = Set.new([]).freeze
6
+ STOP_WORDS = Set.new(%w(aderton adertonde adjö aldrig alla allas allt alltid alltså än andra andras annan annat ännu artonde artonn åtminstone att åtta åttio åttionde åttonde av även båda bådas bakom bara bäst bättre behöva behövas behövde behövt beslut beslutat beslutit bland blev bli blir blivit bort borta bra då dag dagar dagarna dagen där därför de del delen dem den deras dess det detta dig din dina dit ditt dock du efter eftersom elfte eller elva en enkel enkelt enkla enligt er era ert ett ettusen få fanns får fått fem femte femtio femtionde femton femtonde fick fin finnas finns fjärde fjorton fjortonde fler flera flesta följande för före förlåt förra första fram framför från fyra fyrtio fyrtionde gå gälla gäller gällt går gärna gått genast genom gick gjorde gjort god goda godare godast gör göra gott ha hade haft han hans har här heller hellre helst helt henne hennes hit hög höger högre högst hon honom hundra hundraen hundraett hur i ibland idag igår igen imorgon in inför inga ingen ingenting inget innan inne inom inte inuti ja jag jämfört kan kanske knappast kom komma kommer kommit kr kunde kunna kunnat kvar länge längre långsam långsammare långsammast långsamt längst långt lätt lättare lättast legat ligga ligger lika likställd likställda lilla lite liten litet man många måste med mellan men mer mera mest mig min mina mindre minst mitt mittemot möjlig möjligen möjligt möjligtvis mot mycket någon någonting något några när nästa ned nederst nedersta nedre nej ner ni nio nionde nittio nittionde nitton nittonde nödvändig nödvändiga nödvändigt nödvändigtvis nog noll nr nu nummer och också ofta oftast olika olikt om oss över övermorgon överst övre på rakt rätt redan så sade säga säger sagt samma sämre sämst sedan senare senast sent sex sextio sextionde sexton sextonde sig sin sina sist sista siste sitt sjätte sju sjunde sjuttio sjuttionde sjutton sjuttonde ska skall skulle slutligen små smått snart som stor stora större störst stort tack tidig tidigare tidigast tidigt till tills tillsammans tio tionde tjugo tjugoen tjugoett tjugonde tjugotre tjugotvå tjungo tolfte tolv tre tredje trettio trettionde tretton trettonde två tvåhundra under upp ur ursäkt ut utan utanför ute vad vänster vänstra var vår vara våra varför varifrån varit varken värre varsågod vart vårt vem vems verkligen vi vid vidare viktig viktigare viktigast viktigt vilka vilken vilket vill aderton)).freeze
7
7
  CONTRACTIONS = {}.freeze
8
8
  end
9
9
  end
@@ -2,8 +2,8 @@ module PragmaticTokenizer
2
2
  module Languages
3
3
  module Turkish
4
4
  include Languages::Common
5
- ABBREVIATIONS = [].freeze
6
- STOP_WORDS = %w(acaba altmış altı ama ancak arada aslında ayrıca bana bazı belki ben benden beni benim beri beş bile bin bir birçok biri birkaç birkez birşey birşeyi biz bize bizden bizi bizim böyle böylece bu buna bunda bundan bunlar bunları bunların bunu bunun burada çok çünkü da daha dahi de defa değil diğer diye doksan dokuz dolayı dolayısıyla dört edecek eden ederek edilecek ediliyor edilmesi ediyor eğer elli en etmesi etti ettiği ettiğini gibi göre halen hangi hatta hem henüz hep hepsi her herhangi herkesin hiç hiçbir için iki ile ilgili ise işte itibaren itibariyle kadar karşın katrilyon kendi kendilerine kendini kendisi kendisine kendisini kez ki kim kimden kime kimi kimse kırk milyar milyon mu mü mı nasıl ne neden nedenle nerde nerede nereye niye niçin o olan olarak oldu olduğu olduğunu olduklarını olmadı olmadığı olmak olması olmayan olmaz olsa olsun olup olur olursa oluyor on ona ondan onlar onlardan onları onların onu onun otuz oysa öyle pek rağmen sadece sanki sekiz seksen sen senden seni senin siz sizden sizi sizin şey şeyden şeyi şeyler şöyle şu şuna şunda şundan şunları şunu tarafından trilyon tüm üç üzere var vardı ve veya ya yani yapacak yapılan yapılması yapıyor yapmak yaptı yaptığı yaptığını yaptıkları yedi yerine yetmiş yine yirmi yoksa yüz zaten altmýþ altý bazý beþ birþey birþeyi INSERmi kýrk mý nasýl onlari onlarýn yetmiþ þey þeyden þeyi þeyler þu þuna þunda þundan þunu).freeze
5
+ ABBREVIATIONS = Set.new([]).freeze
6
+ STOP_WORDS = Set.new(%w(acaba altmış altı ama ancak arada aslında ayrıca bana bazı belki ben benden beni benim beri beş bile bin bir birçok biri birkaç birkez birşey birşeyi biz bize bizden bizi bizim böyle böylece bu buna bunda bundan bunlar bunları bunların bunu bunun burada çok çünkü da daha dahi de defa değil diğer diye doksan dokuz dolayı dolayısıyla dört edecek eden ederek edilecek ediliyor edilmesi ediyor eğer elli en etmesi etti ettiği ettiğini gibi göre halen hangi hatta hem henüz hep hepsi her herhangi herkesin hiç hiçbir için iki ile ilgili ise işte itibaren itibariyle kadar karşın katrilyon kendi kendilerine kendini kendisi kendisine kendisini kez ki kim kimden kime kimi kimse kırk milyar milyon mu mü mı nasıl ne neden nedenle nerde nerede nereye niye niçin o olan olarak oldu olduğu olduğunu olduklarını olmadı olmadığı olmak olması olmayan olmaz olsa olsun olup olur olursa oluyor on ona ondan onlar onlardan onları onların onu onun otuz oysa öyle pek rağmen sadece sanki sekiz seksen sen senden seni senin siz sizden sizi sizin şey şeyden şeyi şeyler şöyle şu şuna şunda şundan şunları şunu tarafından trilyon tüm üç üzere var vardı ve veya ya yani yapacak yapılan yapılması yapıyor yapmak yaptı yaptığı yaptığını yaptıkları yedi yerine yetmiş yine yirmi yoksa yüz zaten altmýþ altý bazý beþ birþey birþeyi INSERmi kýrk mý nasýl onlari onlarýn yetmiþ þey þeyden þeyi þeyler þu þuna þunda þundan þunu)).freeze
7
7
  CONTRACTIONS = {}.freeze
8
8
  end
9
9
  end
@@ -1,14 +1,14 @@
1
1
  module PragmaticTokenizer
2
2
  class PostProcessor
3
3
 
4
- REGEX_SYMBOL = /[♳ ♴ ♵ ♶ ♷ ♸ ♹ ♺ ⚀ ⚁ ⚂ ⚃ ⚄ ⚅ ☇ ☈ ☉ ☊ ☋ ☌ ☍ ☠ ☢ ☣ ☤ ☥ ☦ ☧ ☀ ☁ ☂ ☃ ☄ ☮ ♔ ♕ ♖ ♗ ♘ ♙ ♚ ⚘ ⚭]/.freeze
5
- REGEXP_COMMAS = /^(,|‚)+/.freeze
6
- REGEXP_SINGLE_QUOTES = /(.+)(’|'|‘|`)$/.freeze
7
- REGEXP_SLASH = /^(?!(https?:|www\.))(.*)\/(.*)/.freeze
8
- REGEXP_QUESTION_MARK = /^(?!(https?:|www\.))(.*)(\?)(.*)/.freeze
9
- REGEXP_PLUS_SIGN = /(.+)\+(.+)/.freeze
10
- REGEXP_COLON = /^(\:)(\S{2,})/.freeze
11
- REGEXP_EMOJI = /(\u{2744}[\u{FE0E}|\u{FE0F}])/.freeze
4
+ REGEX_SYMBOL = /[♳ ♴ ♵ ♶ ♷ ♸ ♹ ♺ ⚀ ⚁ ⚂ ⚃ ⚄ ⚅ ☇ ☈ ☉ ☊ ☋ ☌ ☍ ☠ ☢ ☣ ☤ ☥ ☦ ☧ ☀ ☁ ☂ ☃ ☄ ☮ ♔ ♕ ♖ ♗ ♘ ♙ ♚ ⚘ ⚭]/
5
+ REGEXP_COMMAS = /^(,|‚)+/
6
+ REGEXP_SINGLE_QUOTES = /(.+)(’|'|‘|`)$/
7
+ REGEXP_SLASH = /^(?!(https?:|www\.))(.*)\/(.*)/
8
+ REGEXP_QUESTION_MARK = /^(?!(https?:|www\.))(.*)(\?)(.*)/
9
+ REGEXP_PLUS_SIGN = /(.+)\+(.+)/
10
+ REGEXP_COLON = /^(\:)(\S{2,})/
11
+ REGEXP_EMOJI = /(\u{2744}[\u{FE0E}|\u{FE0F}])/
12
12
 
13
13
  REGEX_UNIFIED1 = Regexp.union(REGEXP_SLASH,
14
14
  REGEXP_QUESTION_MARK,
@@ -16,12 +16,10 @@ module PragmaticTokenizer
16
16
  REGEXP_COLON,
17
17
  REGEXP_EMOJI,
18
18
  PragmaticTokenizer::Languages::Common::PREFIX_EMOJI_REGEX,
19
- PragmaticTokenizer::Languages::Common::POSTFIX_EMOJI_REGEX
20
- ).freeze
19
+ PragmaticTokenizer::Languages::Common::POSTFIX_EMOJI_REGEX)
21
20
 
22
21
  REGEX_UNIFIED2 = Regexp.union(REGEXP_SINGLE_QUOTES,
23
- REGEXP_COMMAS
24
- ).freeze
22
+ REGEXP_COMMAS)
25
23
 
26
24
  attr_reader :text, :abbreviations, :downcase
27
25
 
@@ -96,7 +94,7 @@ module PragmaticTokenizer
96
94
  if downcase
97
95
  token.split(/(\.)/)[0]
98
96
  else
99
- UnicodeCaseConverter::Converter.new(token.split(/(\.)/)[0]).downcase
97
+ UnicodeCaseConverter::downcase(token.split(/(\.)/)[0])
100
98
  end
101
99
  end
102
100
 
@@ -9,9 +9,61 @@ require 'unicode_case_converter'
9
9
  module PragmaticTokenizer
10
10
  class Tokenizer
11
11
 
12
- attr_reader :text, :punctuation, :language_module, :expand_contractions, :numbers, :minimum_length, :downcase, :classic_filter, :filter_languages, :abbreviations, :contractions, :clean, :remove_stop_words, :stop_words, :remove_emoji, :remove_emails, :mentions, :hashtags, :remove_urls, :remove_domains, :long_word_split
12
+ PUNCTIATION_OPTIONS = Set.new([:all, :semi, :none, :only]).freeze
13
+ NUMBERS_OPTIONS = Set.new([:all, :semi, :none, :only]).freeze
14
+ MENTIONS_OPTIONS = Set.new([:keep_original, :keep_and_clean, :remove]).freeze
15
+ MAX_TOKEN_LENGTH = 50
16
+ EMPTY_STRING = ''.freeze
17
+ DOT_STRING = '.'.freeze
18
+ SPACE_STRING = ' '.freeze
19
+ REGEX_DOMAIN = /(\s+|\A)[a-z0-9]{2,}([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}(:[0-9]{1,5})?(\/.*)?/ix
20
+ REGEX_URL = /(http|https)(\.|:)/
21
+ REGEX_HYPHEN = /\-/
22
+ REGEX_UNDERSCORE = /\_/
23
+ REGEX_CONTRACTIONS = /[‘’‚‛‹›'´`]/
24
+ REGEX_APOSTROPHE_S = /['’`́]s$/
25
+ REGEX_EMAIL = /\S+(@|@)\S+\.\S+/
26
+ REGEX_HASHTAG_OR_MENTION = /[@@#|#]/
27
+ REGEX_UNDERSCORE_AT_START = /(?<=\A)\_+/
28
+ REGEX_UNDERSCORE_AT_END = /\_+(?=\z)/
29
+ REGEX_ASTERISK = /\*+/
30
+ REGEX_UNIFIED1 = Regexp.union(REGEX_UNDERSCORE_AT_START,
31
+ REGEX_UNDERSCORE_AT_END,
32
+ REGEX_ASTERISK)
33
+ # https://en.wikipedia.org/wiki/Control_character
34
+ # matches any character with hexadecimal value 00 through 1F or 7F.
35
+ # Rubular: http://rubular.com/r/E83fpBoDjI
36
+ REGEXP_CONTROL = /[[:cntrl:]]/
37
+ REGEXP_ENDING_COLON = /\:(?=\z)/
38
+ REGEXP_EXCLAMATION_AT_START = /(?<=\A)!+(?=.+)/
39
+ REGEXP_EXCLAMATION_AT_END = /!+(1*!*)*(?=\z)/
40
+ REGEXP_HYPHEN_AT_START = /\A(-|–|\u{00AD})/
41
+ REGEXP_SPECIAL_SYMBOL = /[®©]/
42
+ REGEXP_PERCENT_AT_START = /\A\%/
43
+ # https://codepoints.net/enclosed_alphanumeric_supplement
44
+ REGEXP_ALPHANUMERIC_SUPPLEMENT = /[\u{1F100}-\u{1F1FF}]/
45
+ REGEX_UNIFIED2 = Regexp.union(REGEXP_CONTROL,
46
+ REGEXP_ENDING_COLON,
47
+ REGEXP_EXCLAMATION_AT_START,
48
+ REGEXP_EXCLAMATION_AT_END,
49
+ REGEXP_HYPHEN_AT_START,
50
+ REGEXP_SPECIAL_SYMBOL,
51
+ REGEXP_PERCENT_AT_START,
52
+ REGEXP_ALPHANUMERIC_SUPPLEMENT)
53
+ REGEXP_ONE_AS_EXCLAMATION = /(?<=\D)1+(?=\z)/
54
+ REGEXP_HASHTAG_AT_START = /(?<=\A)(#|#)/
55
+ REGEXP_AT_SIGN_AT_START = /(?<=\A)(@|@)/
56
+ REGEXP_HYPHEN_HASTAG = /\A(#|#)\S+-/
57
+ REGEXP_EMOJI_SNOWFLAKE = /\u{2744}[\u{FE0F}|\u{FE0E}]?/
58
+ REGEX_EMOJI_UNIFIED = Regexp.union(REGEXP_EMOJI_SNOWFLAKE,
59
+ PragmaticTokenizer::Languages::Common::EMOJI_REGEX)
60
+ REGEXP_PUNCTUATION_ONLY = /\A[[:punct:]]+\z/
61
+ REGEXP_NUMBER_ONLY = /\A\d+\z/
62
+ REGEXP_NO_NUMBERS = /\A\D+\z/
63
+ REGEXP_NUMBER = /\D*\d+\d*/
64
+ REGEXP_CONSECUTIVE_DOTS = /\A\.{2,}\z/
65
+ REGEXP_CHUNK_STRING = /.{,10000}(?=\s|\z)/m
13
66
 
14
- # @param [String] text to be tokenized
15
67
  # @param [Hash] opts optional arguments
16
68
 
17
69
  # @option opts [Array] :filter_languages - user-supplied array of languages from which that language's stop words, abbreviations and contractions should be used when calculating the resulting tokens - array elements should be of the String class or can be symbols
@@ -41,81 +93,62 @@ module PragmaticTokenizer
41
93
  # @option opts [String] :mentions - :remove (will completely remove it), :keep_and_clean (will prefix) and :keep_original (don't alter the token at all). - can be a String or symbol (i.e. :keep_and_clean or 'keep_and_clean')
42
94
  # @option opts [String] :hashtags - :remove (will completely remove it), :keep_and_clean (will prefix) and :keep_original (don't alter the token at all). - can be a String or symbol (i.e. :keep_and_clean or 'keep_and_clean')
43
95
  # @option opts [Boolean] :downcase - (default: true)
96
+ # @option opts [Boolean] :clean - (default: false)
44
97
  # @option opts [Boolean] :classic_filter - removes dots from acronyms and 's from the end of tokens - (default: false)
45
98
  # @option opts [Boolean] :remove_emoji - (default: false)
46
99
  # @option opts [Boolean] :remove_emails - (default: false)
47
100
  # @option opts [Boolean] :remove_urls - (default: false)
48
101
  # @option opts [Boolean] :remove_domains - (default: false)
49
102
 
50
- def initialize(text, opts={})
51
- @text = CGI.unescapeHTML(text)
52
- @filter_languages = opts[:filter_languages] || []
53
- @language = opts[:language] || 'en'
54
- @language_module = Languages.get_language_by_code(@language.to_s)
55
- @expand_contractions = opts[:expand_contractions] || false
56
- @remove_stop_words = opts[:remove_stop_words] || false
57
- if @filter_languages.empty?
58
- @abbreviations = opts[:abbreviations] || @language_module::ABBREVIATIONS
59
- @contractions = opts[:contractions] || @language_module::CONTRACTIONS
60
- @stop_words = opts[:stop_words] || @language_module::STOP_WORDS
61
- else
62
- merged_abbreviations = []
63
- @filter_languages.map { |l| merged_abbreviations << Languages.get_language_by_code(l.to_s)::ABBREVIATIONS.flatten }
64
- merged_abbreviations << opts[:abbreviations].flatten unless opts[:abbreviations].nil?
65
- @abbreviations = merged_abbreviations.flatten
103
+ def initialize(opts={})
104
+ @filter_languages = opts[:filter_languages] || []
105
+ @language_module = Languages.get_language_by_code(opts[:language])
106
+ @expand_contractions = opts[:expand_contractions]
107
+ @remove_stop_words = opts[:remove_stop_words]
108
+ @punctuation = opts[:punctuation] ? opts[:punctuation].to_sym : :all
109
+ @numbers = opts[:numbers] ? opts[:numbers].to_sym : :all
110
+ @minimum_length = opts[:minimum_length] || 0
111
+ @long_word_split = opts[:long_word_split]
112
+ @mentions = opts[:mentions] ? opts[:mentions].to_sym : :keep_original
113
+ @hashtags = opts[:hashtags] ? opts[:hashtags].to_sym : :keep_original
114
+ @downcase = opts[:downcase].nil? ? true : opts[:downcase]
115
+ @clean = opts[:clean]
116
+ @classic_filter = opts[:classic_filter]
117
+ @remove_emoji = opts[:remove_emoji]
118
+ @remove_emails = opts[:remove_emails]
119
+ @remove_urls = opts[:remove_urls]
120
+ @remove_domains = opts[:remove_domains]
121
+ @contractions = opts[:contractions] || {}
122
+ @abbreviations = Set.new(opts[:abbreviations])
123
+ @stop_words = Set.new(opts[:stop_words])
66
124
 
67
- merged_contractions = {}
68
- @filter_languages.map { |l| merged_contractions = merged_contractions.merge(Languages.get_language_by_code(l.to_s)::CONTRACTIONS) }
69
- merged_contractions = merged_contractions.merge(opts[:contractions]) unless opts[:contractions].nil?
70
- @contractions = merged_contractions
125
+ # TODO: why do we treat stop words differently than abbreviations and contractions? (we don't use @language_module::STOP_WORDS when passing @filter_languages)
126
+ @contractions.merge!(@language_module::CONTRACTIONS) if @contractions.empty?
127
+ @abbreviations += @language_module::ABBREVIATIONS if @abbreviations.empty?
128
+ @stop_words += @language_module::STOP_WORDS if @stop_words.empty? && @filter_languages.empty?
71
129
 
72
- merged_stop_words = []
73
- @filter_languages.map { |l| merged_stop_words << Languages.get_language_by_code(l.to_s)::STOP_WORDS.flatten }
74
- merged_stop_words << opts[:stop_words].flatten unless opts[:stop_words].nil?
75
- @stop_words = merged_stop_words.flatten
130
+ @filter_languages.each do |lang|
131
+ language = Languages.get_language_by_code(lang)
132
+ @contractions.merge!(language::CONTRACTIONS)
133
+ @abbreviations += language::ABBREVIATIONS
134
+ @stop_words += language::STOP_WORDS
76
135
  end
77
- @punctuation = opts[:punctuation] || 'all'
78
- @numbers = opts[:numbers] || 'all'
79
- @minimum_length = opts[:minimum_length] || 0
80
- @long_word_split = opts[:long_word_split]
81
- @mentions = opts[:mentions] || 'keep_original'
82
- @hashtags = opts[:hashtags] || 'keep_original'
83
- @downcase = opts[:downcase].nil? ? true : opts[:downcase]
84
- @clean = opts[:clean] || false
85
- @classic_filter = opts[:classic_filter] || false
86
- @remove_emoji = opts[:remove_emoji] || false
87
- @remove_emails = opts[:remove_emails] || false
88
- @remove_urls = opts[:remove_urls] || false
89
- @remove_domains = opts[:remove_domains] || false
90
136
 
91
- unless punctuation.to_s.eql?('all') ||
92
- punctuation.to_s.eql?('semi') ||
93
- punctuation.to_s.eql?('none') ||
94
- punctuation.to_s.eql?('only')
95
- raise "Punctuation argument can be only be nil, 'all', 'semi', 'none', or 'only'"
96
- end
97
- unless numbers.to_s.eql?('all') ||
98
- numbers.to_s.eql?('semi') ||
99
- numbers.to_s.eql?('none') ||
100
- numbers.to_s.eql?('only')
101
- raise "Numbers argument can be only be nil, 'all', 'semi', 'none', or 'only'"
102
- end
103
- unless mentions.to_s.eql?('keep_original') ||
104
- mentions.to_s.eql?('keep_and_clean') ||
105
- mentions.to_s.eql?('remove')
106
- raise "Mentions argument can be only be nil, 'keep_original', 'keep_and_clean', or 'remove'"
107
- end
108
- raise "In Pragmatic Tokenizer text must be a String" unless text.class == String
109
- raise "In Pragmatic Tokenizer minimum_length must be an Integer" unless minimum_length.class == Fixnum || minimum_length.nil?
110
- raise "In Pragmatic Tokenizer long_word_split must be an Integer" unless long_word_split.class == Fixnum || long_word_split.nil?
137
+ raise "Punctuation argument can be only be nil, :all, :semi, :none, or :only" unless PUNCTIATION_OPTIONS.include?(@punctuation)
138
+ raise "Numbers argument can be only be nil, :all, :semi, :none, or :only" unless NUMBERS_OPTIONS.include?(@numbers)
139
+ raise "Mentions argument can be only be nil, :keep_original, :keep_and_clean, or :remove" unless MENTIONS_OPTIONS.include?(@mentions)
140
+ raise "In Pragmatic Tokenizer minimum_length must be an Integer" unless @minimum_length.class == Fixnum || @minimum_length.nil?
141
+ raise "In Pragmatic Tokenizer long_word_split must be an Integer" unless @long_word_split.class == Fixnum || @long_word_split.nil?
111
142
  end
112
143
 
113
- def tokenize
144
+ # @param [String] text to be tokenized
145
+
146
+ def tokenize(text)
114
147
  return [] unless text
115
- text
116
- .scan(/.{,10000}(?=\s|\z)/m)
117
- .map { |segment| post_process(pre_process(segment)) }
118
- .flatten
148
+ raise "In Pragmatic Tokenizer text must be a String" unless text.class == String
149
+ CGI.unescapeHTML(text)
150
+ .scan(REGEXP_CHUNK_STRING)
151
+ .flat_map { |segment| post_process(pre_process(segment)) }
119
152
  end
120
153
 
121
154
  private
@@ -123,171 +156,146 @@ module PragmaticTokenizer
123
156
  def pre_process(text)
124
157
  text
125
158
  .extend(PragmaticTokenizer::PreProcessor)
126
- .pre_process(language: language_module)
159
+ .pre_process(language: @language_module)
127
160
  end
128
161
 
129
162
  def post_process(text)
130
- if downcase
131
- @tokens = PostProcessor.new(text: UnicodeCaseConverter::Converter.new(text).downcase, abbreviations: abbreviations, downcase: downcase).post_process
132
- else
133
- @tokens = PostProcessor.new(text: text, abbreviations: abbreviations, downcase: downcase).post_process
134
- end
135
- expand_contractions!(contractions) if expand_contractions
136
- clean! if clean
137
- classic_filter! if classic_filter
163
+ @tokens = run_post_processor(text)
164
+ remove_various!
138
165
  process_numbers!
139
- remove_short_tokens! if minimum_length > 0
140
166
  process_punctuation!
141
- remove_stop_words!(stop_words) if remove_stop_words
142
- remove_emoji! if remove_emoji
143
- remove_emails! if remove_emails
144
- mentions! if mentions
145
- hashtags! if hashtags
146
- remove_urls! if remove_urls
147
- remove_domains! if remove_domains
148
- split_long_words! if long_word_split
167
+ expand_contractions! if @expand_contractions
168
+ clean! if @clean
169
+ classic_filter! if @classic_filter
170
+ remove_short_tokens! if @minimum_length > 0
171
+ remove_stop_words! if @remove_stop_words
172
+ mentions! if @mentions
173
+ hashtags! if @hashtags
174
+ split_long_words! if @long_word_split
149
175
  @tokens.reject(&:empty?)
150
176
  end
151
177
 
152
- def expand_contractions!(contractions)
153
- @tokens = if downcase
154
- @tokens.flat_map do |t|
155
- if contractions.key?(t.gsub(/[‘’‚‛‹›'´`]/, "'"))
156
- contractions[t.gsub(/[‘’‚‛‹›'´`]/, "'")]
157
- .split(' ')
158
- .flatten
159
- else
160
- t
161
- end
162
- end
163
- else
164
- @tokens.flat_map do |t|
165
- if contractions.key?(UnicodeCaseConverter::Converter.new(t.gsub(/[‘’‚‛‹›'´`]/, "'")).downcase)
166
- contractions[UnicodeCaseConverter::Converter.new(t.gsub(/[‘’‚‛‹›'´`]/, "'")).downcase]
167
- .split(' ')
168
- .each_with_index
169
- .map { |token, i| i.eql?(0) ? UnicodeCaseConverter::Converter.new(token).capitalize : token }
170
- .flatten
171
- else
172
- t
173
- end
174
- end
175
- end
178
+ def run_post_processor(text)
179
+ PostProcessor.new(
180
+ text: chosen_case(text),
181
+ abbreviations: @abbreviations,
182
+ downcase: @downcase
183
+ ).post_process
184
+ end
185
+
186
+ def expand_contractions!
187
+ @tokens = @tokens.flat_map { |t| expand_token_contraction(t) }
188
+ end
189
+
190
+ def expand_token_contraction(token)
191
+ normalized = inverse_case(token.gsub(REGEX_CONTRACTIONS, "'".freeze))
192
+ return token unless @contractions.key?(normalized)
193
+ result = @contractions[normalized].split(SPACE_STRING)
194
+ result[0] = UnicodeCaseConverter::capitalize(result[0]) unless @downcase
195
+ result
176
196
  end
177
197
 
178
198
  def clean!
179
- @tokens = @tokens.flat_map { |t| (t !~ /[@@#|#]/ && t =~ /(?<=\s)\_+/) ? t.gsub!(/(?<=\s)\_+/, ' \1').split(' ').flatten : t }
180
- .flat_map { |t| (t !~ /[@@#|#]/ && t =~ /\_+(?=\s)/) ? t.gsub!(/\_+(?=\s)/, ' \1').split(' ').flatten : t }
181
- .flat_map { |t| (t !~ /[@@#|#]/ && t =~ /(?<=\A)\_+/) ? t.gsub!(/(?<=\A)\_+/, '\1 ').split(' ').flatten : t }
182
- .flat_map { |t| (t !~ /[@@#|#]/ && t =~ /\_+(?=\z)/) ? t.gsub!(/\_+(?=\z)/, ' \1').split(' ').flatten : t }
183
- .flat_map { |t| (t !~ /[@@#|#]/ && t =~ /\*+/) ? t.gsub!(/\*+/, '\1 ').split(' ').flatten : t }
184
- .map { |t| t.gsub(/[[:cntrl:]]/, '') }
185
- .map { |t| t.gsub(/(?<=\A)\:(?=.+)/, '') }
186
- .map { |t| t.gsub(/\:(?=\z)/, '') }
187
- .map { |t| t.gsub(/(?<=\A)!+(?=.+)/, '') }
188
- .map { |t| t !~ /[@@#|#]/ ? t.gsub(/(?<=\D)1+(?=\z)/, '') : t }
189
- .map { |t| t.gsub(/!+(?=\z)/, '') }
190
- .map { |t| t.gsub(/!+(1*!*)*(?=\z)/, '') }
191
- .map { |t| t.gsub(/\u{00AD}/, '') }
192
- .map { |t| t.gsub(/\A(-|–)/, '') }
193
- .map { |t| t.gsub(/[®©]/, '') }
194
- .map { |t| t.gsub(/\A\%/, '') }
195
- .map { |t| t.gsub(/[\u{1F100}-\u{1F1FF}]/, '') }
196
- .delete_if do |t|
197
- t =~ /\A-+\z/ ||
198
- PragmaticTokenizer::Languages::Common::SPECIAL_CHARACTERS.include?(t) ||
199
- t =~ /\A\.{2,}\z/ || t.include?("\\") ||
200
- t.length > 50 ||
201
- (t.length > 1 && t =~ /[&*+<=>^|~]/i) ||
202
- (t.length == 1 && t =~ /\:/)
203
- end
199
+ @tokens = @tokens
200
+ .flat_map { |t| t !~ REGEX_HASHTAG_OR_MENTION ? t.split(REGEX_UNIFIED1) : t }
201
+ .map! { |t| t !~ REGEX_HASHTAG_OR_MENTION ? t.gsub(REGEXP_ONE_AS_EXCLAMATION, EMPTY_STRING) : t }
202
+ .map! { |t| t.gsub(REGEX_UNIFIED2, EMPTY_STRING) }
203
+ .delete_if { |t| unclean_token?(t) }
204
+ end
205
+
206
+ def unclean_token?(token)
207
+ return true if PragmaticTokenizer::Languages::Common::SPECIAL_CHARACTERS.include?(token)
208
+ return true if token.length > MAX_TOKEN_LENGTH
209
+ return true if token.include?('\\'.freeze)
210
+ token =~ REGEXP_CONSECUTIVE_DOTS
204
211
  end
205
212
 
206
213
  def classic_filter!
207
- @tokens.map! { |t| abbreviations.include?(t.chomp(".")) ? t.delete('.').chomp("'s").chomp("’s").chomp("`s").chomp("́s") : t.chomp("'s").chomp("’s").chomp("`s").chomp("́s") }
214
+ @tokens.map! do |token|
215
+ token.delete!(DOT_STRING) if @abbreviations.include?(token.chomp(DOT_STRING))
216
+ token.sub!(REGEX_APOSTROPHE_S, EMPTY_STRING)
217
+ token
218
+ end
208
219
  end
209
220
 
210
221
  def process_numbers!
211
- case numbers.to_s
212
- when 'semi'
213
- @tokens.delete_if { |t| t =~ /\A\d+\z/ }
214
- when 'none'
215
- if downcase
216
- @tokens.delete_if { |t| t =~ /\D*\d+\d*/ || PragmaticTokenizer::Languages::Common::ROMAN_NUMERALS.include?(t) || PragmaticTokenizer::Languages::Common::ROMAN_NUMERALS.include?("#{t}.") }
217
- else
218
- @tokens.delete_if { |t| t =~ /\D*\d+\d*/ || PragmaticTokenizer::Languages::Common::ROMAN_NUMERALS.include?(UnicodeCaseConverter::Converter.new(t).downcase) || PragmaticTokenizer::Languages::Common::ROMAN_NUMERALS.include?("#{UnicodeCaseConverter::Converter.new(t).downcase}.") }
219
- end
220
- when 'only'
221
- @tokens.delete_if { |t| t =~ /\A\D+\z/ }
222
+ case @numbers
223
+ when :semi
224
+ @tokens.delete_if { |t| t =~ REGEXP_NUMBER_ONLY }
225
+ when :none
226
+ @tokens.delete_if { |t| t =~ REGEXP_NUMBER || PragmaticTokenizer::Languages::Common::ROMAN_NUMERALS.include?(inverse_case(t)) }
227
+ when :only
228
+ @tokens.delete_if { |t| t =~ REGEXP_NO_NUMBERS }
222
229
  end
223
230
  end
224
231
 
225
232
  def remove_short_tokens!
226
- @tokens.delete_if { |t| t.length < minimum_length }
233
+ @tokens.delete_if { |t| t.length < @minimum_length }
227
234
  end
228
235
 
229
236
  def process_punctuation!
230
- case punctuation.to_s
231
- when 'semi'
232
- @tokens -= PragmaticTokenizer::Languages::Common::SEMI_PUNCTUATION
233
- when 'none'
234
- @tokens = @tokens.delete_if { |t| t =~ /\A[[:punct:]]+\z/ || t =~ /\A(‹+|\^+|›+|\++)\z/ } - PragmaticTokenizer::Languages::Common::PUNCTUATION
235
- when 'only'
236
- @tokens.delete_if { |t| !PragmaticTokenizer::Languages::Common::PUNCTUATION.include?(t) }
237
+ case @punctuation
238
+ when :semi
239
+ @tokens.delete_if { |t| PragmaticTokenizer::Languages::Common::SEMI_PUNCTUATION.include?(t) }
240
+ when :none
241
+ @tokens.delete_if { |t| PragmaticTokenizer::Languages::Common::PUNCTUATION.include?(t) || t =~ REGEXP_PUNCTUATION_ONLY }
242
+ when :only
243
+ @tokens.keep_if { |t| PragmaticTokenizer::Languages::Common::PUNCTUATION.include?(t) }
237
244
  end
238
245
  end
239
246
 
240
- def remove_stop_words!(stop_words)
241
- if downcase
242
- @tokens -= stop_words
243
- else
244
- @tokens.delete_if { |t| stop_words.include?(UnicodeCaseConverter::Converter.new(t).downcase) }
245
- end
247
+ def remove_stop_words!
248
+ @tokens.delete_if { |token| @stop_words.include?(inverse_case(token)) }
246
249
  end
247
250
 
248
- def remove_emoji!
249
- @tokens.delete_if do |t|
250
- t =~ PragmaticTokenizer::Languages::Common::EMOJI_REGEX ||
251
- t =~ /\u{2744}\u{FE0F}/ ||
252
- t =~ /\u{2744}\u{FE0E}/ ||
253
- t =~ /\u{2744}/
251
+ def mentions!
252
+ case @mentions
253
+ when :remove
254
+ @tokens.delete_if { |t| t =~ REGEXP_AT_SIGN_AT_START }
255
+ when :keep_and_clean
256
+ @tokens.map! { |t| t =~ REGEXP_AT_SIGN_AT_START ? t.gsub!(REGEXP_AT_SIGN_AT_START, EMPTY_STRING) : t }
254
257
  end
255
258
  end
256
259
 
257
- def remove_emails!
258
- @tokens.delete_if { |t| t =~ /\S+(@|@)\S+\.\S+/ }.map { |t| t.chomp('.') }
260
+ def hashtags!
261
+ case @hashtags
262
+ when :remove
263
+ @tokens.delete_if { |t| t =~ REGEXP_HASHTAG_AT_START }
264
+ when :keep_and_clean
265
+ @tokens = @tokens
266
+ .flat_map { |t| t =~ REGEXP_HYPHEN_HASTAG ? t.split(REGEX_HYPHEN) : t }
267
+ .map { |t| t =~ REGEXP_HASHTAG_AT_START ? t.gsub!(REGEXP_HASHTAG_AT_START, EMPTY_STRING) : t }
268
+ end
259
269
  end
260
270
 
261
- def mentions!
262
- case mentions.to_s
263
- when 'remove'
264
- @tokens.delete_if { |t| t =~ /\A(@|@)/ }
265
- when 'keep_and_clean'
266
- @tokens.map! { |t| t =~ /\A(@|@)/ ? t.gsub!(/(?<=\A)(@|@)/, '') : t }
267
- end
271
+ def remove_various!
272
+ @tokens.delete_if { |t| t =~ regex_various }
268
273
  end
269
274
 
270
- def hashtags!
271
- case hashtags.to_s
272
- when 'remove'
273
- @tokens.delete_if { |t| t =~ /\A(#|#)/ }
274
- when 'keep_and_clean'
275
- @tokens = @tokens.flat_map { |t| t =~ /\A(#|#)\S+-/ ? t.gsub(/\-/, '\1 \2').split(' ').flatten : t }
276
- @tokens.map! { |t| t =~ /\A(#|#)/ ? t.gsub!(/(?<=\A)(#|#)/, '') : t }
275
+ def regex_various
276
+ @regex_various ||= begin
277
+ regex_array = []
278
+ regex_array << REGEX_EMOJI_UNIFIED if @remove_emoji
279
+ regex_array << REGEX_EMAIL if @remove_emails
280
+ regex_array << REGEX_URL if @remove_urls
281
+ regex_array << REGEX_DOMAIN if @remove_domains
282
+ Regexp.union(regex_array)
277
283
  end
278
284
  end
279
285
 
280
- def remove_urls!
281
- @tokens.delete_if { |t| t =~ /(http|https)(\.|:)/ }
286
+ def split_long_words!
287
+ @tokens = @tokens
288
+ .flat_map { |t| t.length > @long_word_split ? t.split(REGEX_HYPHEN) : t }
289
+ .flat_map { |t| t.length > @long_word_split ? t.split(REGEX_UNDERSCORE) : t }
282
290
  end
283
291
 
284
- def remove_domains!
285
- @tokens.delete_if { |t| t =~ /(\s+|\A)[a-z0-9]{2,}([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}(:[0-9]{1,5})?(\/.*)?/ix }
292
+ def chosen_case(token)
293
+ @downcase ? UnicodeCaseConverter::downcase(token) : token
286
294
  end
287
295
 
288
- def split_long_words!
289
- @tokens.map! { |t| t.length > long_word_split ? t.gsub(/\-/, '\1 \2').split(' ').flatten : t }
290
- .map! { |t| t.length > long_word_split ? t.gsub(/\_/, '\1 \2').split(' ').flatten : t }
296
+ def inverse_case(token)
297
+ @downcase ? token : UnicodeCaseConverter::downcase(token)
291
298
  end
299
+
292
300
  end
293
- end
301
+ end