Merge pull request #1365 from wannaphongcom/develop

Add Thai language for spaCy v2
This commit is contained in:
Ines Montani 2017-09-26 23:43:05 +02:00 committed by GitHub
commit 959c46eabe
7 changed files with 240 additions and 1 deletions

35
spacy/lang/th/__init__.py Normal file
View File

@ -0,0 +1,35 @@
# coding: utf8
from __future__ import unicode_literals
from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS
from .tag_map import TAG_MAP
from .stop_words import STOP_WORDS
from ..tokenizer_exceptions import BASE_EXCEPTIONS
from ...tokens import Doc
from ..norm_exceptions import BASE_NORMS
from ...language import Language
from ...attrs import LANG, NORM
from ...util import update_exc, add_lookups
class ThaiDefaults(Language.Defaults):
lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
lex_attr_getters[LANG] = lambda text: 'th'
tokenizer_exceptions = TOKENIZER_EXCEPTIONS
tag_map = dict(TAG_MAP)
stop_words = set(STOP_WORDS)
class Thai(Language):
lang = 'th'
Defaults = ThaiDefaults
def make_doc(self, text):
try:
from pythainlp.tokenize import word_tokenize
except ImportError:
raise ImportError("The Thai tokenizer requires the PyThaiNLP library: "
"https://github.com/wannaphongcom/pythainlp/")
words = [x for x in list(word_tokenize(text,"newmm"))]
return Doc(self.vocab, words=words, spaces=[False]*len(words))
__all__ = ['Thai']

View File

