SpaCy v2.0(三)实例 - 添加语言

首先要Git Clone spaCy的最新版本。

spaCy的语言包括properties和methods。

properties:

    VOCAB

    STOP_WORDS

    TOKENIZER_EXCEPTIONS

    TOKEN_MATCH

    NORM_EXCEPTIONS

    TOKENIZER_PREFIXES

    TOKENIZER_SUFFIXES

    TOKENIZER_INFIXES

    LEX_ATTRS

    SYNTAX_ITERATORS

    LOOKUP

    LEMMA_RULES, LEMMA_INDEX,LEMMA_EXC

    TAG_MAP

    MORPH_RULES

以上这些就是定义停用词、排除词、前中后缀、标点符号、词形还原、标签映射之类的这些每个语言的特征。

 Methods

Tokenizer

Tensorizer

Parser(intent and dependencies)

NER(以及New Entity Type)

TAGGER

Text Classification(Textcat)

SBD

Sentencizer

Merge_noun_chunks

Merge_entities

Merge_subtokens

以上这些mothods都是pips,都封装在pipline里。


添加语言

语言的相关内容都在spaCy目录内已经预设了中文,内容在spacy/lang/zh目录中,初始状态下,目录内有__init__.py和example.py两个文件, __init__.py引入了结巴分词,没有引入任何属性设置。实际上在spacy/lang/目录中已经做好了几个通用设置(char_classes.py / entity_rule.py / lex_attrs.py / norm_exceptions.py / punctuation.py / tag_map.py / tokenizer_exceptions.py),可以直接引入,当然没必要的设置可以不用管。

Zh的__ini__.py文件

在zh中定义lex_attrs / morph_rules / stop_words / syntax_iterators / tag_map五项从上级目录(lang)import:char_classes / punctuation /norm_exceptions / tokenizer_exceptions以及其他基本依赖。修改后的代码如下:

# coding: utf8

from __future__ import unicode_literals

from .tag_map import TAG_MAP

from .stop_words import STOP_WORDS

from .lex_attrs import LEX_ATTRS

from .morph_rules import MORPH_RULES

from .syntax_iterators import SYNTAX_ITERATORS


from ..tokenizer_exceptions import BASE_EXCEPTIONS

from ..norm_exceptions import BASE_NORMS

from ..punctuation import TOKENIZER_PREFIXES, TOKENIZER_SUFFIXES,TOKENIZER_INFIXES

from ..char_classes import UNITS, CURRENCY, QUOTES, PUNCT, HYPHENS,ICONS, LIST_UNITS, LIST_CURRENCY, LIST_QUOTES, LIST_PUNCT, LIST_HYPHENS,LIST_ELLIPSES, LIST_ICONS


from ...attrs import LANG, NORM

from ...language import Language

from ...tokens import Doc

from ...util import update_exc, add_lookups


class ChineseDefaults(Language.Defaults):

    lex_attr_getters =dict(Language.Defaults.lex_attr_getters)

   lex_attr_getters.update(LEX_ATTRS)

    lex_attr_getters[LANG] =lambda text: 'zh'  # for pickling

    lex_attr_getters[NORM] =add_lookups(Language.Defaults.lex_attr_getters[NORM],

                                        BASE_NORMS)

    tokenizer_exceptions =update_exc(BASE_EXCEPTIONS)


    use_jieba = True

    tag_map = TAG_MAP

    stop_words = STOP_WORDS

    morph_rules = MORPH_RULES

    syntax_iterators =SYNTAX_ITERATORS


class Chinese(Language):

    lang = 'zh'

    Defaults =ChineseDefaults  # override defaults


    def make_doc(self, text):

        ifself.Defaults.use_jieba:

            try:

                import jieba

            except ImportError:

                msg = ("Jiebanot installed. Either set Chinese.use_jieba = False, "

                       "orinstall it https://github.com/fxsjy/jieba")

                raiseImportError(msg)

            words =list(jieba.cut(text, cut_all=False))

            words = [x for x inwords if x]

            return Doc(self.vocab,words=words, spaces=[False]*len(words))

        else:

            words = []

            spaces = []

            doc =self.tokenizer(text)

            for token inself.tokenizer(text):

               words.extend(list(token.text))

               spaces.extend([False]*len(token.text))

                spaces[-1] =bool(token.whitespace_)

            return Doc(self.vocab,words=words, spaces=spaces)


__all__ = ['Chinese']


语言属性

zh里面自定义的.py文件内容,lex_attrs,morph_rules,stop_words,syntax_iterators,tag_map这五个.py文件可以从其他语言比如en中拷贝后翻译。下面看看怎么修改:

1、lex_attrs.py

这个文件中的_num_words =后面的内容直接写成中文就行了,如下

……

_num_words = ['零', '一', '二', '三', '四', '五', '六', '七',  '八', '九', '十', '十一', '十二', '十三', '十四', '十五', '十六', '十七', '十八', '十九', '二十', '三十', '四十', '五十', '六十', '七十', '八十', '九十', '百', '千', '百万', '十亿', '万亿', '百兆', 'gajillion', 'bazillion']

……

2、morph_rules.py

翻译MORPH_RULES =后面的I,me,you,he…这些在冒号左边的元素。

MORPH_RULES = {

    "PRP": {

        "我": {LEMMA: PRON_LEMMA,  "PronType": "Prs", "Person": "One",  "Number": "Sing"},

……

在中文里“我”和“他”“她”在主语和宾语时不发生变形,所以,没有I和me的区别,中文“我” “他”“她”的定义为:

"我":  {LEMMA: PRON_LEMMA, "PronType":"Prs", "Person": "One", "Number":"Sing"},

"他":  {LEMMA: PRON_LEMMA, "PronType":"Prs", "Person": "Three", "Number":"Sing", "Gender": "Masc"},

"她":  {LEMMA: PRON_LEMMA, "PronType":"Prs", "Person": "Three", "Number":"Sing", "Gender": "Fem"},

其他还有,我们,他们,她们等等定义方式与英文不同。

3、stop_words.py

将下载的中文停用词表内容拷贝到STOP_WORDS = set(""" 里,跟在英文后面就行。

4、syntax_iterators.py

语法分析,这个先直接用en里的吧

5、tag_map.py

先直接用en的。

现在zh的基本属性算是设置完了,接下来可以创建一个zh model。


导入fasttext训练的vector

Spacy 目前支持结巴中文分词,可以使用Spacy导入预训练的wordvector,最后测试基于wordvector的词语相似度。

这里使用examples中的vectors_fast_text.py,导入一个fasttext训练的vec文件。

python  vectors_fast_text.py ./XXXXXX.vec zh

指定vector的路径,指定语言code。

运行完成后会生成zh_model目录,也就是语言模型了,目录结构如下:

zh_model

├──meta.json

├──tokenizer

└──vocab

    ├──key2row

    ├──lexemes.bin

    ├──strings.json

    └──vectors

现在,就可以通过spacy.load(“./zh_model”)加载了。

但是到此为止还不能进行NER,Parser,TextClassifier等等这些操作,需要训练这些模型,添加到pipline里,参见 训练分析模型。

文中完整代码可参考 https://github.com/jeusgao/spaCy-new-language-test-Chinese

你可能感兴趣的:(SpaCy v2.0(三)实例 - 添加语言)