合并跨度后合并句子

时间:2018-02-06 18:18:25

标签: python spacy

假设我有一个句子

'使用Data.Frames可以让您有效地处理数据'

使用spacy这个例子将被分成两个句子:

>> example = 'Using Data.Frames allows you to handle data efficiently'
>> doc = nlp(example)
>> list(doc.sents)
[Using Data., Frames allows you to handle data efficiently]

recommendation from this other question之后,我可以通过跨度合并来解决这个问题,就像这样

>> doc[1:4].merge()
>> doc[1]
Data.Frame

然而,这不会合并先前拆分的句子

>>> list(doc.sents)
[Using Data.Frames, allows you to handle data efficiently]

在应用了一组合并操作后,重新处理句子标记化的最佳方法是什么?这对我很重要,因为我之后需要导航解析树。

P.S。在我的实际应用程序中,我需要使用正则表达式来识别这种特殊情况缩写(大致[A-Za-z0-9-:]+.[A-Z][a-z0-9A-Z]+)。因此我不能使用spacy的add_special_case。也许我可以使用自定义标记器,但我不知道该怎么做。

  • Python版本: 2.7.12
  • 平台: Linux-4.4.0-21-generic-x86_64-with-LinuxMint-18-sarah
  • spaCy版本: 2.0.5

1 个答案:

答案 0 :(得分:1)

我设法通过基于自定义标记器的方法解决了我的问题,这意味着句子永远不会被打破,避免以后需要合并它。

根据文档中的信息here,当您创建自定义标记生成器时,可以使用token_match参数来匹配永远不会被破坏的模式。像这样,你可以设置:

def custom_en_tokenizer(nlp):
    pattern_re = re.compile('<some regex martching a pattern that is broken>')
    return spacy.tokenizer.Tokenizer(nlp.vocab,
                                     English.Defaults.tokenizer_exceptions,
                                     English.Defaults.prefixes,
                                     English.Defaults.suffixes,
                                     English.Defaults.infixes,
                                     token_match=pattern_re.match)

nlp = spacy.load('en')
nlp.tokenizer = custom_en_tokenizer(nlp)