diff --git a/setup.py b/setup.py index 6cc6c3d52..fc316e72f 100644 --- a/setup.py +++ b/setup.py @@ -32,6 +32,7 @@ PACKAGES = [ 'spacy.nl', 'spacy.sv', 'spacy.fi', + 'spacy.bn', 'spacy.language_data', 'spacy.serialize', 'spacy.syntax', diff --git a/spacy/__init__.py b/spacy/__init__.py index 373974330..d924c1532 100644 --- a/spacy/__init__.py +++ b/spacy/__init__.py @@ -14,6 +14,7 @@ from . import pt from . import nl from . import sv from . import fi +from . import bn try: basestring @@ -32,6 +33,7 @@ set_lang_class(zh.Chinese.lang, zh.Chinese) set_lang_class(nl.Dutch.lang, nl.Dutch) set_lang_class(sv.Swedish.lang, sv.Swedish) set_lang_class(fi.Finnish.lang, fi.Finnish) +set_lang_class(bn.Bengali.lang, bn.Bengali) diff --git a/spacy/bn/__init__.py b/spacy/bn/__init__.py new file mode 100644 index 000000000..2d3a5d404 --- /dev/null +++ b/spacy/bn/__init__.py @@ -0,0 +1,22 @@ +# encoding: utf8 +from __future__ import unicode_literals, print_function + +from ..language import Language +from ..attrs import LANG + +from .language_data import * + + +class Bengali(Language): + lang = 'bn' + + class Defaults(Language.Defaults): + lex_attr_getters = dict(Language.Defaults.lex_attr_getters) + lex_attr_getters[LANG] = lambda text: 'bn' + + tokenizer_exceptions = TOKENIZER_EXCEPTIONS + stop_words = STOP_WORDS + + prefixes = tuple(TOKENIZER_PREFIXES) + suffixes = tuple(TOKENIZER_SUFFIXES) + infixes = tuple(TOKENIZER_INFIXES) diff --git a/spacy/bn/language_data.py b/spacy/bn/language_data.py new file mode 100644 index 000000000..d7da4ec4b --- /dev/null +++ b/spacy/bn/language_data.py @@ -0,0 +1,18 @@ +# encoding: utf8 +from __future__ import unicode_literals + +from spacy.language_data import strings_to_exc, update_exc +from .punctuation import * +from .stop_words import STOP_WORDS +from .. import language_data as base + +STOP_WORDS = set(STOP_WORDS) + +TOKENIZER_EXCEPTIONS = strings_to_exc(base.EMOTICONS) +update_exc(TOKENIZER_EXCEPTIONS, strings_to_exc(base.ABBREVIATIONS)) + +TOKENIZER_PREFIXES = TOKENIZER_PREFIXES +TOKENIZER_SUFFIXES = TOKENIZER_SUFFIXES +TOKENIZER_INFIXES = TOKENIZER_INFIXES + +__all__ = ["TOKENIZER_EXCEPTIONS", "STOP_WORDS", "TOKENIZER_PREFIXES", "TOKENIZER_SUFFIXES", "TOKENIZER_INFIXES"] diff --git a/spacy/bn/punctuation.py b/spacy/bn/punctuation.py new file mode 100644 index 000000000..64fefc241 --- /dev/null +++ b/spacy/bn/punctuation.py @@ -0,0 +1,45 @@ +# encoding: utf8 +from __future__ import unicode_literals + +from ..language_data.punctuation import ALPHA_LOWER, LIST_ELLIPSES, QUOTES, ALPHA_UPPER, LIST_QUOTES, UNITS, \ + CURRENCY, LIST_PUNCT, ALPHA, _QUOTES + +CURRENCY_SYMBOLS = r"\$ ¢ £ € ¥ ฿ ৳" + +_PUNCT = '। ॥' + +LIST_PUNCT.extend(_PUNCT.strip().split()) + +TOKENIZER_PREFIXES = ( + [r'\+'] + + LIST_PUNCT + + LIST_ELLIPSES + + LIST_QUOTES +) + +TOKENIZER_SUFFIXES = ( + LIST_PUNCT + + LIST_ELLIPSES + + LIST_QUOTES + + [ + r'(?<=[0-9])\+', + r'(?<=°[FfCcKk])\.', + r'(?<=[0-9])(?:{c})'.format(c=CURRENCY), + r'(?<=[0-9])(?:{u})'.format(u=UNITS), + r'(?<=[{al}{p}{c}(?:{q})])\.'.format(al=ALPHA_LOWER, p=r'%²\-\)\]\+', q=QUOTES, c=CURRENCY_SYMBOLS), + r'(?<=[{al})])-e'.format(al=ALPHA_LOWER) + ] +) + +TOKENIZER_INFIXES = ( + LIST_ELLIPSES + + [ + r'(?<=[{al}])\.(?=[{au}])'.format(al=ALPHA_LOWER, au=ALPHA_UPPER), + r'(?<=[{a}]),(?=[{a}])'.format(a=ALPHA), + r'(?<=[{a}"])[:<>=](?=[{a}])'.format(a=ALPHA), + r'(?<=[{a}])--(?=[{a}])'.format(a=ALPHA), + r'(?<=[{a}]),(?=[{a}])'.format(a=ALPHA), + r'(?<=[{a}])([{q}\)\]\(\[])(?=[\-{a}])'.format(a=ALPHA, q=_QUOTES.replace("'", "").strip().replace(" ", "")), + ] +) +__all__ = ["TOKENIZER_PREFIXES", "TOKENIZER_SUFFIXES", "TOKENIZER_INFIXES"] diff --git a/spacy/bn/stop_words.py b/spacy/bn/stop_words.py new file mode 100644 index 000000000..b1e1f783f --- /dev/null +++ b/spacy/bn/stop_words.py @@ -0,0 +1,32 @@ +# encoding: utf8 +from __future__ import unicode_literals + + +STOP_WORDS = set(""" +অতএব অথচ অথবা অনুযায়ী অনেক অনেকে অনেকেই অন্তত অন্য অবধি অবশ্য অর্থাত +আই আগামী আগে আগেই আছে আজ আদ্যভাগে আপনার আপনি আবার আমরা আমাকে আমাদের আমার আমি আর আরও +ই ইত্যাদি ইহা উচিত উনি উপর উপরে +এ এঁদের এঁরা এই এক একই একজন একটা একটি একবার একে এখন এখনও এখানে এখানেই এটা এটাই এটি এত এতটাই এতে এদের এবং এবার এমন এমনকী এর এরা এল এস এসে +ঐ +ও ওঁদের ওঁর ওঁরা ওই ওকে ওখানে ওদের ওর ওরা +কখনও কত কথা কবে কয়েক কয়েকটি করছে করছেন করতে করবে করবেন করলে করলেন করা করাই করায় করার করি করিতে করিয়া করিয়ে করে করেই করেছিলেন করেছে করেছেন করেন কাউকে কাছ কাছে কাজ কাজে কারও কারণ কি কিংবা কিছু কিছুই কিন্তু কী কে কেউ কেউই কেন কোন কোনও কোনো ক্ষেত্রে +খুব +গিয়ে গিয়েছে গুলি গেছে গেল গেলে গোটা +চলে চান চায় চেয়ে +ছাড়া ছাড়াও ছিল ছিলেন +জন জনকে জনের জন্য জন্যওজে জানতে জানা জানানো জানায় জানিয়ে জানিয়েছে জে +টি ঠিক তখন তত তথা তবু তবে তা তাঁকে তাঁদের তাঁর তাঁরা তাঁাহারা তাই তাও তাকে তাতে তাদের তার তারপর তারা তারৈ তাহলে তাহা তাহাতে তাহার তিনঐ তিনি তিনিও তুমি তুলে তেমন তো তোমার +থাকবে থাকবেন থাকা থাকায় থাকে থাকেন থেকে থেকেই থেকেও +দিকে দিতে দিয়ে দিয়েছে দিয়েছেন দিলেন দিয়ে দু দুটি দুটো দেওয়া দেওয়ার দেখতে দেখা দেখে দেন দেয় দেশের দ্বারা +ধরা ধরে +নয় না নাই নাকি নাগাদ নানা নিজে নিজেই নিজেদের নিজের নিতে নিয়ে নিয়ে নেই নেওয়া নেওয়ার নয় +পক্ষে পর পরে পরেই পরেও পর্যন্ত পাওয়া পারি পারে পারেন পেয়ে প্রতি প্রভৃতি প্রায় +ফলে ফিরে ফের +বছর বদলে বরং বলতে বলল বললেন বলা বলে বলেছেন বলেন বসে বহু বা বাদে বার বিনা বিভিন্ন বিশেষ বিষয়টি বেশ ব্যবহার ব্যাপারে +ভাবে ভাবেই +মত মতো মতোই মধ্যভাগে মধ্যে মধ্যেই মধ্যেও মনে মাত্র মাধ্যমে মানুষ মানুষের মোট মোটেই +যখন যত যতটা যথেষ্ট যদি যদিও যা যাঁর যাঁরা যাওয়া যাওয়ার যাকে যাচ্ছে যাতে যাদের যান যাবে যায় যার যারা যায় যিনি যে যেখানে যেতে যেন যেমন +রকম রয়েছে রাখা রেখে +শুধু শুরু সঙ্গে সঙ্গেও সব সবার সমস্ত সম্প্রতি সময় সহ সহিত সাথে সুতরাং সে সেই সেখান সেখানে সেটা সেটাই সেটাও সেটি স্পষ্ট স্বয়ং +হইতে হইবে হইয়া হওয়া হওয়ায় হওয়ার হচ্ছে হত হতে হতেই হন হবে হবেন হয় হয়তো হয়নি হয়ে হয়েই হয়েছিল হয়েছে হয়েছেন হল হলে হলেই হলেও হলো হিসাবে হিসেবে হৈলে হোক হয় হয়ে হয়েছে +""".split())