spaCy 进修 第二篇:言语模子

2019年7月2日11:01:25spaCy 进修 第二篇:言语模子已关闭评论 191

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

spaCy 进修 第二篇:言语模子

一,加载言语模子

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文件构造,这使得数据易于更新和扩大。

 spaCy 进修 第二篇:言语模子

每一个零丁的组件能够在言语模块种导入遍历,并增加到言语的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

avatar