Turkish tokenization improvements (#6268)

* added single and paired orth variants

* added token match

* added long text tokenization test

* inverted init

* normalized lemmas to lowercase

* more abbrevs

* tests for ordinals and abbrevs

* separated period abbvrevs to another list

* fiex typo

* added ordinal and abbrev tests

* added number tests for dates

* minor refinement

* added inflected abbrevs regex

* added percentage and inflection

* cosmetics

* added token match

* added url inflection tests

* excluded url tokens from custom pattern

* removed url match import
This commit is contained in:
Duygu Altinok 2020-10-29 09:43:17 +01:00 committed by GitHub
parent 8cc5ed6771
commit 0e55f806dd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 359 additions and 109 deletions

View File

@ -1,7 +1,7 @@
# coding: utf8 # coding: utf8
from __future__ import unicode_literals from __future__ import unicode_literals
from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS, TOKEN_MATCH
from .stop_words import STOP_WORDS from .stop_words import STOP_WORDS
from .syntax_iterators import SYNTAX_ITERATORS from .syntax_iterators import SYNTAX_ITERATORS
from .lex_attrs import LEX_ATTRS from .lex_attrs import LEX_ATTRS
@ -24,6 +24,7 @@ class TurkishDefaults(Language.Defaults):
) )
tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS)
stop_words = STOP_WORDS stop_words = STOP_WORDS
token_match = TOKEN_MATCH
syntax_iterators = SYNTAX_ITERATORS syntax_iterators = SYNTAX_ITERATORS
morph_rules = MORPH_RULES morph_rules = MORPH_RULES

View File

