美文网首页NLP
SpaCy v2.0(三)实例 - 添加语言

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

作者: Joe_Gao_89f1 | 来源:发表于2018-04-02 17:05 被阅读1182次

    首先要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(三)实例 - 添加语言

        本文链接:https://www.haomeiwen.com/subject/eyexhftx.html