在 spacy 中使用基于规则的语法分块
Chunking with rule-based grammar in spacy
我在 nltk 中有这个简单的分块示例。
我的数据:
data = 'The little yellow dog will then walk to the Starbucks, where he will introduce them to Michael.'
...预处理...
data_tok = nltk.word_tokenize(data) #tokenisation
data_pos = nltk.pos_tag(data_tok) #POS tagging
分块:
cfg_1 = "CUSTOMCHUNK: {<VB><.*>*?<NNP>}" #should return `walk to the Starbucks`, etc.
chunker = nltk.RegexpParser(cfg_1)
data_chunked = chunker.parse(data_pos)
这个 returns(以及其他东西):(CUSTOMCHUNK walk/VB to/TO the/DT Starbucks/NNP)
,所以它做了我想做的事。
现在我的问题是:我想为我的项目切换到 spacy。我将如何在 spacy 中执行此操作?
我来标记它(粗略的 .pos
方法对我有用):
from spacy.en import English
parser = English()
parsed_sent = parser(u'The little yellow dog will then walk to the Starbucks, where')
def print_coarse_pos(token):
print(token, token.pos_)
for sentence in parsed_sent.sents:
for token in sentence:
print_coarse_pos(token)
... returns 标签和标记
The DET
little ADJ
yellow ADJ
dog NOUN
will VERB
then ADV
walk VERB
...
如何使用我自己的语法提取块?
逐字复制自https://github.com/spacy-io/spaCy/issues/342
有几种方法可以解决这个问题。最接近 RegexpParser
class 的功能是 spaCy 的 Matcher
。但是对于句法分块,我通常会使用依赖解析。例如,对于 NPs 分块,你有 doc.noun_chunks
迭代器:
doc = nlp(text)
for np in doc.noun_chunks:
print(np.text)
它的基本工作方式是这样的:
for token in doc:
if is_head_of_chunk(token)
chunk_start = token.left_edge.i
chunk_end = token.right_edge.i + 1
yield doc[chunk_start : chunk_end]
您可以随意定义假设的 is_head_of
函数。您可以使用依赖分析可视化工具来查看语法注释方案,并找出要使用的标签:http://spacy.io/demos/displacy
我在 nltk 中有这个简单的分块示例。
我的数据:
data = 'The little yellow dog will then walk to the Starbucks, where he will introduce them to Michael.'
...预处理...
data_tok = nltk.word_tokenize(data) #tokenisation
data_pos = nltk.pos_tag(data_tok) #POS tagging
分块:
cfg_1 = "CUSTOMCHUNK: {<VB><.*>*?<NNP>}" #should return `walk to the Starbucks`, etc.
chunker = nltk.RegexpParser(cfg_1)
data_chunked = chunker.parse(data_pos)
这个 returns(以及其他东西):(CUSTOMCHUNK walk/VB to/TO the/DT Starbucks/NNP)
,所以它做了我想做的事。
现在我的问题是:我想为我的项目切换到 spacy。我将如何在 spacy 中执行此操作?
我来标记它(粗略的 .pos
方法对我有用):
from spacy.en import English
parser = English()
parsed_sent = parser(u'The little yellow dog will then walk to the Starbucks, where')
def print_coarse_pos(token):
print(token, token.pos_)
for sentence in parsed_sent.sents:
for token in sentence:
print_coarse_pos(token)
... returns 标签和标记
The DET
little ADJ
yellow ADJ
dog NOUN
will VERB
then ADV
walk VERB
...
如何使用我自己的语法提取块?
逐字复制自https://github.com/spacy-io/spaCy/issues/342
有几种方法可以解决这个问题。最接近 RegexpParser
class 的功能是 spaCy 的 Matcher
。但是对于句法分块,我通常会使用依赖解析。例如,对于 NPs 分块,你有 doc.noun_chunks
迭代器:
doc = nlp(text)
for np in doc.noun_chunks:
print(np.text)
它的基本工作方式是这样的:
for token in doc:
if is_head_of_chunk(token)
chunk_start = token.left_edge.i
chunk_end = token.right_edge.i + 1
yield doc[chunk_start : chunk_end]
您可以随意定义假设的 is_head_of
函数。您可以使用依赖分析可视化工具来查看语法注释方案,并找出要使用的标签:http://spacy.io/demos/displacy