@ -1,119 +1,183 @@
# coding: utf8 # coding: utf8
from __future__ import unicode_literals from __future__ import unicode_literals
from ...symbols import ORTH, NORM import re
_exc = {"sağol": [{ORTH: "sağ"}, {ORTH: "ol", NORM: "olun"}]} from ..punctuation import ALPHA_LOWER, ALPHA
from ...symbols import ORTH, LEMMA, NORM
_exc = {}
for exc_data in [ _abbr_period_exc = [
{ORTH: "A.B.D.", NORM: "Amerika Birleşik Devletleri"}, {ORTH: "A.B.D.", LEMMA: "Amerika Birleşik Devletleri", NORM: "Amerika"},
{ORTH: "Alb.", NORM: "Albay"}, {ORTH: "Alb.", LEMMA: "albay", NORM: "albay"},
{ORTH: "Ar.Gör.", NORM: "Araştırma Görevlisi"}, {ORTH: "Ank.", LEMMA: "Ankara", NORM: "Ankara"},
{ORTH: "Arş.Gör.", NORM: "Araştırma Görevlisi"}, {ORTH: "Ar.Gör.", LEMMA: "araştırma görevlisi"},
{ORTH: "Asb.", NORM: "Astsubay"}, {ORTH: "Arş.Gör.", LEMMA: "araştırma görevlisi"},
{ORTH: "Astsb.", NORM: "Astsubay"}, {ORTH: "Asb.", LEMMA: "astsubay", NORM: "astsubay"},
{ORTH: "As.İz.", NORM: "Askeri İnzibat"}, {ORTH: "Astsb.", LEMMA: "astsubay", NORM: "astsubay"},
{ORTH: "Atğm", NORM: "Asteğmen"}, {ORTH: "As.İz.", LEMMA: "askeri inzibat"},
{ORTH: "Av.", NORM: "Avukat"}, {ORTH: "as.iz.", LEMMA: "askeri inzibat"},
{ORTH: "Apt.", NORM: "Apartmanı"}, {ORTH: "Atğm", LEMMA: "asteğmen", NORM: "asteğmen"},
{ORTH: "Bçvş.", NORM: "Başçavuş"}, {ORTH: "Av.", LEMMA: "avukat", NORM: "avukat"},
{ORTH: "bk.", NORM: "bakınız"}, {ORTH: "Apt.", LEMMA: "apartmanı", NORM: "apartmanı"},
{ORTH: "bknz.", NORM: "bakınız"}, {ORTH: "apt.", LEMMA: "apartmanı", NORM: "apartmanı"},
{ORTH: "Bnb.", NORM: "Binbaşı"}, {ORTH: "Bçvş.", LEMMA: "başçavuş", NORM: "başçavuş"},
{ORTH: "bnb.", NORM: "binbaşı"}, {ORTH: "bçvş.", LEMMA: "başçavuş", NORM: "başçavuş"},
{ORTH: "Böl.", NORM: "Bölümü"}, {ORTH: "bk.", LEMMA: "bakınız", NORM: "bakınız"},
{ORTH: "Bşk.", NORM: "Başkanlığı"}, {ORTH: "bknz.", LEMMA: "bakınız", NORM: "bakınız"},
{ORTH: "Bştbp.", NORM: "Baştabip"}, {ORTH: "Bnb.", LEMMA: "binbaşı", NORM: "binbaşı"},
{ORTH: "Bul.", NORM: "Bulvarı"}, {ORTH: "bnb.", LEMMA: "binbaşı", NORM: "binbaşı"},
{ORTH: "Cad.", NORM: "Caddesi"}, {ORTH: "Böl.", LEMMA: "bölümü", NORM: "bölümü"},
{ORTH: "çev.", NORM: "çeviren"}, {ORTH: "böl.", LEMMA: "bölümü", NORM: "bölümü"},
{ORTH: "Çvş.", NORM: "Çavuş"}, {ORTH: "Bşk.", LEMMA: "başkanlığı", NORM: "başkanlığı"},
{ORTH: "dak.", NORM: "dakika"}, {ORTH: "bşk.", LEMMA: "başkanlığı", NORM: "başkanlığı"},
{ORTH: "dk.", NORM: "dakika"}, {ORTH: "Bştbp.", LEMMA: "baştabip", NORM: "baştabip"},
{ORTH: "Doç.", NORM: "Doçent"}, {ORTH: "bştbp.", LEMMA: "baştabip", NORM: "baştabip"},
{ORTH: "doğ.", NORM: "doğum tarihi"}, {ORTH: "Bul.", LEMMA: "bulvarı", NORM: "bulvarı"},
{ORTH: "drl.", NORM: "derleyen"}, {ORTH: "bul.", LEMMA: "bulvarı", NORM: "bulvarı"},
{ORTH: "Dz.", NORM: "Deniz"}, {ORTH: "Cad.", LEMMA: "caddesi", NORM: "caddesi"},
{ORTH: "Dz.K.K.lığı", NORM: "Deniz Kuvvetleri Komutanlığı"}, {ORTH: "cad.", LEMMA: "caddesi", NORM: "caddesi"},
{ORTH: "Dz.Kuv.", NORM: "Deniz Kuvvetleri"}, {ORTH: "çev.", LEMMA: "çeviren", NORM: "çeviren"},
{ORTH: "Dz.Kuv.K.", NORM: "Deniz Kuvvetleri Komutanlığı"}, {ORTH: "Çvş.", LEMMA: "çavuş", NORM: "çavuş"},
{ORTH: "dzl.", NORM: "düzenleyen"}, {ORTH: "çvş.", LEMMA: "çavuş", NORM: "çavuş"},
{ORTH: "Ecz.", NORM: "Eczanesi"}, {ORTH: "dak.", LEMMA: "dakika", NORM: "dakika"},
{ORTH: "ekon.", NORM: "ekonomi"}, {ORTH: "dk.", LEMMA: "dakika", NORM: "dakika"},
{ORTH: "Fak.", NORM: "Fakültesi"}, {ORTH: "Doç.", LEMMA: "doçent", NORM: "doçent"},
{ORTH: "Gn.", NORM: "Genel"}, {ORTH: "doğ.", LEMMA: "doğum tarihi"},
{ORTH: "Gnkur.", NORM: "Genelkurmay"}, {ORTH: "Dr.", LEMMA: "doktor", NORM: "doktor"},
{ORTH: "Gn.Kur.", NORM: "Genelkurmay"}, {ORTH: "dr.", LEMMA: "doktor", NORM:"doktor"},
{ORTH: "gr.", NORM: "gram"}, {ORTH: "drl.", LEMMA: "derleyen", NORM: "derleyen"},
{ORTH: "Hst.", NORM: "Hastanesi"}, {ORTH: "Dz.", LEMMA: "deniz", NORM: "deniz"},
{ORTH: "Hs.Uzm.", NORM: "Hesap Uzmanı"}, {ORTH: "Dz.K.K.lığı", LEMMA: "Deniz Kuvvetleri Komutanlığı"},
{ORTH: "huk.", NORM: "hukuk"}, {ORTH: "Dz.Kuv.", LEMMA: "Deniz Kuvvetleri"},
{ORTH: "Hv.", NORM: "Hava"}, {ORTH: "Dz.Kuv.K.", LEMMA: "Deniz Kuvvetleri Komutanlığı"},
{ORTH: "Hv.K.K.lığı", NORM: "Hava Kuvvetleri Komutanlığı"}, {ORTH: "dzl.", LEMMA: "düzenleyen", NORM: "düzenleyen"},
{ORTH: "Hv.Kuv.", NORM: "Hava Kuvvetleri"}, {ORTH: "Ecz.", LEMMA: "eczanesi", NORM: "eczanesi"},
{ORTH: "Hv.Kuv.K.", NORM: "Hava Kuvvetleri Komutanlığı"}, {ORTH: "ecz.", LEMMA: "eczanesi", NORM: "eczanesi"},
{ORTH: "Hz.", NORM: "Hazreti"}, {ORTH: "ekon.", LEMMA: "ekonomi", NORM: "ekonomi"},
{ORTH: "Hz.Öz.", NORM: "Hizmete Özel"}, {ORTH: "Fak.", LEMMA: "fakültesi", NORM: "fakültesi"},
{ORTH: "İng.", NORM: "İngilizce"}, {ORTH: "Gn.", LEMMA: "genel", NORM: "genel"},
{ORTH: "Jeol.", NORM: "Jeoloji"}, {ORTH: "Gnkur.", LEMMA: "Genelkurmay", NORM: "Genelkurmay"},
{ORTH: "jeol.", NORM: "jeoloji"}, {ORTH: "Gn.Kur.", LEMMA: "Genelkurmay", NORM: "Genelkurmay"},
{ORTH: "Korg.", NORM: "Korgeneral"}, {ORTH: "gr.", LEMMA: "gram", NORM: "gram"},
{ORTH: "Kur.", NORM: "Kurmay"}, {ORTH: "Hst.", LEMMA: "hastanesi", NORM: "hastanesi"},
{ORTH: "Kur.Bşk.", NORM: "Kurmay Başkanı"}, {ORTH: "hst.", LEMMA: "hastanesi", NORM: "hastanesi"},
{ORTH: "Kuv.", NORM: "Kuvvetleri"}, {ORTH: "Hs.Uzm.", LEMMA: "hesap uzmanı"},
{ORTH: "Ltd.", NORM: "Limited"}, {ORTH: "huk.", LEMMA: "hukuk", NORM: "hukuk"},
{ORTH: "Mah.", NORM: "Mahallesi"}, {ORTH: "Hv.", LEMMA: "hava", NORM: "hava"},
{ORTH: "mah.", NORM: "mahallesi"}, {ORTH: "Hv.K.K.lığı", LEMMA: "Hava Kuvvetleri Komutanlığı"},
{ORTH: "max.", NORM: "maksimum"}, {ORTH: "Hv.Kuv.", LEMMA: "Hava Kuvvetleri"},
{ORTH: "min.", NORM: "minimum"}, {ORTH: "Hv.Kuv.K.", LEMMA: "Hava Kuvvetleri Komutanlığı"},
{ORTH: "Müh.", NORM: "Mühendisliği"}, {ORTH: "Hz.", LEMMA: "hazreti", NORM: "hazreti"},
{ORTH: "müh.", NORM: "mühendisliği"}, {ORTH: "Hz.Öz.", LEMMA: "hizmete özel"},
{ORTH: "MÖ.", NORM: "Milattan Önce"}, {ORTH: "İng.", LEMMA: "ingilizce", NORM: "ingilizce"},
{ORTH: "Onb.", NORM: "Onbaşı"}, {ORTH: "İst.", LEMMA: "İstanbul", NORM: "İstanbul"},
{ORTH: "Ord.", NORM: "Ordinaryüs"}, {ORTH: "Jeol.", LEMMA: "jeoloji", NORM: "jeoloji"},
{ORTH: "Org.", NORM: "Orgeneral"}, {ORTH: "jeol.", LEMMA: "jeoloji", NORM: "jeoloji"},
{ORTH: "Ped.", NORM: "Pedagoji"}, {ORTH: "Korg.", LEMMA: "korgeneral", NORM: "korgeneral"},
{ORTH: "Prof.", NORM: "Profesör"}, {ORTH: "Kur.", LEMMA: "kurmay", NORM: "kurmay"},
{ORTH: "Sb.", NORM: "Subay"}, {ORTH: "Kur.Bşk.", LEMMA: "kurmay başkanı"},
{ORTH: "Sn.", NORM: "Sayın"}, {ORTH: "Kuv.", LEMMA: "kuvvetleri", NORM: "kuvvetleri"},
{ORTH: "sn.", NORM: "saniye"}, {ORTH: "Ltd.", LEMMA: "limited", NORM: "limited"},
{ORTH: "Sok.", NORM: "Sokak"}, {ORTH: "ltd.", LEMMA: "limited", NORM: "limited"},
{ORTH: "Şb.", NORM: "Şube"}, {ORTH: "Mah.", LEMMA: "mahallesi", NORM: "mahallesi"},
{ORTH: "Şti.", NORM: "Şirketi"}, {ORTH: "mah.", LEMMA: "mahallesi", NORM: "mahallesi"},
{ORTH: "Tbp.", NORM: "Tabip"}, {ORTH: "max.", LEMMA: "maksimum", NORM: "maksimum"},
{ORTH: "T.C.", NORM: "Türkiye Cumhuriyeti"}, {ORTH: "min.", LEMMA: "minimum", NORM: "minimum"},
{ORTH: "Tel.", NORM: "Telefon"}, {ORTH: "Müh.", LEMMA: "mühendisliği", NORM: "mühendisliği"},
{ORTH: "tel.", NORM: "telefon"}, {ORTH: "müh.", LEMMA: "mühendisliği", NORM: "mühendisliği"},
{ORTH: "telg.", NORM: "telgraf"}, {ORTH: "M.Ö.", LEMMA: "milattan önce"},
{ORTH: "Tğm.", NORM: "Teğmen"}, {ORTH: "M.S.", LEMMA: "milattan sonra"},
{ORTH: "tğm.", NORM: "teğmen"}, {ORTH: "Onb.", LEMMA: "onbaşı", NORM: "onbaşı"},
{ORTH: "tic.", NORM: "ticaret"}, {ORTH: "Ord.", LEMMA: "ordinaryüs", NORM: "ordinaryüs"},
{ORTH: "Tug.", NORM: "Tugay"}, {ORTH: "Org.", LEMMA: "orgeneral", NORM: "orgeneral"},
{ORTH: "Tuğg.", NORM: "Tuğgeneral"}, {ORTH: "Ped.", LEMMA: "pedagoji", NORM: "pedagoji"},
{ORTH: "Tümg.", NORM: "Tümgeneral"}, {ORTH: "Prof.", LEMMA: "profesör", NORM: "profesör"},
{ORTH: "Uzm.", NORM: "Uzman"}, {ORTH: "prof.", LEMMA: "profesör", NORM: "profesör"},
{ORTH: "Üçvş.", NORM: "Üstçavuş"}, {ORTH: "Sb.", LEMMA: "subay", NORM: "subay"},
{ORTH: "Üni.", NORM: "Üniversitesi"}, {ORTH: "Sn.", LEMMA: "sayın", NORM: "sayın"},
{ORTH: "Ütğm.", NORM: "Üsteğmen"}, {ORTH: "sn.", LEMMA: "saniye", NORM: "saniye"},
{ORTH: "vb.", NORM: "ve benzeri"}, {ORTH: "Sok.", LEMMA: "sokak", NORM: "sokak"},
{ORTH: "vs.", NORM: "vesaire"}, {ORTH: "sok.", LEMMA: "sokak", NORM: "sokak"},
{ORTH: "Yard.", NORM: "Yardımcı"}, {ORTH: "Şb.", LEMMA: "şube", NORM: "şube"},
{ORTH: "Yar.", NORM: "Yardımcı"}, {ORTH: "şb.", LEMMA: "şube", NORM: "şube"},
{ORTH: "Yd.Sb.", NORM: "Yedek Subay"}, {ORTH: "Şti.", LEMMA: "şirketi", NORM: "şirketi"},
{ORTH: "Yard.Doç.", NORM: "Yardımcı Doçent"}, {ORTH: "şti.", LEMMA: "şirketi", NORM: "şirketi"},
{ORTH: "Yar.Doç.", NORM: "Yardımcı Doçent"}, {ORTH: "Tbp.", LEMMA: "tabip", NORM: "tabip"},
{ORTH: "Yb.", NORM: "Yarbay"}, {ORTH: "tbp.", LEMMA: "tabip", NORM: "tabip"},
{ORTH: "Yrd.", NORM: "Yardımcı"}, {ORTH: "T.C.", LEMMA: "Türkiye Cumhuriyeti"},
{ORTH: "Yrd.Doç.", NORM: "Yardımcı Doçent"}, {ORTH: "Tel.", LEMMA: "telefon", NORM: "telefon"},
{ORTH: "Y.Müh.", NORM: "Yüksek mühendis"}, {ORTH: "tel.", LEMMA: "telefon", NORM: "telefon"},
{ORTH: "Y.Mim.", NORM: "Yüksek mimar"}, {ORTH: "telg.", LEMMA: "telgraf", NORM: "telgraf"},
]: {ORTH: "Tğm.", LEMMA: "teğmen", NORM: "teğmen"},
_exc[exc_data[ORTH]] = [exc_data] {ORTH: "tğm.", LEMMA: "teğmen", NORM: "teğmen"},
{ORTH: "tic.", LEMMA: "ticaret", NORM: "ticaret"},
{ORTH: "Tug.", LEMMA: "tugay", NORM: "tugay"},
{ORTH: "Tuğg.", LEMMA: "tuğgeneral", NORM: "tuğgeneral"},
{ORTH: "Tümg.", LEMMA: "tümgeneral", NORM: "tümgeneral"},
{ORTH: "Uzm.", LEMMA: "uzman", NORM: "uzman"},
{ORTH: "Üçvş.", LEMMA: "üstçavuş", NORM: "üstçavuş"},
{ORTH: "Üni.", LEMMA: "üniversitesi", NORM: "üniversitesi"},
{ORTH: "Ütğm.", LEMMA: "üsteğmen", NORM: "üsteğmen"},
{ORTH: "vb.", LEMMA: "ve benzeri"},
{ORTH: "vs.", LEMMA: "vesaire", NORM: "vesaire"},
{ORTH: "Yard.", LEMMA: "yardımcı", NORM: "yardımcı"},
{ORTH: "Yar.", LEMMA: "yardımcı", NORM: "yardımcı"},
{ORTH: "Yd.Sb.", LEMMA: "yedek subay"},
{ORTH: "Yard.Doç.", LEMMA: "yardımcı doçent"},
{ORTH: "Yar.Doç.", LEMMA: "yardımcı doçent"},
{ORTH: "Yb.", LEMMA: "yarbay", NORM: "yarbay"},
{ORTH: "Yrd.", LEMMA: "yardımcı", NORM: "yardımcı"},
{ORTH: "Yrd.Doç.", LEMMA: "yardımcı doçent"},
{ORTH: "Y.Müh.", LEMMA: "yüksek mühendis"},
{ORTH: "Y.Mim.", LEMMA: "yüksek mimar"},
{ORTH: "yy.", LEMMA: "yüzyıl", NORM: "yüzyıl"},
]
for abbr in _abbr_period_exc:
_exc[abbr[ORTH]] = [abbr]
_abbr_exc = [
{ORTH: "AB", LEMMA: "Avrupa Birliği", NORM: "Avrupa Birliği"},
{ORTH: "ABD", LEMMA: "Amerika Birleşik Devletleri", NORM: "Amerika"},
{ORTH: "ABS", LEMMA: "fren", NORM: "fren"},
{ORTH: "AOÇ", LEMMA: "Atatürk orman çiftliği"},
{ORTH: "ASKİ", LEMMA: "Ankara su ve kanalizasyon idaresi"},
{ORTH: "Bağ-kur", LEMMA: "Bağkur", NORM: "Bağkur"},
{ORTH: "BDDK", LEMMA: "bankacılık düzenleme ve denetleme kurumu"},
{ORTH: "BJK", LEMMA: "Beşiktaş", NORM: "Beşiktaş"},
{ORTH: "ESA", LEMMA: "Avrupa uzay ajansı", NORM: "Avrupa uzay ajansı"},
{ORTH: "FB", LEMMA: "Fenerbahçe", NORM: "Fenerbahçe"},
{ORTH: "GATA", LEMMA: "Gülhane askeri tıp akademisi"},
{ORTH: "GS", LEMMA: "Galatasaray", NORM: "Galatasaray"},
{ORTH: "İSKİ", LEMMA: "İstanbul su ve kanalizasyon idaresi"},
{ORTH: "KBB", LEMMA: "kulak burun boğaz"},
{ORTH: "RTÜK", LEMMA: "radyo ve televizyon üst kurulu", NORM: "radyo ve televizyon üst kurulu"},
{ORTH: "TBMM", LEMMA: "Türkiye Büyük Millet Meclisi"},
{ORTH: "TC", LEMMA: "Türkiye Cumhuriyeti"},
{ORTH: "TÜİK", LEMMA: "Türkiye istatistik kurumu", NORM: "Türkiye istatistik kurumu"},
{ORTH: "YÖK", LEMMA: "Yüksek Öğrenim Kurumu"},
]
for abbr in _abbr_exc:
_exc[abbr[ORTH]] = [abbr]
for orth in ["Dr.", "yy."]:
_exc[orth] = [{ORTH: orth}]
_num = r"[+-]?\d+([,.]\d+)*"
_ord_num = r"(\d+\.)"
_date = r"(((\d{1,2}[./-]){2})?(\d{4})|(\d{1,2}[./]\d{1,2}(\.)?))"
_dash_num = r"(([{al}\d]+/\d+)|(\d+/[{al}]))".format(al=ALPHA)
_roman_num = "M{0,3}(?:C[MD]|D?C{0,3})(?:X[CL]|L?X{0,3})(?:I[XV]|V?I{0,3})"
_roman_ord = r"({rn})\.".format(rn=_roman_num)
_time_exp = r"\d+(:\d+)*"
_inflections = r"'[{al}]+".format(al=ALPHA_LOWER)
_abbrev_inflected = r"[{a}]+\.'[{al}]+".format(a=ALPHA, al=ALPHA_LOWER)
_nums = r"(({d})|({dn})|({te})|({on})|({n})|({ro})|({rn}))({inf})?".format(d=_date, dn=_dash_num, te=_time_exp, on=_ord_num, n=_num, ro=_roman_ord, rn=_roman_num, inf=_inflections)
TOKENIZER_EXCEPTIONS = _exc TOKENIZER_EXCEPTIONS = _exc
TOKEN_MATCH = re.compile(r"^({abbr})|({n})$".format(n=_nums, abbr=_abbrev_inflected)).match

