spaCy处置惩罚文本的历程是模块化的,当挪用nlp处置惩罚文本时,spaCy起首将文本符号化以天生Doc对象,然后,顺次在几个分歧的组件中处置惩罚Doc,这也称为处置惩罚管道。言语模子默许的处置惩罚管道顺次是:tagger、parser、ner等,每一个管道组件返回已处置惩罚的Doc,然后将其传递给下一个组件。

一,加载言语模子

spaCy运用的言语模子是预先练习的统计模子,能够或许展望言语特性,关于英语,共有en_core_web_sm、en_core_web_md和en_core_web_lg三种言语模子,运用spacy.load()函数来加载言语模子

spacy.load(name,disable)

个中,name参数是言语模子的名词,disable参数是禁用的处置惩罚管道列表,比方,建立en_core_web_sm言语模子,并禁用ner:

nlp = spacy.load("en_core_web_sm", disable=['ner'])

言语模子中不只预先界说了Language管道,还界说了处置惩罚文本数据的处置惩罚管道(pipeline),个中分词器是一个特别的管道,它是由Language管道肯定的,不属于pipeline。

{"lang": "en","name": "core_web_sm","description": "Example model for spaCy","pipeline": ["tagger", "parser", "ner"]
}

在加载言语模子nlp以后,能够检察该言语模子预先界说的处置惩罚管道,也就是说,处置惩罚管道依赖于统计模子。

1,检察nlp对象的管道

>>>nlp.pipe_names
[
'tagger', 'parser', 'ner']

2,移除nlp的管道

nlp.remove_pipe(name)

3,向nlp的处置惩罚管道中增添管道

nlp.add_pipe(component, name=None, before=None, after=None, first=None, last=None)

二,言语管道和分词器管道

Language管道是一个特别的管道,当挪用spacy.load()加载言语模子时,spaCy自动建立Lanuage管道,用于存储同享的词汇表、分词划定规矩(Tokenization Rule)和文本解释。

分词器管道是跟Language管道痛痒相关的一个管道,当建立Language管道以后,spaCy依据Language管道供应的词汇表来建立分词器。分词器用于把文本分为单词,标点符号,空格等符号,除运用默许的分词器以外,spaCy许可用户依据须要对分词器举行调解:

from spacy.tokenizer importTokenizer
tokenizer
= Tokenizer(vocab=nlp.vocab,rules,prefix_search, suffix_search, infix_search, token_match)

参数解释:

  • vocab:词汇表
  • rules:dict范例,分词器的特别划定规矩,把婚配到特别划定规矩的单词作为一个token,主如果用于设置token的解释(annotation);
  • prefix_search、suffix_search:范例是re.compile(string).search
  • infix_finditer:范例是re.compile(string).finditer,把婚配到这前缀、后缀或中缀的字符串作为一个token;
  • token_match:返回boolean值的函数范例,把婚配到的字符串识别为一个token;

在文本处置惩罚的历程当中,spaCy起首对文本分词,原始文本在空格处支解,类似于text.split(' '),然后分词器(Tokenizer)从左向右顺次处置惩罚token,在处置惩罚token时,spaCy做了两个check:

  • 是不是婚配特别划定规矩(execption rule)
  • 是不是前缀、中缀或后缀能够支解

一个可选的布尔函数token_match,它婚配的字符串不会被拆分,掩盖之前的划定规矩,对URL或数字之类的器械很有效。

三,扩大言语

每一种言语都是分歧的,一般充溢异常和特别情况,尤其是最常见的单词。 个中一些破例是跨言语同享的,而其他破例则完整详细,一般异常详细,须要举行硬编码。 spaCy.lang模块包罗一切特定于言语的数据,以简朴的Python文件构造,这使得数据易于更新和扩大。

 

每一个零丁的组件能够在言语模块种导入遍历,并增加到言语的Defaults对象种,某些组件(如标点符号划定规矩)一般不须要自界说,能够从全局划定规矩中导入。 其他组件,好比tokenizer和norm破例,则异常详细,会对spaCy在特定言语上的显示和练习言语模子发生严重影响。

比方,导入English模块,检察该模块的资助:

from spacy.lang.en importEnglish
help(English)

经由过程这些模块来扩大言语,处置惩罚特别的语法,一般在分词器(Tokenizer)中增加特别划定规矩和Token_Match函数来完成。

1,向分词器中增加特别的划定规矩

importspacyfrom spacy.symbols importORTH, LEMMA, POS, TAG

nlp
= spacy.load("en_core_web_sm")#add special case rule special_case = [{ORTH: u"gim", LEMMA: u"give", POS: u"VERB"}, {ORTH: u"me"}]
nlp.tokenizer.add_special_case(u
"gimme", special_case)

2,设置特别的划定规矩来婚配token

建立一个自界说的分词器,使分词把https作为一个token:

importreimportspacyfrom spacy.lang.en importEnglishdefmy_en_tokenizer(nlp):
prefix_re
=spacy.util.compile_prefix_regex(English.Defaults.prefixes)
suffix_re
=spacy.util.compile_suffix_regex(English.Defaults.suffixes)
infix_re
=spacy.util.compile_infix_regex(English.Defaults.infixes)
pattern_re
= re.compile(r'^https?://')returnspacy.tokenizer.Tokenizer(nlp.vocab,
English.Defaults.tokenizer_exceptions,
prefix_re.search,
suffix_re.search,
infix_re.finditer,
token_match
=pattern_re.match)

在处置惩罚文本时挪用该分词器,把婚配到正则的文本作为一个token来处置惩罚:

nlp = spacy.load("en_core_web_sm")
nlp.tokenizer
=my_en_tokenizer(nlp)
doc
= nlp(u"Spacy is breaking when combining custom tokenizer's token_match, access https://github.com/explosion/spaCy to get details")print([t.text for t in doc])

3,自界说分词器

预先界说的分词器是依照空格来分词的,用于能够自界说分词器

### customer tokenizer

classmyTokenizer(object):def __init__(self, vocab):
self.vocab
=vocabdef __call__(self, text):
words
=[]
re_search
=my_token_match(text)ifre_search:for start,end inre_search.regs:if start >=0 and end>=0:
words.append(text[start:end])
text
=my_token_replace(text)
split_words
=my_token_split(text)print(split_words)

words.extend([w
for w in split_words if w!=''])#All tokens 'own' a subsequent space character in this tokenizer spaces = [True] *len(words)return Doc(self.vocab, words=words, spaces=spaces) ###parse the synonyms RE_SYNONYMS=parse_synonyms()defmy_token_match(text):globalRE_SYNONYMSreturnre.compile(RE_SYNONYMS).search(text)defmy_token_replace(text):globalRE_SYNONYMSreturn re.compile(RE_SYNONYMS).sub('',text)defmy_token_split(text):#return re.compile('\s+|\W+|_+').split(text) return re.compile('\s+|\\+|_+').split(text)

援用自界说的分词器

nlp=spacy.load("en_core_web_sm")
nlp.tokenizer
= myTokenizer(nlp.vocab)

 

 

 

参考文档:

Linguistic Features-Tokenization

Pipeline

Processing Pipelines

Adding Languages

Last modification:March 25, 2020
如果觉得我的文章对你有用,请随意赞赏