首先要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
网友评论