View File

@ -5,6 +5,27 @@ import pytest
from spacy.lang.tr.lex_attrs import like_num from spacy.lang.tr.lex_attrs import like_num
def test_tr_tokenizer_handles_long_text(tr_tokenizer):
text = """Pamuk nasıl ipliğe dönüştürülür?
Sıkıştırılmış balyalar halindeki pamuk, iplik fabrikasına getirildiğinde hem
lifleri birbirine dolaşmıştır, hem de tarladan toplanırken araya bitkinin
parçaları karışmıştır. Üstelik balyalardaki pamuğun cinsi aynı olsa bile kalitesi
değişeceğinden, önce bütün balyaların birbirine karıştırılarak harmanlanması gerekir.
Daha sonra pamuk yığınları, liflerin ılıp temizlenmesi için tek bir birim halinde
birleştirilmiş çeşitli makinelerden geçirilir.Bunlardan biri, dönen tokmaklarıyla
pamuğu dövüp kabartarak dağınık yumaklar haline getiren ve liflerin arasındaki yabancı
maddeleri temizleyen hallaç makinesidir. Daha sonra tarak makinesine giren pamuk demetleri,
herbirinin yüzeyinde yüzbinlerce incecik iğne bulunan döner silindirlerin arasından geçerek lif lif ayrılır
ve tül inceliğinde gevşek bir örtüye dönüşür. Ama bir sonraki makine bu lifleri dağınık
ve gevşek bir biçimde birbirine yaklaştırarak 2 cm eninde bir pamuk şeridi haline getirir."""
tokens = tr_tokenizer(text)
assert len(tokens) == 146
@pytest.mark.parametrize( @pytest.mark.parametrize(
"word", "word",
[ [

View File

@ -0,0 +1,164 @@
# coding: utf-8
from __future__ import unicode_literals
import pytest
ABBREV_TESTS = [
("Dr. Murat Bey ile görüştüm.", ["Dr.", "Murat", "Bey", "ile", "görüştüm", "."]),
("Dr.la görüştüm.", ["Dr.la", "görüştüm", "."]),
("Dr.'la görüştüm.", ["Dr.'la", "görüştüm", "."]),
("TBMM'de çalışıyormuş.", ["TBMM'de", "çalışıyormuş", "."]),
("Hem İst. hem Ank. bu konuda gayet iyi durumda.", ["Hem", "İst.", "hem", "Ank.", "bu", "konuda", "gayet", "iyi", "durumda", "."]),
("Hem İst. hem Ank.'da yağış var.", ["Hem", "İst.", "hem", "Ank.'da", "yağış", "var", "."]),
("Dr.", ["Dr."]),
("Yrd.Doç.", ["Yrd.Doç."]),
("Prof.'un", ["Prof.'un"]),
("Böl.'nde", ["Böl.'nde"]),
]
URL_TESTS = [
("Bizler de www.duygu.com.tr adında bir websitesi kurduk.", ["Bizler", "de", "www.duygu.com.tr", "adında", "bir", "websitesi", "kurduk", "."]),
("Bizler de https://www.duygu.com.tr adında bir websitesi kurduk.", ["Bizler", "de", "https://www.duygu.com.tr", "adında", "bir", "websitesi", "kurduk", "."]),
("Bizler de www.duygu.com.tr'dan satın aldık.", ["Bizler", "de", "www.duygu.com.tr'dan", "satın", "aldık", "."]),
("Bizler de https://www.duygu.com.tr'dan satın aldık.", ["Bizler", "de", "https://www.duygu.com.tr'dan", "satın", "aldık", "."]),
]
NUMBER_TESTS = [
("Rakamla 6 yazılıydı.", ["Rakamla", "6", "yazılıydı", "."]),
("Hava -4 dereceydi.", ["Hava", "-4", "dereceydi", "."]),
("Hava sıcaklığı -4ten +6ya yükseldi.", ["Hava", "sıcaklığı", "-4ten", "+6ya", "yükseldi", "."]),
("Hava sıcaklığı -4'ten +6'ya yükseldi.", ["Hava", "sıcaklığı", "-4'ten", "+6'ya", "yükseldi", "."]),
("Yarışta 6. oldum.", ["Yarışta", "6.", "oldum", "."]),
("Yarışta 438547745. oldum.", ["Yarışta", "438547745.", "oldum", "."]),
("Kitap IV. Murat hakkında.",["Kitap", "IV.", "Murat", "hakkında", "."]),
#("Bana söylediği sayı 6.", ["Bana", "söylediği", "sayı", "6", "."]),
("Saat 6'da buluşalım.", ["Saat", "6'da", "buluşalım", "."]),
("Saat 6dan sonra buluşalım.", ["Saat", "6dan", "sonra", "buluşalım", "."]),
("6.dan sonra saymadım.", ["6.dan", "sonra", "saymadım", "."]),
("6.'dan sonra saymadım.", ["6.'dan", "sonra", "saymadım", "."]),
("Saat 6'ydı.", ["Saat", "6'ydı", "."]),
("5'te", ["5'te"]),
("6'da", ["6'da"]),
("9dan", ["9dan"]),
("19'da", ["19'da"]),
("VI'da", ["VI'da"]),
("5.", ["5."]),
("72.", ["72."]),
("VI.", ["VI."]),
("6.'dan", ["6.'dan"]),
("19.'dan", ["19.'dan"]),
("6.dan", ["6.dan"]),
("16.dan", ["16.dan"]),
("VI.'dan", ["VI.'dan"]),
("VI.dan", ["VI.dan"]),
("Hepsi 1994 yılında oldu.", ["Hepsi", "1994", "yılında", "oldu", "."]),
("Hepsi 1994'te oldu.", ["Hepsi", "1994'te", "oldu", "."]),
("2/3 tarihli faturayı bulamadım.", ["2/3", "tarihli", "faturayı", "bulamadım", "."]),
("2.3 tarihli faturayı bulamadım.", ["2.3", "tarihli", "faturayı", "bulamadım", "."]),
("2.3. tarihli faturayı bulamadım.", ["2.3.", "tarihli", "faturayı", "bulamadım", "."]),
("2/3/2020 tarihli faturayı bulamadm.", ["2/3/2020", "tarihli", "faturayı", "bulamadm", "."]),
("2/3/1987 tarihinden beri burda yaşıyorum.", ["2/3/1987", "tarihinden", "beri", "burda", "yaşıyorum", "."]),
("2-3-1987 tarihinden beri burdayım.", ["2-3-1987", "tarihinden", "beri", "burdayım", "."]),
("2.3.1987 tarihinden beri burdayım.", ["2.3.1987", "tarihinden", "beri", "burdayım", "."]),
("Bu olay 2005-2006 tarihleri arasında oldu.", ["Bu", "olay", "2005", "-", "2006", "tarihleri", "arasında", "oldu", "."]),
("Bu olay 4/12/2005-21/3/2006 tarihleri arasında oldu.", ["Bu", "olay", "4/12/2005", "-", "21/3/2006", "tarihleri", "arasında", "oldu", ".",]),
("Ek fıkra: 5/11/2003-4999/3 maddesine göre uygundur.", ["Ek", "fıkra", ":", "5/11/2003", "-", "4999/3", "maddesine", "göre", "uygundur", "."]),
("2/A alanları: 6831 sayılı Kanunun 2nci maddesinin birinci fıkrasının (A) bendine göre", ["2/A", "alanları", ":", "6831", "sayılı", "Kanunun", "2nci", "maddesinin", "birinci", "fıkrasının", "(", "A", ")", "bendine", "göre"]),
("ŞEHİTTEĞMENKALMAZ Cad. No: 2/311", ["ŞEHİTTEĞMENKALMAZ", "Cad.", "No", ":", "2/311"]),
("2-3-2025", ["2-3-2025",]),
("2/3/2025", ["2/3/2025"]),
("Yıllardır 0.5 uç kullanıyorum.", ["Yıllardır", "0.5", "", "kullanıyorum", "."]),
("Kan değerlerim 0.5-0.7 arasıydı.", ["Kan", "değerlerim", "0.5", "-", "0.7", "arasıydı", "."]),
("0.5", ["0.5"]),
("1/2", ["1/2"]),
("%1", ["%", "1"]),
("%1lik", ["%", "1lik"]),
("%1'lik", ["%", "1'lik"]),
("%1lik dilim", ["%", "1lik", "dilim"]),
("%1'lik dilim", ["%", "1'lik", "dilim"]),
("%1.5", ["%", "1.5"]),
#("%1-%2 arası büyüme bekleniyor.", ["%", "1", "-", "%", "2", "arası", "büyüme", "bekleniyor", "."]),
("%1-2 arası büyüme bekliyoruz.", ["%", "1", "-", "2", "arası", "büyüme", "bekliyoruz", "."]),
("%11-12 arası büyüme bekliyoruz.", ["%", "11", "-", "12", "arası", "büyüme", "bekliyoruz", "."]),
("%1.5luk büyüme bekliyoruz.", ["%", "1.5luk", "büyüme", "bekliyoruz", "."]),
("Saat 1-2 arası gelin lütfen.", ["Saat", "1", "-", "2", "arası", "gelin", "lütfen", "."]),
("Saat 15:30 gibi buluşalım.", ["Saat", "15:30", "gibi", "buluşalım", "."]),
("Saat 15:30'da buluşalım.", ["Saat", "15:30'da", "buluşalım", "."]),
("Saat 15.30'da buluşalım.", ["Saat", "15.30'da", "buluşalım", "."]),
("Saat 15.30da buluşalım.", ["Saat", "15.30da", "buluşalım", "."]),
("Saat 15 civarı buluşalım.", ["Saat", "15", "civarı", "buluşalım", "."]),
("9daki otobüse binsek mi?", ["9daki", "otobüse", "binsek", "mi", "?"]),
("Okulumuz 3-B şubesi", ["Okulumuz", "3-B", "şubesi"]),
("Okulumuz 3/B şubesi", ["Okulumuz", "3/B", "şubesi"]),
("Okulumuz 3B şubesi", ["Okulumuz", "3B", "şubesi"]),
("Okulumuz 3b şubesi", ["Okulumuz", "3b", "şubesi"]),
("Antonio Gaudí 20. yüzyılda, 1904-1914 yılları arasında on yıl süren bir reform süreci getirmiştir.", ["Antonio", "Gaudí", "20.", "yüzyılda", ",", "1904", "-", "1914", "yılları", "arasında", "on", "yıl", "süren", "bir", "reform", "süreci", "getirmiştir", "."]),
("Dizel yakıtın avro bölgesi ortalaması olan 1,165 avroya kıyasla litre başına 1,335 avroya mal olduğunu gösteriyor.", ["Dizel", "yakıtın", "avro", "bölgesi", "ortalaması", "olan", "1,165", "avroya", "kıyasla", "litre", "başına", "1,335", "avroya", "mal", "olduğunu", "gösteriyor", "."]),
("Marcus Antonius M.Ö. 1 Ocak 49'da, Sezar'dan Vali'nin kendisini barış dostu ilan ettiği bir bildiri yayınlamıştır.", ["Marcus", "Antonius", "M.Ö.", "1", "Ocak", "49'da", ",", "Sezar'dan", "Vali'nin", "kendisini", "barış", "dostu", "ilan", "ettiği", "bir", "bildiri", "yayınlamıştır", "."])
]
PUNCT_TESTS = [
("Gitmedim dedim ya!", ["Gitmedim", "dedim", "ya", "!"]),
("Gitmedim dedim ya!!", ["Gitmedim", "dedim", "ya", "!", "!"]),
("Gitsek mi?", ["Gitsek", "mi", "?"]),
("Gitsek mi??", ["Gitsek", "mi", "?", "?"]),
("Gitsek mi?!?", ["Gitsek", "mi", "?", "!", "?"]),
("Ankara - Antalya arası otobüs işliyor.", ["Ankara", "-", "Antalya", "arası", "otobüs", "işliyor", "."]),
("Ankara-Antalya arası otobüs işliyor.", ["Ankara", "-", "Antalya", "arası", "otobüs", "işliyor", "."]),
("Sen--ben, ya da onlar.", ["Sen", "--", "ben", ",", "ya", "da", "onlar", "."]),
("Senden, benden, bizden şarkısını biliyor musun?", ["Senden", ",", "benden", ",", "bizden", "şarkısını", "biliyor", "musun", "?"]),
("Akif'le geldik, sonra da o ayrıldı.", ["Akif'le", "geldik", ",", "sonra", "da", "o", "ayrıldı", "."]),
("Bu adam ne dedi şimdi???", ["Bu", "adam", "ne", "dedi", "şimdi", "?", "?", "?"]),
("Yok hasta olmuş, yok annesi hastaymış, bahaneler işte...", ["Yok", "hasta", "olmuş", ",", "yok", "annesi", "hastaymış", ",", "bahaneler", "işte", "..."]),
("Ankara'dan İstanbul'a ... bir aşk hikayesi.", ["Ankara'dan", "İstanbul'a", "...", "bir", "aşk", "hikayesi", "."]),
("Ahmet'te", ["Ahmet'te"]),
("İstanbul'da", ["İstanbul'da"]),
]
GENERAL_TESTS = [
("1914'teki Endurance seferinde, Sir Ernest Shackleton'ın kaptanlığını yaptığı İngiliz Endurance gemisi yirmi sekiz kişi ile Antarktika'yı geçmek üzere yelken açtı.", ["1914'teki", "Endurance", "seferinde", ",", "Sir", "Ernest", "Shackleton'ın", "kaptanlığını", "yaptığı", "İngiliz", "Endurance", "gemisi", "yirmi", "sekiz", "kişi", "ile", "Antarktika'yı", "geçmek", "üzere", "yelken", "açtı", "."]),
("Danışılan \"%100 Cospedal\" olduğunu belirtti.", ["Danışılan", '"', "%", "100", "Cospedal", '"', "olduğunu", "belirtti", "."]),
("1976'da parkur artık kullanılmıyordu; 1990'da ise bir yangın, daha sonraları ahırlarla birlikte yıkılacak olan tahta tribünlerden geri kalanları da yok etmişti.", ["1976'da", "parkur", "artık", "kullanılmıyordu", ";", "1990'da", "ise", "bir", "yangın", ",", "daha", "sonraları", "ahırlarla", "birlikte", "yıkılacak", "olan", "tahta", "tribünlerden", "geri", "kalanları", "da", "yok", "etmişti", "."]),
("Dahiyane bir ameliyat ve zorlu bir rehabilitasyon sürecinden sonra, tamamen iyileştim.", ["Dahiyane", "bir", "ameliyat", "ve", "zorlu", "bir", "rehabilitasyon", "sürecinden", "sonra", ",", "tamamen", "iyileştim", "."]),
("Yaklaşık iki hafta süren bireysel erken oy kullanma döneminin ardından 5,7 milyondan fazla Floridalı sandık başına gitti.", ["Yaklaşık", "iki", "hafta", "süren", "bireysel", "erken", "oy", "kullanma", "döneminin", "ardından", "5,7", "milyondan", "fazla", "Floridalı", "sandık", "başına", "gitti", "."]),
("Ancak, bu ABD Çevre Koruma Ajansı'nın dünyayı bu konularda uyarmasının ardından ortaya çıktı.", ["Ancak", ",", "bu", "ABD", "Çevre", "Koruma", "Ajansı'nın", "dünyayı", "bu", "konularda", "uyarmasının", "ardından", "ortaya", "çıktı", "."]),
("Ortalama şansa ve 10.000 Sterlin değerinde tahvillere sahip bir yatırımcı yılda 125 Sterlin ikramiye kazanabilir.", ["Ortalama", "şansa", "ve", "10.000", "Sterlin", "değerinde", "tahvillere", "sahip", "bir", "yatırımcı", "yılda", "125", "Sterlin", "ikramiye", "kazanabilir", "."]),
("Granit adaları; Seyşeller ve Tioman ile Saint Helena gibi volkanik adaları kapsar." , ["Granit", "adaları", ";", "Seyşeller", "ve", "Tioman", "ile", "Saint", "Helena", "gibi", "volkanik", "adaları", "kapsar", "."]),
("Barış antlaşmasıyla İspanya, Amerika'ya Porto Riko, Guam ve Filipinler kolonilerini devretti.", ["Barış", "antlaşmasıyla", "İspanya", ",", "Amerika'ya", "Porto", "Riko", ",", "Guam", "ve", "Filipinler", "kolonilerini", "devretti", "."]),
("Makedonya\'nın sınır bölgelerini güvence altına alan Philip, büyük bir Makedon ordusu kurdu ve uzun bir fetih seferi için Trakya\'ya doğru yürüdü.", ["Makedonya\'nın", "sınır", "bölgelerini", "güvence", "altına", "alan", "Philip", ",", "büyük", "bir", "Makedon", "ordusu", "kurdu", "ve", "uzun", "bir", "fetih", "seferi", "için", "Trakya\'ya", "doğru", "yürüdü", "."]),
("Fransız gazetesi Le Figaro'ya göre bu hükumet planı sayesinde 42 milyon Euro kazanç sağlanabilir ve elde edilen paranın 15.5 milyonu ulusal güvenlik için kullanılabilir.", ["Fransız", "gazetesi", "Le", "Figaro'ya", "göre", "bu", "hükumet", "planı", "sayesinde", "42", "milyon", "Euro", "kazanç", "sağlanabilir", "ve", "elde", "edilen", "paranın", "15.5", "milyonu", "ulusal", "güvenlik", "için", "kullanılabilir", "."]),
("Ortalama şansa ve 10.000 Sterlin değerinde tahvillere sahip bir yatırımcı yılda 125 Sterlin ikramiye kazanabilir.", ["Ortalama", "şansa", "ve", "10.000", "Sterlin", "değerinde", "tahvillere", "sahip", "bir", "yatırımcı", "yılda", "125", "Sterlin", "ikramiye", "kazanabilir", "."]),
("3 Kasım Salı günü, Ankara Belediye Başkanı 2014'te hükümetle birlikte oluşturulan kentsel gelişim anlaşmasını askıya alma kararı verdi.", ["3", "Kasım", "Salı", "günü", ",", "Ankara", "Belediye", "Başkanı", "2014'te", "hükümetle", "birlikte", "oluşturulan", "kentsel", "gelişim", "anlaşmasını", "askıya", "alma", "kararı", "verdi", "."]),
("Stalin, Abakumov'u Beria'nın enerji bakanlıkları üzerindeki baskınlığına karşı MGB içinde kendi ağını kurmaya teşvik etmeye başlamıştı.", ["Stalin", ",", "Abakumov'u", "Beria'nın", "enerji", "bakanlıkları", "üzerindeki", "baskınlığına", "karşı", "MGB", "içinde", "kendi", "ını", "kurmaya", "teşvik", "etmeye", "başlamıştı", "."]),
("Güney Avrupa'daki kazı alanlarının çoğunluğu gibi, bu bulgu M.Ö. 5. yüzyılın başlar", ["Güney", "Avrupa'daki", "kazı", "alanlarının", "çoğunluğu", "gibi", ",", "bu", "bulgu", "M.Ö.", "5.", "yüzyılın", "başlar"]),
("Sağlığın bozulması Hitchcock hayatının son yirmi yılında üretimini azalttı.", ["Sağlığın", "bozulması", "Hitchcock", "hayatının", "son", "yirmi", "yılında", "üretimini", "azalttı", "."]),
]
TESTS = (ABBREV_TESTS + URL_TESTS + NUMBER_TESTS + PUNCT_TESTS + GENERAL_TESTS)
def test_tr_tokenizer_exc_lemma_in_text(tr_tokenizer):
text = "Dr. Murat Bey ile görüştüm."
tokens = tr_tokenizer(text)
assert len(tokens) == 6
assert tokens[0].text == "Dr."
assert tokens[0].lemma_ == "doktor"
@pytest.mark.parametrize("text,expected_tokens", TESTS)
def test_tr_tokenizer_handles_allcases(tr_tokenizer, text, expected_tokens):
tokens = tr_tokenizer(text)
token_list = [token.text for token in tokens if not token.is_space]
print(token_list)
assert expected_tokens == token_list