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 import Tokenizer 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 import English help(English)
经由过程这些模块来扩大言语,处置惩罚特别的语法,一般在分词器(Tokenizer)中增加特别划定规矩和Token_Match函数来完成。
1,向分词器中增加特别的划定规矩
import spacy from spacy.symbols import ORTH, 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:
import re import spacy from spacy.lang.en import English def my_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?://') return spacy.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 class myTokenizer(object): def __init__(self, vocab): self.vocab = vocab def __call__(self, text): words=[] re_search=my_token_match(text) if re_search: for start,end in re_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() def my_token_match(text): global RE_SYNONYMS return re.compile(RE_SYNONYMS).search(text) def my_token_replace(text): global RE_SYNONYMS return re.compile(RE_SYNONYMS).sub('',text) def my_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