@ -0,0 +1,62 @@
# encoding: utf8
from __future__ import unicode_literals
# data from https://github.com/wannaphongcom/pythainlp/blob/dev/pythainlp/corpus/stopwords-th.txt
# stop words as whitespace-separated list
STOP_WORDS = set("""
นอกจาก าให ทาง งน วง จาก จะ ความ คร คง ของ
ขอ ระหวาง รวม มาก มา พรอม พบ าน ผล บาง เปดเผย เป เนองจาก เดยวก เดยว เช เฉพาะ เข
อง างๆ าง ตาม งแต าน วย อาจ ออก อยาง อะไร อย อยาก หาก หลาย หลงจาก แต เอง เห
เลย เร เรา เม เพ เพราะ เปนการ เป หล หร หน วน าหร ลง วม ราย ขณะ อน การ
กว กลาว ไว ไป ได ให ใน โดย แห แล และ แรก แบบ เขา เคย ไม อยาก เก เกนๆ เกยวก เกยวก
เกยวของ เกยวเนอง เกยวๆ เกอบ เกอบจะ เกอบๆ แก แก แกไข ใกล ใกล ไกล ไกลๆ ขณะเดยวก ขณะใด ขณะใดๆ ขณะท ขณะน ขณะน ขณะหน ขวาง
ขวางๆ ใคร ใคร ใครจะ ใครๆ าย ายๆ ไง จง จด จน จนกระท จนกว จนขณะน จนตลอด จนถ จนท จนบดน จนเม จนแม จนแม
จรด จรดก จร จรงจ จรงๆ จรงๆจงๆ จวน จวนจะ จวนเจยน จวบ งก งก งก งกนและก งไดแก งๆ วย วยก วยเชนก วยท วยประการฉะน
วยเพราะ วยว วยเหต วยเหต วยเหต วยเหตเพราะ วยเหต วยเหมอนก งกลาว งก งก งกบว งกบว งเก
งเก งเคย ใดๆ ได ไดแก ไดแต ได ไดมา ได ตน ตนเอง ตนฯ ตรง ตรงๆ ตลอด ตลอดกาล ตลอดกาลนาน ตลอดจน ตลอดถ ตลอดท
ตลอดท ตลอดทวถ ตลอดทวท ตลอดป ตลอดไป ตลอดมา ตลอดระยะเวลา ตลอดว ตลอดเวลา ตลอดศก อก งแก งจะ งบดน งบดน
งเม งเมอใด งเมอไร งแม งแมจะ งแม งอยางไร อว กตอง กๆ เถอะ เถ ทรง ทว งคน งต งท งท งน งนนดวย งนนเพราะ
นอก นอกจากท นอกจากน นอกจากน นอกจากว นอกน นอกเหน นอกเหนอจาก อย อยกว อยๆ นะ กๆ นไง นเป นแหละ
นเอง นๆ บจากน บจากน บตงแต บแต บแต บแต เปนต เปนตนไป เปนตนมา เปนแต เปนแตเพยง เปนท เปนท เปนท เปนเพราะ
เปนเพราะว เปนเพยง เปนเพยงว เปนเพ เปนอ เปนอนมาก เปนอนว เปนอนๆ เปนอาท เปนๆ เปลยน เปลยนแปลง เป เปดเผย ไป าน านๆ
ดๆ เพยงเพ เพยงไร เพยงไหน เพอท เพอทจะ เพอว เพอให ภาค ภาคฯ ภาย ภายใต ภายนอก ภายใน ภายภาค ภายภาคหน ภายหน ภายหล
มอง มองว กจะ นๆ ยนะ ยน ยเน ยล นนาน นยง นย นยาว เยอะ เยอะแยะ เยอะๆ แยะ แยะๆ รวด รวดเร วม รวมก วมก
รวมดวย วมดวย รวมถ รวมท วมม รวมๆ ระยะ ระยะๆ ระหวาง บรอง อว นกาลนาน บเนอง ดๆ งกว งส งส งๆ เสมอนก
เสมอนว เสร เสรจก เสรจแล เสรจสมบรณ เสรจส เส เสยกอน เสยจน เสยจนกระท เสยจนถ เสยดวย เสยน เสยนนเอง เสยน เสยนกระไร เสยย
เสยยงน เสยแล ใหญ ให ใหแด ใหไป ใหม ใหมา ใหม ไหน ไหนๆ อด อน อยาง อยางเช อยางด อยางเดยว อยางใด อยางท อยางนอย อยางน
อยางน อยางโน แค จะ ได อเม ตาม ตามแต ตามท แลวแต กระท กระทำ กระน กระผม กล กลาวค กล กลมกอน
กลมๆ กวาง กวางขวาง กวางๆ อนหน อนหนาน อนๆ นดกว นดไหม นเถอะ นนะ นและก นไหม นเอง กำล กำลงจะ กำหนด เก
เก เกยวของ แก แกไข ใกล ใกล าง างเคยง างต างบน างลาง างๆ ขาด าพเจ าฯ เขาใจ เขยน คงจะ คงอย ครบ ครบคร ครบถวน
ครงกระน ครงกอน ครงครา ครงคราว ครงใด ครงท ครงน ครงน ครงละ ครงหน ครงหล ครงหลงส ครงไหน ครงๆ คร คร ครา คราใด คราท คราน คราน คราหน
คราไหน คราว คราวกอน คราวใด คราวท คราวน คราวน คราวโน คราวละ คราวหน คราวหน คราวหล คราวไหน คราวๆ คลาย คลายก คลายกนก
คลายก คลายกบว คลายว ควร อน อนขาง อนขางจะ อยไปทาง อนมาทาง อย อยๆ คะ คำ ดว ณๆ
เคยๆ แค แคจะ แค แค แคเพยง แค แคไหน ใคร ใครจะ าย ายๆ จนกว จนแม จนแม งๆ จวบก จวบจน จะได ดการ ดงาน ดแจง
ดต ดทำ ดหา ดให จากน จากน จากนไป จำ จำเป จำพวก งจะ งเป ฉะน ฉะน เฉกเช เฉย เฉยๆ ไฉน วงกอน
วงตอไป วงถดไป วงทาย วงท วงน วงน วงระหวาง วงแรก วงหน วงหล วงๆ วย านาน ชาว าๆ เชนกอน เชนก เชนเคย
เชนด เชนดงกอน เชนดงเก เชนดงท เชนดงว เชนเดยวก เชนเดยวก เชนใด เชนท เชนทเคย เชนท เชนน เชนนนเอง เชนน เชนเม เชนไร เช
เชอถ เชอม เชอว ใช ใชไหม ใช ซะ ซะกอน ซะจน ซะจนกระท ซะจนถ งไดแก วยก วยเชนก วยท วยเพราะ วยว วยเหต วยเหต
วยเหต วยเหตเพราะ วยเหต วยเหมอนก งกลาว งกบว งกบว งเก งเก งเคย างก างหาก ตามดวย ตามแต ตามท
ตามๆ เตมไปดวย เตมไปหมด เตมๆ แต แตอน แตจะ แตเด แตอง แต แตทว แต แต แตเพยง แตเม แตไร แตละ แต แตไหน แตอยางใด โต
โตๆ ใต าจะ าหาก งแก งแม งแมจะ งแม งอยางไร อว กตอง ทว งนนดวย งปวง งเป งมวล งส งหมด งหลาย งๆ
นใดน นท นทนใด ทำไม ทำไร ทำให ทำๆ จร เดยว ใด ใด ได เถอะ แท แทจร ไร ละ ละ
แล แหงน ไหน กคน กคร กครา กคราว กช กต กทาง กท กท กเม กว กวนน กส กหน กแห กอยาง
กอ กๆ เท เทาก เทาก เทาใด เทาท เทาน เทาน เทาไร เทาไหร แท แทจร เธอ นอกจากว อย อยกว อยๆ นไว บแต นาง
นางสาว าจะ นาน นานๆ นาย นำ นำพา นำมา ดหนอย ดๆ ไง นา แน แหละ แหล เอง เอง เน เน
เนยเอง ในชวง ในท ในเม ในระหวาง บน บอก บอกแล บอกว อย อยกว อยคร อยๆ ดดล ดเดยวน ดน ดน าง บางกว
บางขณะ บางคร บางครา บางคราว บางท บางท บางแห บางๆ ปฏ ประกอบ ประการ ประการฉะน ประการใด ประการหน ประมาณ ประสบ ปร
ปรากฏ ปรากฏว จจ เปนดวย เปนด เปนต เปนแต เปนเพ เปนอ เปนอนมาก เปนอาท านๆ ใด เผ เผอจะ เผอท เผอว าย
ายใด พบว พยายาม พรอมก พรอมก พรอมดวย พรอมท พรอมท พรอมเพยง พวก พวกก พวกก พวกแก พวกเขา พวกค พวกฉ พวกทาน
พวกท พวกเธอ พวกน พวกน พวกน พวกโน พวกม พวกม พอ พอก พอควร พอจะ พอด พอต พอท พอท พอเพยง พอแล พอสม พอสมควร
พอเหมาะ พอๆ พา นๆ เพราะฉะน เพราะว เพ เพงจะ เพ เพมเต เพยง เพยงแค เพยงใด เพยงแต เพยงพอ เพยงเพราะ
เพอว เพอให ภายใต มองว มากกว มากมาย ฉะน ใช ได แต งเน งหมาย เมอกอน เมอคร เมอครงกอน
เมอคราวกอน เมอคราวท เมอคราว เมอค เมอเช เมอใด เมอน เมอน เมอเย เมอไร เมอวนวาน เมอวาน เมอไหร แม แมกระท แมแต แมนว แม
ไมอย ไมอยจะ ไมอยเป ไมใช ไมเปนไร ไม ยก ยกให ยอม ยอมร อม อย งคง งง งง งโง งไง งจะ งแต ยาก
ยาว ยาวนาน งกว งข งขนไป งจน งจะ งน งเม งแล งใหญ วมก รวมดวย วมดวย อว เร เรวๆ เราๆ เรยก เรยบ เรอย
เรอยๆ ไร วน วนจน วนแต ละ าส เล เลกนอย เลกๆ เลาว แลวก แลวแต แลวเสร นใด นน นน นไหน สบาย สม สมยกอน
สมยน สมยน สมยโน วนเก วนดอย วนด วนใด วนท วนนอย วนน วนมาก วนใหญ นๆ สามารถ สำค
งใด งน งน งไหน เสรจแล เสยดวย เสยแล แสดง แสดงว หน หนอ หนอย หนอย หมด หมดก หมดส หรอไง หรอเปล หรอไม หรอย
หรอไร หากแม หากแม หากแมนว หากว หาความ หาใช หาร เหต เหตผล เหต เหต เหตไร เหนแก เหนควร เหนจะ เหนว เหล เหลอเก เหล
เหลาน เหลาน แหงใด แหงน แหงน แหงโน แหงไหน แหละ ใหแก ใหญ ใหญโต อยางเช อยางด อยางเดยว อยางใด อยางท อยางนอย อยางน อยางน
อยางโน อยางมาก อยางย อยางไร อยางไรก อยางไรกได อยางไรเส อยางละ อยางหน อยางไหน อยางๆ นจะ นใด นไดแก นท
นทจร นทจะ นเนองมาจาก นละ นไหน นๆ อาจจะ อาจเป อาจเปนดวย นๆ เอ เอา ฯล ฯลฯ
""".split())

