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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容