pragmatic_tokenizer 3.0.3 → 3.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/README.md +1 -1
- data/lib/pragmatic_tokenizer/languages.rb +26 -26
- data/lib/pragmatic_tokenizer/languages/arabic.rb +2 -2
- data/lib/pragmatic_tokenizer/languages/bulgarian.rb +3 -3
- data/lib/pragmatic_tokenizer/languages/common.rb +14 -24
- data/lib/pragmatic_tokenizer/languages/czech.rb +2 -2
- data/lib/pragmatic_tokenizer/languages/danish.rb +2 -2
- data/lib/pragmatic_tokenizer/languages/deutsch.rb +3 -93
- data/lib/pragmatic_tokenizer/languages/dutch.rb +2 -2
- data/lib/pragmatic_tokenizer/languages/english.rb +11 -14
- data/lib/pragmatic_tokenizer/languages/finnish.rb +2 -2
- data/lib/pragmatic_tokenizer/languages/french.rb +36 -9
- data/lib/pragmatic_tokenizer/languages/greek.rb +2 -2
- data/lib/pragmatic_tokenizer/languages/indonesian.rb +2 -2
- data/lib/pragmatic_tokenizer/languages/italian.rb +1 -1
- data/lib/pragmatic_tokenizer/languages/norwegian.rb +2 -2
- data/lib/pragmatic_tokenizer/languages/persian.rb +2 -2
- data/lib/pragmatic_tokenizer/languages/polish.rb +2 -2
- data/lib/pragmatic_tokenizer/languages/portuguese.rb +1 -1
- data/lib/pragmatic_tokenizer/languages/romanian.rb +2 -2
- data/lib/pragmatic_tokenizer/languages/russian.rb +3 -3
- data/lib/pragmatic_tokenizer/languages/slovak.rb +2 -2
- data/lib/pragmatic_tokenizer/languages/swedish.rb +2 -2
- data/lib/pragmatic_tokenizer/languages/turkish.rb +2 -2
- data/lib/pragmatic_tokenizer/post_processor.rb +42 -88
- data/lib/pragmatic_tokenizer/pre_processor.rb +33 -142
- data/lib/pragmatic_tokenizer/regex.rb +149 -0
- data/lib/pragmatic_tokenizer/tokenizer.rb +82 -116
- data/lib/pragmatic_tokenizer/version.rb +1 -1
- data/pragmatic_tokenizer.gemspec +5 -6
- data/spec/languages/deutsch_spec.rb +1 -1
- data/spec/languages/english_spec.rb +52 -0
- data/spec/languages/french_spec.rb +2 -2
- data/spec/performance_spec.rb +1 -1
- data/spec/spec_helper.rb +1 -1
- metadata +8 -8
- data/lib/pragmatic_tokenizer/full_stop_separator.rb +0 -63
@@ -3,8 +3,8 @@ module PragmaticTokenizer
|
|
3
3
|
module Persian
|
4
4
|
include Languages::Common
|
5
5
|
ABBREVIATIONS = Set.new([]).freeze
|
6
|
-
STOP_WORDS
|
7
|
-
CONTRACTIONS
|
6
|
+
STOP_WORDS = Set.new(%w[و در به از كه مي اين است را با هاي براي آن يك شود شده خود ها كرد شد اي تا كند بر بود گفت نيز وي هم كنند دارد ما كرده يا اما بايد دو اند هر خواهد او مورد آنها باشد ديگر مردم نمي بين پيش پس اگر همه صورت يكي هستند بي من دهد هزار نيست استفاده داد داشته راه داشت چه همچنين كردند داده بوده دارند همين ميليون سوي شوند بيشتر بسيار روي گرفته هايي تواند اول نام هيچ چند جديد بيش شدن كردن كنيم نشان حتي اينكه ولی توسط چنين برخي نه ديروز دوم درباره بعد مختلف گيرد شما گفته آنان بار طور گرفت دهند گذاري بسياري طي بودند ميليارد بدون تمام كل تر براساس شدند ترين امروز باشند ندارد چون قابل گويد ديگري همان خواهند قبل آمده اكنون تحت طريق گيري جاي هنوز چرا البته كنيد سازي سوم كنم بلكه زير توانند ضمن فقط بودن حق آيد وقتي اش يابد نخستين مقابل خدمات امسال تاكنون مانند تازه آورد فكر آنچه نخست نشده شايد چهار جريان پنج ساخته زيرا نزديك برداري كسي ريزي رفت گردد مثل آمد ام بهترين دانست كمتر دادن تمامي جلوگيري بيشتري ايم ناشي چيزي آنكه بالا بنابراين ايشان بعضي دادند داشتند برخوردار نخواهد هنگام نبايد غير نبود ديده وگو داريم چگونه بندي خواست فوق ده نوعي هستيم ديگران همچنان سراسر ندارند گروهي سعي روزهاي آنجا يكديگر كردم بيست بروز سپس رفته آورده نمايد باشيم گويند زياد خويش همواره گذاشته شش نداشته شناسي خواهيم آباد داشتن نظير همچون باره نكرده شان سابق هفت دانند جايي بی جز زیرِ رویِ سریِ تویِ جلویِ پیشِ عقبِ بالایِ خارجِ وسطِ بیرونِ سویِ کنارِ پاعینِ نزدِ نزدیکِ دنبالِ حدودِ برابرِ طبقِ مانندِ ضدِّ هنگامِ برایِ مثلِ بارة اثرِ تولِ علّتِ سمتِ عنوانِ قصدِ روب جدا کی که چیست هست کجا کجاست کَی چطور کدام آیا مگر چندین یک چیزی دیگر کسی بعری هیچ چیز جا کس هرگز یا تنها بلکه خیاه بله بلی آره آری مرسی البتّه لطفاً ّه انکه وقتیکه همین پیش مدّتی هنگامی مان تان]).freeze
|
7
|
+
CONTRACTIONS = {}.freeze
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
@@ -3,8 +3,8 @@ module PragmaticTokenizer
|
|
3
3
|
module Polish
|
4
4
|
include Languages::Common
|
5
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
|
7
|
-
CONTRACTIONS
|
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
|
+
CONTRACTIONS = {}.freeze
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
@@ -3,7 +3,7 @@ module PragmaticTokenizer
|
|
3
3
|
module Portuguese
|
4
4
|
include Languages::Common
|
5
5
|
ABBREVIATIONS = Set.new([]).freeze
|
6
|
-
STOP_WORDS = Set.new(%w
|
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
|
@@ -3,8 +3,8 @@ module PragmaticTokenizer
|
|
3
3
|
module Romanian
|
4
4
|
include Languages::Common
|
5
5
|
ABBREVIATIONS = Set.new([]).freeze
|
6
|
-
STOP_WORDS
|
7
|
-
CONTRACTIONS
|
6
|
+
STOP_WORDS = Set.new(%w[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
|
+
CONTRACTIONS = {}.freeze
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
@@ -2,9 +2,9 @@ module PragmaticTokenizer
|
|
2
2
|
module Languages
|
3
3
|
module Russian
|
4
4
|
include Languages::Common
|
5
|
-
ABBREVIATIONS = Set.new([
|
6
|
-
STOP_WORDS
|
7
|
-
CONTRACTIONS
|
5
|
+
ABBREVIATIONS = Set.new(%w[y y.e а авт адм.-терр акад в вв вкз вост.-европ г гг гос гр д деп дисс дол долл ежедн ж жен з зап зап.-европ заруб и ин иностр инст к канд кв кг куб л л.h л.н м мин моск муж н нед о п пгт пер пп пр просп проф р руб с сек см спб стр т тел тов тт тыс у у.е ул ф ч]).freeze
|
6
|
+
STOP_WORDS = Set.new(%w[а е и ж м о на не ни об но он мне мои мож она они оно мной много многочисленное многочисленная многочисленные многочисленный мною мой мог могут можно может можхо мор моя моё мочь над нее оба нам нем нами ними мимо немного одной одного менее однажды однако меня нему меньше ней наверху него ниже мало надо один одиннадцать одиннадцатый назад наиболее недавно миллионов недалеко между низко меля нельзя нибудь непрерывно наконец никогда никуда нас наш нет нею неё них мира наша наше наши ничего начала нередко несколько обычно опять около мы ну нх от отовсюду особенно нужно очень отсюда в во вон вниз внизу вокруг вот восемнадцать восемнадцатый восемь восьмой вверх вам вами важное важная важные важный вдали везде ведь вас ваш ваша ваше ваши впрочем весь вдруг вы все второй всем всеми времени время всему всего всегда всех всею всю вся всё всюду г год говорил говорит года году где да ее за из ли же им до по ими под иногда довольно именно долго позже более должно пожалуйста значит иметь больше пока ему имя пор пора потом потому после почему почти посреди ей два две двенадцать двенадцатый двадцать двадцатый двух его дел или без день занят занята занято заняты действительно давно девятнадцать девятнадцатый девять девятый даже алло жизнь далеко близко здесь дальше для лет зато даром первый перед затем зачем лишь десять десятый ею её их бы еще при был про процентов против просто бывает бывь если люди была были было будем будет будете будешь прекрасно буду будь будто будут ещё пятнадцать пятнадцатый друго другое другой другие другая других есть пять быть лучше пятый к ком конечно кому кого когда которой которого которая которые который которых кем каждое каждая каждые каждый кажется как какой какая кто кроме куда кругом с т у я та те уж со то том снова тому совсем того тогда тоже собой тобой собою тобою сначала только уметь тот тою хорошо хотеть хочешь хоть хотя свое свои твой своей своего своих свою твоя твоё раз уже сам там тем чем сама сами теми само рано самом самому самой самого семнадцать семнадцатый самим самими самих саму семь чему раньше сейчас чего сегодня себе тебе сеаой человек разве теперь себя тебя седьмой спасибо слишком так такое такой такие также такая сих тех чаще четвертый через часто шестой шестнадцать шестнадцатый шесть четыре четырнадцать четырнадцатый сколько сказал сказала сказать ту ты три эта эти что это чтоб этом этому этой этого чтобы этот стал туда этим этими рядом тринадцать тринадцатый этих третий тут эту суть чуть тысяч]).freeze
|
7
|
+
CONTRACTIONS = {}.freeze
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
@@ -3,8 +3,8 @@ module PragmaticTokenizer
|
|
3
3
|
module Slovak
|
4
4
|
include Languages::Common
|
5
5
|
ABBREVIATIONS = Set.new([]).freeze
|
6
|
-
STOP_WORDS
|
7
|
-
CONTRACTIONS
|
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
|
+
CONTRACTIONS = {}.freeze
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
@@ -3,8 +3,8 @@ module PragmaticTokenizer
|
|
3
3
|
module Swedish
|
4
4
|
include Languages::Common
|
5
5
|
ABBREVIATIONS = Set.new([]).freeze
|
6
|
-
STOP_WORDS
|
7
|
-
CONTRACTIONS
|
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
|
+
CONTRACTIONS = {}.freeze
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
@@ -3,8 +3,8 @@ module PragmaticTokenizer
|
|
3
3
|
module Turkish
|
4
4
|
include Languages::Common
|
5
5
|
ABBREVIATIONS = Set.new([]).freeze
|
6
|
-
STOP_WORDS
|
7
|
-
CONTRACTIONS
|
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
|
+
CONTRACTIONS = {}.freeze
|
8
8
|
end
|
9
9
|
end
|
10
10
|
end
|
@@ -1,115 +1,69 @@
|
|
1
1
|
module PragmaticTokenizer
|
2
2
|
class PostProcessor
|
3
3
|
|
4
|
-
|
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
|
-
|
13
|
-
REGEX_UNIFIED1 = Regexp.union(REGEXP_SLASH,
|
14
|
-
REGEXP_QUESTION_MARK,
|
15
|
-
REGEXP_PLUS_SIGN,
|
16
|
-
REGEXP_COLON,
|
17
|
-
REGEXP_EMOJI,
|
18
|
-
PragmaticTokenizer::Languages::Common::PREFIX_EMOJI_REGEX,
|
19
|
-
PragmaticTokenizer::Languages::Common::POSTFIX_EMOJI_REGEX)
|
20
|
-
|
21
|
-
REGEX_UNIFIED2 = Regexp.union(REGEXP_SINGLE_QUOTES,
|
22
|
-
REGEXP_COMMAS)
|
23
|
-
REGEXP_UNKNOWN1 = /(?<=\S)([。.!!??]+)$/
|
4
|
+
DOT = '.'.freeze
|
24
5
|
|
25
6
|
attr_reader :text, :abbreviations, :downcase
|
26
7
|
|
27
8
|
def initialize(text:, abbreviations:, downcase:)
|
28
|
-
@text
|
29
|
-
@abbreviations
|
30
|
-
@downcase
|
9
|
+
@text = text
|
10
|
+
@abbreviations = abbreviations
|
11
|
+
@downcase = downcase
|
31
12
|
end
|
32
13
|
|
33
|
-
|
34
|
-
|
14
|
+
# Every #flat_map will increase memory usage, we should try to merge whatever can be merged
|
15
|
+
# We need to run #split(Regex::ENDS_WITH_PUNCTUATION2) before AND after #split(Regex::VARIOUS), can this be fixed?
|
16
|
+
def call
|
17
|
+
text
|
18
|
+
.split
|
19
|
+
.map { |token| convert_sym_to_punct(token) }
|
20
|
+
.flat_map { |token| token.split(Regex::COMMAS_OR_PUNCTUATION) }
|
21
|
+
.flat_map { |token| token.split(Regex::VARIOUS) }
|
22
|
+
.flat_map { |token| token.split(Regex::ENDS_WITH_PUNCTUATION2) }
|
23
|
+
.flat_map { |token| split_dotted_email_or_digit(token) }
|
24
|
+
.flat_map { |token| split_abbreviations(token) }
|
25
|
+
.flat_map { |token| split_period_after_last_word(token) }
|
35
26
|
end
|
36
27
|
|
37
28
|
private
|
38
29
|
|
39
|
-
def
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
def separate_ending_punctuation(tokens)
|
46
|
-
tokens.flat_map { |token| token.split(REGEXP_UNKNOWN1) }
|
47
|
-
end
|
48
|
-
|
49
|
-
def unified1
|
50
|
-
proc { |token| token.split(REGEX_UNIFIED1) }
|
51
|
-
end
|
52
|
-
|
53
|
-
def full_stop_separated_tokens
|
54
|
-
FullStopSeparator.new(tokens: split_and_convert_commas_and_quotes, abbreviations: abbreviations, downcase: downcase).separate
|
55
|
-
end
|
56
|
-
|
57
|
-
def split_and_convert_commas_and_quotes
|
58
|
-
text
|
59
|
-
.split
|
60
|
-
.flat_map { |token| token.split(REGEX_UNIFIED2) }
|
61
|
-
.flat_map { |token| convert_sym_to_punct(token) }
|
62
|
-
end
|
63
|
-
|
64
|
-
def split_emoji
|
65
|
-
proc { |token| (token =~ /(\A|\S)\u{2744}[^\u{FE0E}|\u{FE0F}]/) ? token.split(/(\u{2744})/) : token }
|
66
|
-
end
|
67
|
-
|
68
|
-
def split_unknown_period1
|
69
|
-
proc { |token| unknown_period1?(token) ? token.split(/(.*\.)/) : token }
|
30
|
+
def convert_sym_to_punct(token)
|
31
|
+
PragmaticTokenizer::Languages::Common::PUNCTUATION_MAP
|
32
|
+
.each { |pattern, replacement| break if token.sub!(replacement, pattern) }
|
33
|
+
token
|
70
34
|
end
|
71
35
|
|
72
|
-
|
73
|
-
|
36
|
+
# Per specs, "16.1. day one,17.2. day two" will result in ["16.1", ".",…]. Do we really want that?
|
37
|
+
def split_dotted_email_or_digit(token)
|
38
|
+
return token unless token.end_with?(DOT) && token.length > 1
|
39
|
+
shortened = token.chomp(DOT)
|
40
|
+
return [shortened, DOT] if shortened =~ Regex::DOMAIN_OR_EMAIL
|
41
|
+
return [shortened, DOT] if shortened =~ Regex::ENDS_WITH_DIGIT
|
42
|
+
token
|
74
43
|
end
|
75
44
|
|
76
|
-
def
|
77
|
-
token.include?(
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
abbreviations.include?(extract_abbreviation(token))
|
45
|
+
def split_abbreviations(token)
|
46
|
+
return token unless token.include?(DOT) && token.length > 1
|
47
|
+
return token if token =~ Regex::DOMAIN_OR_EMAIL
|
48
|
+
abbreviation = extract_abbreviation(token)
|
49
|
+
return token.split(Regex::PERIOD_AND_PRIOR) if abbreviations.include?(abbreviation)
|
50
|
+
token
|
83
51
|
end
|
84
52
|
|
85
|
-
def
|
86
|
-
token.include?(
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
token !~ /\d+/ &&
|
94
|
-
!abbreviations.include?(extract_abbreviation(token)) &&
|
95
|
-
token !~ /\S+(@|@)\S+/
|
53
|
+
def split_period_after_last_word(token)
|
54
|
+
return token unless token.include?(DOT) && token.length > 1
|
55
|
+
return token if token.count(DOT) > 1
|
56
|
+
return token if token =~ Regex::ONLY_DOMAIN3
|
57
|
+
return token if token =~ Regex::DIGIT
|
58
|
+
abbreviation = extract_abbreviation(token)
|
59
|
+
return token.split(Regex::PERIOD_ONLY) unless abbreviations.include?(abbreviation)
|
60
|
+
token
|
96
61
|
end
|
97
62
|
|
98
63
|
def extract_abbreviation(token)
|
99
|
-
before_first_dot = token[0, token.index(
|
64
|
+
before_first_dot = token[0, token.index(DOT)]
|
100
65
|
downcase ? before_first_dot : Unicode.downcase(before_first_dot)
|
101
66
|
end
|
102
67
|
|
103
|
-
def convert_sym_to_punct(token)
|
104
|
-
symbol_matches = REGEX_SYMBOL.match(token)
|
105
|
-
if symbol_matches.nil?
|
106
|
-
token
|
107
|
-
else
|
108
|
-
pattern = symbol_matches[0]
|
109
|
-
replacement = PragmaticTokenizer::Languages::Common::PUNCTUATION_MAP.key(pattern)
|
110
|
-
token.gsub!(pattern, replacement)
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
68
|
end
|
115
69
|
end
|
@@ -3,176 +3,67 @@ module PragmaticTokenizer
|
|
3
3
|
|
4
4
|
def pre_process(language: Languages::Common)
|
5
5
|
remove_non_breaking_space!
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
shift_inverted_exclamation!
|
10
|
-
shift_exclamation!
|
11
|
-
shift_ellipse_three_dots!
|
12
|
-
shift_ellipse_two_dots!
|
13
|
-
shift_horizontal_ellipsis!
|
14
|
-
shift_no_space_mention!
|
15
|
-
shift_not_equals!
|
16
|
-
shift_special_quotes!
|
17
|
-
shift_colon!
|
18
|
-
shift_bracket!
|
19
|
-
shift_semicolon!
|
20
|
-
shift_percent!
|
21
|
-
shift_caret!
|
6
|
+
shift_various_characters!
|
7
|
+
replace_colon_in_url!
|
8
|
+
shift_remaining_colons!
|
22
9
|
shift_hashtag!
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
convert_apostrophe_s!
|
28
|
-
shift_beginning_hyphen!
|
29
|
-
shift_ending_hyphen!
|
10
|
+
convert_double_quotes!
|
11
|
+
convert_single_quotes!(language)
|
12
|
+
convert_acute_accent_s!
|
13
|
+
shift_hyphens!
|
30
14
|
squeeze(' '.freeze)
|
31
15
|
end
|
32
16
|
|
33
17
|
private
|
34
18
|
|
35
19
|
def remove_non_breaking_space!
|
36
|
-
|
20
|
+
gsub!(Regex::NO_BREAK_SPACE, ''.freeze)
|
37
21
|
end
|
38
22
|
|
39
|
-
|
40
|
-
|
41
|
-
gsub!(/,(?!\d)/o, ' , '.freeze)
|
42
|
-
gsub!(/(?<=\D),(?=\S+)/, ' , '.freeze)
|
23
|
+
def shift_various_characters!
|
24
|
+
gsub!(Regex::PRE_PROCESS, ' \1 \2 \3 \4 \5 \6 \7 \8 \9 ')
|
43
25
|
end
|
44
26
|
|
45
|
-
def
|
46
|
-
gsub!(
|
27
|
+
def replace_colon_in_url!
|
28
|
+
gsub!(Regex::COLON_IN_URL, replacement_for_key(':'.freeze))
|
47
29
|
end
|
48
30
|
|
49
|
-
def
|
50
|
-
gsub!(
|
51
|
-
end
|
52
|
-
|
53
|
-
def shift_inverted_exclamation!
|
54
|
-
gsub!(/¡/, ' ¡ '.freeze)
|
55
|
-
end
|
56
|
-
|
57
|
-
def shift_exclamation!
|
58
|
-
gsub!(/(?<=[a-zA-z])!(?=[a-zA-z])/, ' ! '.freeze)
|
59
|
-
end
|
60
|
-
|
61
|
-
def shift_horizontal_ellipsis!
|
62
|
-
gsub!(/(…+)/o, ' \1 ')
|
63
|
-
end
|
64
|
-
|
65
|
-
def shift_ellipse_two_dots!
|
66
|
-
gsub!(/(\.\.+)/o, ' \1 ')
|
67
|
-
end
|
68
|
-
|
69
|
-
def shift_ellipse_three_dots!
|
70
|
-
gsub!(/(\.\.\.+)/o, ' \1 ')
|
71
|
-
end
|
72
|
-
|
73
|
-
def shift_no_space_mention!
|
74
|
-
gsub!(/\.(?=(@|@)[^\.]+(\s|\z))/, '. '.freeze)
|
75
|
-
end
|
76
|
-
|
77
|
-
def shift_not_equals!
|
78
|
-
gsub!(/≠/, ' ≠ '.freeze)
|
79
|
-
end
|
80
|
-
|
81
|
-
def shift_special_quotes!
|
82
|
-
gsub!(/([«»„“])/, ' \1 ')
|
83
|
-
end
|
84
|
-
|
85
|
-
def shift_colon!
|
86
|
-
return unless may_shift_colon?
|
87
|
-
# Ignore web addresses
|
88
|
-
replacement = replacement_for_key(':'.freeze)
|
89
|
-
gsub!(%r{(?<=[(https?|ftp)]):(?=//)}, replacement)
|
90
|
-
gsub!(/:/o, ' :'.freeze)
|
91
|
-
gsub!(/(?<=\s):(?=\#)/, ': '.freeze)
|
92
|
-
end
|
93
|
-
|
94
|
-
def may_shift_colon?
|
95
|
-
return false unless include?(':'.freeze)
|
96
|
-
partitions = partition(':'.freeze)
|
97
|
-
partitions.last[0] !~ /\A\d+/ || partitions.first[-1] !~ /\A\d+/
|
98
|
-
end
|
99
|
-
|
100
|
-
def shift_bracket!
|
101
|
-
gsub!(/([\(\[\{\}\]\)])/o, ' \1 ')
|
102
|
-
end
|
103
|
-
|
104
|
-
def shift_semicolon!
|
105
|
-
gsub!(/([;])/o, ' \1 ')
|
106
|
-
end
|
107
|
-
|
108
|
-
def shift_percent!
|
109
|
-
gsub!(/(?<=\D)%(?=\d+)/, ' %'.freeze)
|
110
|
-
end
|
111
|
-
|
112
|
-
def shift_caret!
|
113
|
-
gsub!(/\^/, ' ^ '.freeze)
|
31
|
+
def shift_remaining_colons!
|
32
|
+
gsub!(':'.freeze, ' :'.freeze) if self !~ Regex::TIME_WITH_COLON
|
114
33
|
end
|
115
34
|
|
116
35
|
def shift_hashtag!
|
117
|
-
gsub!(
|
118
|
-
end
|
119
|
-
|
120
|
-
def shift_ampersand!
|
121
|
-
gsub!(/\&/, ' & '.freeze)
|
122
|
-
end
|
123
|
-
|
124
|
-
def shift_vertical_bar!
|
125
|
-
gsub!(/\|/, ' | '.freeze)
|
126
|
-
end
|
127
|
-
|
128
|
-
def convert_dbl_quotes!
|
129
|
-
replace_left_double_quotes!
|
130
|
-
replace_remaining_double_quotes!
|
131
|
-
end
|
132
|
-
|
133
|
-
def replace_left_double_quotes!
|
134
|
-
replace_left_quotes!("''", '"'.freeze)
|
135
|
-
replace_left_quotes!('"', '"'.freeze)
|
136
|
-
replace_left_quotes!('“', '“'.freeze)
|
137
|
-
end
|
138
|
-
|
139
|
-
def replace_left_quotes!(style, replacement_key)
|
140
|
-
replacement = replacement_for_key(replacement_key)
|
141
|
-
gsub!(/#{style}(?=.*\w)/o, ' ' << replacement << ' ')
|
36
|
+
gsub!('#'.freeze, ' #'.freeze)
|
142
37
|
end
|
143
38
|
|
144
|
-
def
|
145
|
-
|
146
|
-
replace_remaining_quotes!("''", '"'.freeze)
|
147
|
-
replace_remaining_quotes!('”', '”'.freeze)
|
39
|
+
def convert_double_quotes!
|
40
|
+
gsub!(Regex::QUOTE, replacements_for_quotes)
|
148
41
|
end
|
149
42
|
|
150
|
-
def
|
151
|
-
|
152
|
-
|
43
|
+
def replacements_for_quotes
|
44
|
+
@replacements_for_quotes ||= {
|
45
|
+
"''" => ' ' << replacement_for_key('"'.freeze) << ' ',
|
46
|
+
'"' => ' ' << replacement_for_key('"'.freeze) << ' ',
|
47
|
+
'“' => ' ' << replacement_for_key('“'.freeze) << ' '
|
48
|
+
}.freeze
|
153
49
|
end
|
154
50
|
|
155
|
-
def
|
156
|
-
replace(
|
157
|
-
language::SingleQuotes.new
|
158
|
-
.handle_single_quotes(self)
|
159
|
-
else
|
160
|
-
PragmaticTokenizer::Languages::Common::SingleQuotes.new
|
161
|
-
.handle_single_quotes(self)
|
162
|
-
end)
|
51
|
+
def convert_single_quotes!(language)
|
52
|
+
replace(class_for_single_quotes(language).new.handle_single_quotes(self))
|
163
53
|
end
|
164
54
|
|
165
|
-
def
|
166
|
-
|
167
|
-
gsub!(/\s\u{0301}(?=s(\s|\z))/, replacement)
|
55
|
+
def class_for_single_quotes(language)
|
56
|
+
defined?(language::SingleQuotes) ? language::SingleQuotes : PragmaticTokenizer::Languages::Common::SingleQuotes
|
168
57
|
end
|
169
58
|
|
170
|
-
def
|
171
|
-
gsub!(
|
59
|
+
def convert_acute_accent_s!
|
60
|
+
gsub!(Regex::ACUTE_ACCENT_S, replacement_for_key('`'.freeze))
|
172
61
|
end
|
173
62
|
|
174
|
-
|
175
|
-
|
63
|
+
# can these two regular expressions be merged somehow?
|
64
|
+
def shift_hyphens!
|
65
|
+
gsub!(Regex::HYPHEN_AFTER_NON_WORD, ' - '.freeze)
|
66
|
+
gsub!(Regex::HYPHEN_BEFORE_NON_WORD, ' - '.freeze)
|
176
67
|
end
|
177
68
|
|
178
69
|
def replacement_for_key(replacement_key)
|