diff --git a/spacy/lang/tr/__init__.py b/spacy/lang/tr/__init__.py index fb0883a68..5ec5e80ae 100644 --- a/spacy/lang/tr/__init__.py +++ b/spacy/lang/tr/__init__.py @@ -1,7 +1,7 @@ # coding: utf8 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 .syntax_iterators import SYNTAX_ITERATORS from .lex_attrs import LEX_ATTRS @@ -24,6 +24,7 @@ class TurkishDefaults(Language.Defaults): ) tokenizer_exceptions = update_exc(BASE_EXCEPTIONS, TOKENIZER_EXCEPTIONS) stop_words = STOP_WORDS + token_match = TOKEN_MATCH syntax_iterators = SYNTAX_ITERATORS morph_rules = MORPH_RULES diff --git a/spacy/lang/tr/tokenizer_exceptions.py b/spacy/lang/tr/tokenizer_exceptions.py index f48e035d4..57dc986f1 100644 --- a/spacy/lang/tr/tokenizer_exceptions.py +++ b/spacy/lang/tr/tokenizer_exceptions.py @@ -1,119 +1,183 @@ # coding: utf8 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 [ - {ORTH: "A.B.D.", NORM: "Amerika Birleşik Devletleri"}, - {ORTH: "Alb.", NORM: "Albay"}, - {ORTH: "Ar.Gör.", NORM: "Araştırma Görevlisi"}, - {ORTH: "Arş.Gör.", NORM: "Araştırma Görevlisi"}, - {ORTH: "Asb.", NORM: "Astsubay"}, - {ORTH: "Astsb.", NORM: "Astsubay"}, - {ORTH: "As.İz.", NORM: "Askeri İnzibat"}, - {ORTH: "Atğm", NORM: "Asteğmen"}, - {ORTH: "Av.", NORM: "Avukat"}, - {ORTH: "Apt.", NORM: "Apartmanı"}, - {ORTH: "Bçvş.", NORM: "Başçavuş"}, - {ORTH: "bk.", NORM: "bakınız"}, - {ORTH: "bknz.", NORM: "bakınız"}, - {ORTH: "Bnb.", NORM: "Binbaşı"}, - {ORTH: "bnb.", NORM: "binbaşı"}, - {ORTH: "Böl.", NORM: "Bölümü"}, - {ORTH: "Bşk.", NORM: "Başkanlığı"}, - {ORTH: "Bştbp.", NORM: "Baştabip"}, - {ORTH: "Bul.", NORM: "Bulvarı"}, - {ORTH: "Cad.", NORM: "Caddesi"}, - {ORTH: "çev.", NORM: "çeviren"}, - {ORTH: "Çvş.", NORM: "Çavuş"}, - {ORTH: "dak.", NORM: "dakika"}, - {ORTH: "dk.", NORM: "dakika"}, - {ORTH: "Doç.", NORM: "Doçent"}, - {ORTH: "doğ.", NORM: "doğum tarihi"}, - {ORTH: "drl.", NORM: "derleyen"}, - {ORTH: "Dz.", NORM: "Deniz"}, - {ORTH: "Dz.K.K.lığı", NORM: "Deniz Kuvvetleri Komutanlığı"}, - {ORTH: "Dz.Kuv.", NORM: "Deniz Kuvvetleri"}, - {ORTH: "Dz.Kuv.K.", NORM: "Deniz Kuvvetleri Komutanlığı"}, - {ORTH: "dzl.", NORM: "düzenleyen"}, - {ORTH: "Ecz.", NORM: "Eczanesi"}, - {ORTH: "ekon.", NORM: "ekonomi"}, - {ORTH: "Fak.", NORM: "Fakültesi"}, - {ORTH: "Gn.", NORM: "Genel"}, - {ORTH: "Gnkur.", NORM: "Genelkurmay"}, - {ORTH: "Gn.Kur.", NORM: "Genelkurmay"}, - {ORTH: "gr.", NORM: "gram"}, - {ORTH: "Hst.", NORM: "Hastanesi"}, - {ORTH: "Hs.Uzm.", NORM: "Hesap Uzmanı"}, - {ORTH: "huk.", NORM: "hukuk"}, - {ORTH: "Hv.", NORM: "Hava"}, - {ORTH: "Hv.K.K.lığı", NORM: "Hava Kuvvetleri Komutanlığı"}, - {ORTH: "Hv.Kuv.", NORM: "Hava Kuvvetleri"}, - {ORTH: "Hv.Kuv.K.", NORM: "Hava Kuvvetleri Komutanlığı"}, - {ORTH: "Hz.", NORM: "Hazreti"}, - {ORTH: "Hz.Öz.", NORM: "Hizmete Özel"}, - {ORTH: "İng.", NORM: "İngilizce"}, - {ORTH: "Jeol.", NORM: "Jeoloji"}, - {ORTH: "jeol.", NORM: "jeoloji"}, - {ORTH: "Korg.", NORM: "Korgeneral"}, - {ORTH: "Kur.", NORM: "Kurmay"}, - {ORTH: "Kur.Bşk.", NORM: "Kurmay Başkanı"}, - {ORTH: "Kuv.", NORM: "Kuvvetleri"}, - {ORTH: "Ltd.", NORM: "Limited"}, - {ORTH: "Mah.", NORM: "Mahallesi"}, - {ORTH: "mah.", NORM: "mahallesi"}, - {ORTH: "max.", NORM: "maksimum"}, - {ORTH: "min.", NORM: "minimum"}, - {ORTH: "Müh.", NORM: "Mühendisliği"}, - {ORTH: "müh.", NORM: "mühendisliği"}, - {ORTH: "MÖ.", NORM: "Milattan Önce"}, - {ORTH: "Onb.", NORM: "Onbaşı"}, - {ORTH: "Ord.", NORM: "Ordinaryüs"}, - {ORTH: "Org.", NORM: "Orgeneral"}, - {ORTH: "Ped.", NORM: "Pedagoji"}, - {ORTH: "Prof.", NORM: "Profesör"}, - {ORTH: "Sb.", NORM: "Subay"}, - {ORTH: "Sn.", NORM: "Sayın"}, - {ORTH: "sn.", NORM: "saniye"}, - {ORTH: "Sok.", NORM: "Sokak"}, - {ORTH: "Şb.", NORM: "Şube"}, - {ORTH: "Şti.", NORM: "Şirketi"}, - {ORTH: "Tbp.", NORM: "Tabip"}, - {ORTH: "T.C.", NORM: "Türkiye Cumhuriyeti"}, - {ORTH: "Tel.", NORM: "Telefon"}, - {ORTH: "tel.", NORM: "telefon"}, - {ORTH: "telg.", NORM: "telgraf"}, - {ORTH: "Tğm.", NORM: "Teğmen"}, - {ORTH: "tğm.", NORM: "teğmen"}, - {ORTH: "tic.", NORM: "ticaret"}, - {ORTH: "Tug.", NORM: "Tugay"}, - {ORTH: "Tuğg.", NORM: "Tuğgeneral"}, - {ORTH: "Tümg.", NORM: "Tümgeneral"}, - {ORTH: "Uzm.", NORM: "Uzman"}, - {ORTH: "Üçvş.", NORM: "Üstçavuş"}, - {ORTH: "Üni.", NORM: "Üniversitesi"}, - {ORTH: "Ütğm.", NORM: "Üsteğmen"}, - {ORTH: "vb.", NORM: "ve benzeri"}, - {ORTH: "vs.", NORM: "vesaire"}, - {ORTH: "Yard.", NORM: "Yardımcı"}, - {ORTH: "Yar.", NORM: "Yardımcı"}, - {ORTH: "Yd.Sb.", NORM: "Yedek Subay"}, - {ORTH: "Yard.Doç.", NORM: "Yardımcı Doçent"}, - {ORTH: "Yar.Doç.", NORM: "Yardımcı Doçent"}, - {ORTH: "Yb.", NORM: "Yarbay"}, - {ORTH: "Yrd.", NORM: "Yardımcı"}, - {ORTH: "Yrd.Doç.", NORM: "Yardımcı Doçent"}, - {ORTH: "Y.Müh.", NORM: "Yüksek mühendis"}, - {ORTH: "Y.Mim.", NORM: "Yüksek mimar"}, -]: - _exc[exc_data[ORTH]] = [exc_data] +_abbr_period_exc = [ + {ORTH: "A.B.D.", LEMMA: "Amerika Birleşik Devletleri", NORM: "Amerika"}, + {ORTH: "Alb.", LEMMA: "albay", NORM: "albay"}, + {ORTH: "Ank.", LEMMA: "Ankara", NORM: "Ankara"}, + {ORTH: "Ar.Gör.", LEMMA: "araştırma görevlisi"}, + {ORTH: "Arş.Gör.", LEMMA: "araştırma görevlisi"}, + {ORTH: "Asb.", LEMMA: "astsubay", NORM: "astsubay"}, + {ORTH: "Astsb.", LEMMA: "astsubay", NORM: "astsubay"}, + {ORTH: "As.İz.", LEMMA: "askeri inzibat"}, + {ORTH: "as.iz.", LEMMA: "askeri inzibat"}, + {ORTH: "Atğm", LEMMA: "asteğmen", NORM: "asteğmen"}, + {ORTH: "Av.", LEMMA: "avukat", NORM: "avukat"}, + {ORTH: "Apt.", LEMMA: "apartmanı", NORM: "apartmanı"}, + {ORTH: "apt.", LEMMA: "apartmanı", NORM: "apartmanı"}, + {ORTH: "Bçvş.", LEMMA: "başçavuş", NORM: "başçavuş"}, + {ORTH: "bçvş.", LEMMA: "başçavuş", NORM: "başçavuş"}, + {ORTH: "bk.", LEMMA: "bakınız", NORM: "bakınız"}, + {ORTH: "bknz.", LEMMA: "bakınız", NORM: "bakınız"}, + {ORTH: "Bnb.", LEMMA: "binbaşı", NORM: "binbaşı"}, + {ORTH: "bnb.", LEMMA: "binbaşı", NORM: "binbaşı"}, + {ORTH: "Böl.", LEMMA: "bölümü", NORM: "bölümü"}, + {ORTH: "böl.", LEMMA: "bölümü", NORM: "bölümü"}, + {ORTH: "Bşk.", LEMMA: "başkanlığı", NORM: "başkanlığı"}, + {ORTH: "bşk.", LEMMA: "başkanlığı", NORM: "başkanlığı"}, + {ORTH: "Bştbp.", LEMMA: "baştabip", NORM: "baştabip"}, + {ORTH: "bştbp.", LEMMA: "baştabip", NORM: "baştabip"}, + {ORTH: "Bul.", LEMMA: "bulvarı", NORM: "bulvarı"}, + {ORTH: "bul.", LEMMA: "bulvarı", NORM: "bulvarı"}, + {ORTH: "Cad.", LEMMA: "caddesi", NORM: "caddesi"}, + {ORTH: "cad.", LEMMA: "caddesi", NORM: "caddesi"}, + {ORTH: "çev.", LEMMA: "çeviren", NORM: "çeviren"}, + {ORTH: "Çvş.", LEMMA: "çavuş", NORM: "çavuş"}, + {ORTH: "çvş.", LEMMA: "çavuş", NORM: "çavuş"}, + {ORTH: "dak.", LEMMA: "dakika", NORM: "dakika"}, + {ORTH: "dk.", LEMMA: "dakika", NORM: "dakika"}, + {ORTH: "Doç.", LEMMA: "doçent", NORM: "doçent"}, + {ORTH: "doğ.", LEMMA: "doğum tarihi"}, + {ORTH: "Dr.", LEMMA: "doktor", NORM: "doktor"}, + {ORTH: "dr.", LEMMA: "doktor", NORM:"doktor"}, + {ORTH: "drl.", LEMMA: "derleyen", NORM: "derleyen"}, + {ORTH: "Dz.", LEMMA: "deniz", NORM: "deniz"}, + {ORTH: "Dz.K.K.lığı", LEMMA: "Deniz Kuvvetleri Komutanlığı"}, + {ORTH: "Dz.Kuv.", LEMMA: "Deniz Kuvvetleri"}, + {ORTH: "Dz.Kuv.K.", LEMMA: "Deniz Kuvvetleri Komutanlığı"}, + {ORTH: "dzl.", LEMMA: "düzenleyen", NORM: "düzenleyen"}, + {ORTH: "Ecz.", LEMMA: "eczanesi", NORM: "eczanesi"}, + {ORTH: "ecz.", LEMMA: "eczanesi", NORM: "eczanesi"}, + {ORTH: "ekon.", LEMMA: "ekonomi", NORM: "ekonomi"}, + {ORTH: "Fak.", LEMMA: "fakültesi", NORM: "fakültesi"}, + {ORTH: "Gn.", LEMMA: "genel", NORM: "genel"}, + {ORTH: "Gnkur.", LEMMA: "Genelkurmay", NORM: "Genelkurmay"}, + {ORTH: "Gn.Kur.", LEMMA: "Genelkurmay", NORM: "Genelkurmay"}, + {ORTH: "gr.", LEMMA: "gram", NORM: "gram"}, + {ORTH: "Hst.", LEMMA: "hastanesi", NORM: "hastanesi"}, + {ORTH: "hst.", LEMMA: "hastanesi", NORM: "hastanesi"}, + {ORTH: "Hs.Uzm.", LEMMA: "hesap uzmanı"}, + {ORTH: "huk.", LEMMA: "hukuk", NORM: "hukuk"}, + {ORTH: "Hv.", LEMMA: "hava", NORM: "hava"}, + {ORTH: "Hv.K.K.lığı", LEMMA: "Hava Kuvvetleri Komutanlığı"}, + {ORTH: "Hv.Kuv.", LEMMA: "Hava Kuvvetleri"}, + {ORTH: "Hv.Kuv.K.", LEMMA: "Hava Kuvvetleri Komutanlığı"}, + {ORTH: "Hz.", LEMMA: "hazreti", NORM: "hazreti"}, + {ORTH: "Hz.Öz.", LEMMA: "hizmete özel"}, + {ORTH: "İng.", LEMMA: "ingilizce", NORM: "ingilizce"}, + {ORTH: "İst.", LEMMA: "İstanbul", NORM: "İstanbul"}, + {ORTH: "Jeol.", LEMMA: "jeoloji", NORM: "jeoloji"}, + {ORTH: "jeol.", LEMMA: "jeoloji", NORM: "jeoloji"}, + {ORTH: "Korg.", LEMMA: "korgeneral", NORM: "korgeneral"}, + {ORTH: "Kur.", LEMMA: "kurmay", NORM: "kurmay"}, + {ORTH: "Kur.Bşk.", LEMMA: "kurmay başkanı"}, + {ORTH: "Kuv.", LEMMA: "kuvvetleri", NORM: "kuvvetleri"}, + {ORTH: "Ltd.", LEMMA: "limited", NORM: "limited"}, + {ORTH: "ltd.", LEMMA: "limited", NORM: "limited"}, + {ORTH: "Mah.", LEMMA: "mahallesi", NORM: "mahallesi"}, + {ORTH: "mah.", LEMMA: "mahallesi", NORM: "mahallesi"}, + {ORTH: "max.", LEMMA: "maksimum", NORM: "maksimum"}, + {ORTH: "min.", LEMMA: "minimum", NORM: "minimum"}, + {ORTH: "Müh.", LEMMA: "mühendisliği", NORM: "mühendisliği"}, + {ORTH: "müh.", LEMMA: "mühendisliği", NORM: "mühendisliği"}, + {ORTH: "M.Ö.", LEMMA: "milattan önce"}, + {ORTH: "M.S.", LEMMA: "milattan sonra"}, + {ORTH: "Onb.", LEMMA: "onbaşı", NORM: "onbaşı"}, + {ORTH: "Ord.", LEMMA: "ordinaryüs", NORM: "ordinaryüs"}, + {ORTH: "Org.", LEMMA: "orgeneral", NORM: "orgeneral"}, + {ORTH: "Ped.", LEMMA: "pedagoji", NORM: "pedagoji"}, + {ORTH: "Prof.", LEMMA: "profesör", NORM: "profesör"}, + {ORTH: "prof.", LEMMA: "profesör", NORM: "profesör"}, + {ORTH: "Sb.", LEMMA: "subay", NORM: "subay"}, + {ORTH: "Sn.", LEMMA: "sayın", NORM: "sayın"}, + {ORTH: "sn.", LEMMA: "saniye", NORM: "saniye"}, + {ORTH: "Sok.", LEMMA: "sokak", NORM: "sokak"}, + {ORTH: "sok.", LEMMA: "sokak", NORM: "sokak"}, + {ORTH: "Şb.", LEMMA: "şube", NORM: "şube"}, + {ORTH: "şb.", LEMMA: "şube", NORM: "şube"}, + {ORTH: "Şti.", LEMMA: "şirketi", NORM: "şirketi"}, + {ORTH: "şti.", LEMMA: "şirketi", NORM: "şirketi"}, + {ORTH: "Tbp.", LEMMA: "tabip", NORM: "tabip"}, + {ORTH: "tbp.", LEMMA: "tabip", NORM: "tabip"}, + {ORTH: "T.C.", LEMMA: "Türkiye Cumhuriyeti"}, + {ORTH: "Tel.", LEMMA: "telefon", NORM: "telefon"}, + {ORTH: "tel.", LEMMA: "telefon", NORM: "telefon"}, + {ORTH: "telg.", LEMMA: "telgraf", NORM: "telgraf"}, + {ORTH: "Tğm.", LEMMA: "teğmen", NORM: "teğmen"}, + {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 +TOKEN_MATCH = re.compile(r"^({abbr})|({n})$".format(n=_nums, abbr=_abbrev_inflected)).match diff --git a/spacy/tests/lang/tr/test_text.py b/spacy/tests/lang/tr/test_text.py index 2fe638b5f..75ff649d3 100644 --- a/spacy/tests/lang/tr/test_text.py +++ b/spacy/tests/lang/tr/test_text.py @@ -5,6 +5,27 @@ import pytest 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 açı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( "word", [ diff --git a/spacy/tests/lang/tr/test_tokenizer.py b/spacy/tests/lang/tr/test_tokenizer.py new file mode 100644 index 000000000..bc0e159e7 --- /dev/null +++ b/spacy/tests/lang/tr/test_tokenizer.py @@ -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", "uç", "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", "."]), + ("9’daki otobüse binsek mi?", ["9’daki", "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", "ağı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 +