81
spacy/lang/th/tag_map.py Normal file
View File

@ -0,0 +1,81 @@
# encoding: utf8
# data from Korakot Chaovavanich (https://www.facebook.com/photo.php?fbid=390564854695031&set=p.390564854695031&type=3&permPage=1&ifg=1)
from __future__ import unicode_literals
from ...symbols import *
TAG_MAP = {
#NOUN
"NOUN": {POS: NOUN},
"NCMN": {POS: NOUN},
"NTTL": {POS: NOUN},
"CNIT": {POS: NOUN},
"CLTV": {POS: NOUN},
"CMTR": {POS: NOUN},
"CFQC": {POS: NOUN},
"CVBL": {POS: NOUN},
#PRON
"PRON": {POS: PRON},
"NPRP": {POS: PRON},
# ADJ
"ADJ": {POS: ADJ},
"NONM": {POS: ADJ},
"VATT": {POS: ADJ},
"DONM": {POS: ADJ},
# ADV
"ADV": {POS: ADV},
"ADVN": {POS: ADV},
"ADVI": {POS: ADV},
"ADVP": {POS: ADV},
"ADVS": {POS: ADV},
# INT
"INT": {POS: INTJ},
# PRON
"PROPN": {POS: PROPN},
"PPRS": {POS: PROPN},
"PDMN": {POS: PROPN},
"PNTR": {POS: PROPN},
# DET
"DET": {POS: DET},
"DDAN": {POS: DET},
"DDAC": {POS: DET},
"DDBQ": {POS: DET},
"DDAQ": {POS: DET},
"DIAC": {POS: DET},
"DIBQ": {POS: DET},
"DIAQ": {POS: DET},
"DCNM": {POS: DET},
# NUM
"NUM": {POS: NUM},
"NCNM": {POS: NUM},
"NLBL": {POS: NUM},
"DCNM": {POS: NUM},
# AUX
"AUX": {POS: AUX},
"XVBM": {POS: AUX},
"XVAM": {POS: AUX},
"XVMM": {POS: AUX},
"XVBB": {POS: AUX},
"XVAE": {POS: AUX},
# ADP
"ADP": {POS: ADP},
"RPRE": {POS: ADP},
# CCONJ
"CCONJ": {POS: CCONJ},
"JCRG": {POS: CCONJ},
# SCONJ
"SCONJ": {POS: SCONJ},
"PREL": {POS: SCONJ},
"JSBR": {POS: SCONJ},
"JCMP": {POS: SCONJ},
# PART
"PART": {POS: PART},
"FIXN": {POS: PART},
"FIXV": {POS: PART},
"EAFF": {POS: PART},
"AITT": {POS: PART},
"NEG": {POS: PART},
# PUNCT
"PUNCT": {POS: PUNCT},
"PUNC": {POS: PUNCT}
}

