added russian language support

This commit is contained in:
yuukos 2017-10-12 22:24:20 +07:00 committed by Vadim Mazaev
parent 1e3068ec33
commit 3aad66cf00
4 changed files with 157 additions and 0 deletions

56
spacy/ru/__init__.py Normal file
View File

@ -0,0 +1,56 @@
# encoding: utf8
from __future__ import unicode_literals, print_function
from ..language import Language
from ..attrs import LANG
from ..tokens import Doc
from .language_data import *
class RussianTokenizer(object):
try:
from pymorphy2 import MorphAnalyzer
except ImportError:
raise ImportError(
"The Russian tokenizer requires the pymorphy2 library: "
"try to fix it with "
"pip install pymorphy2==0.8")
_morph = MorphAnalyzer()
def __init__(self, spacy_tokenizer, cls, nlp=None):
self.vocab = nlp.vocab if nlp else cls.create_vocab(nlp)
self._spacy_tokenizer = spacy_tokenizer
def __call__(self, text):
words = [self._normalize(RussianTokenizer._get_word(token))
for token in self._spacy_tokenizer(text)]
return Doc(self.vocab, words, [False] * len(words))
@staticmethod
def _get_word(token):
return token.lemma_ if len(token.lemma_) > 0 else token.text
@classmethod
def _normalize(cls, word):
return cls._morph.parse(word)[0].normal_form
class RussianDefaults(Language.Defaults):
lex_attr_getters = dict(Language.Defaults.lex_attr_getters)
lex_attr_getters[LANG] = lambda text: 'ru'
tokenizer_exceptions = TOKENIZER_EXCEPTIONS
stop_words = STOP_WORDS
@classmethod
def create_tokenizer(cls, nlp=None):
tokenizer = super(RussianDefaults, cls).create_tokenizer(nlp)
return RussianTokenizer(tokenizer, cls, nlp)
class Russian(Language):
lang = 'ru'
Defaults = RussianDefaults

18
spacy/ru/language_data.py Normal file
View File

@ -0,0 +1,18 @@
# encoding: utf8
from __future__ import unicode_literals
from .. import language_data as base
from ..language_data import update_exc, strings_to_exc
from .stop_words import STOP_WORDS
from .tokenizer_exceptions import TOKENIZER_EXCEPTIONS
STOP_WORDS = set(STOP_WORDS)
TOKENIZER_EXCEPTIONS = dict(TOKENIZER_EXCEPTIONS)
update_exc(TOKENIZER_EXCEPTIONS, strings_to_exc(base.EMOTICONS))
__all__ = ["STOP_WORDS", "TOKENIZER_EXCEPTIONS"]

54
spacy/ru/stop_words.py Normal file
View File

@ -0,0 +1,54 @@
# encoding: utf8
from __future__ import unicode_literals
STOP_WORDS = set("""
а
будем будет будете будешь буду будут будучи будь будьте бы был была были было
быть
в вам вами вас весь во вот все всё всего всей всем всём всеми всему всех всею
всея всю вся вы
да для до
его едим едят ее её ей ел ела ем ему емъ если ест есть ешь еще ещё ею
же
за
и из или им ими имъ их
к как кем ко когда кого ком кому комья которая которого которое которой котором
которому которою которую которые который которым которыми которых кто
меня мне мной мною мог моги могите могла могли могло могу могут мое моё моего
моей моем моём моему моею можем может можете можешь мои мой моим моими моих
мочь мою моя мы
на нам нами нас наса наш наша наше нашего нашей нашем нашему нашею наши нашим
нашими наших нашу не него нее неё ней нем нём нему нет нею ним ними них но
о об один одна одни одним одними одних одно одного одной одном одному одною
одну он она оне они оно от
по при
с сам сама сами самим самими самих само самого самом самому саму свое своё
своего своей своем своём своему своею свои свой своим своими своих свою своя
себе себя собой собою
та так такая такие таким такими таких такого такое такой таком такому такою
такую те тебе тебя тем теми тех то тобой тобою того той только том томах тому
тот тою ту ты
у уже
чего чем чём чему что чтобы
эта эти этим этими этих это этого этой этом этому этот этою эту
я
""".split())

View File

@ -0,0 +1,29 @@
# 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: "Воскресенье"}
],
}