View File

@ -0,0 +1,43 @@
# encoding: utf8
from __future__ import unicode_literals
from ...symbols import *
TOKENIZER_EXCEPTIONS = {
"ม.ค.": [
{ORTH: "ม.ค.", LEMMA: "มกราคม"}
],
"ก.พ.": [
{ORTH: "ก.พ.", LEMMA: "กุมภาพันธ์"}
],
"มี.ค.": [
{ORTH: "มี.ค.", LEMMA: "มีนาคม"}
],
"เม.ย.": [
{ORTH: "เม.ย.", LEMMA: "เมษายน"}
],
"พ.ค.": [
{ORTH: "พ.ค.", LEMMA: "พฤษภาคม"}
],
"มิ.ย.": [
{ORTH: "มิ.ย.", LEMMA: "มิถุนายน"}
],
"ก.ค.": [
{ORTH: "ก.ค.", LEMMA: "กรกฎาคม"}
],
"ส.ค.": [
{ORTH: "ส.ค.", LEMMA: "สิงหาคม"}
],
"ก.ย.": [
{ORTH: "ก.ย.", LEMMA: "กันยายน"}
],
"ต.ค.": [
{ORTH: "ต.ค.", LEMMA: "ตุลาคม"}
],
"พ.ย.": [
{ORTH: "พ.ย.", LEMMA: "พฤศจิกายน"}
],
"ธ.ค.": [
{ORTH: "ธ.ค.", LEMMA: "ธันวาคม"}
]
}

View File

@ -12,7 +12,7 @@ from .. import util
_languages = ['bn', 'da', 'de', 'en', 'es', 'fi', 'fr', 'he', 'hu', 'id',
'it', 'nb', 'nl', 'pl', 'pt', 'sv', 'xx']
'it', 'nb', 'nl', 'pl', 'pt', 'sv', 'th','xx']
_models = {'en': ['en_core_web_sm'],
'de': ['de_core_news_md'],
'fr': ['fr_depvec_web_lg'],
@ -108,6 +108,11 @@ def he_tokenizer():
def nb_tokenizer():
return util.get_lang_class('nb').Defaults.create_tokenizer()
@pytest.fixture
def th_tokenizer():
pythainlp = pytest.importorskip("pythainlp")
return util.get_lang_class('th').Defaults.create_tokenizer()
@pytest.fixture
def stringstore():

View File

View File

@ -0,0 +1,13 @@
# coding: utf8
from __future__ import unicode_literals
import pytest
TOKENIZER_TESTS = [
("คุณรักผมไหม", ['คุณ', 'รัก', 'ผม', 'ไหม'])
]
@pytest.mark.parametrize('text,expected_tokens', TOKENIZER_TESTS)
def test_thai_tokenizer(th_tokenizer, text, expected_tokens):
tokens = [token.text for token in th_tokenizer(text)]
assert tokens == expected_tokens