spacy 自定义分词器不对单词进行分组

spacy custom tokenizer doesn't group words

我正在尝试使用 spacy 将三个不同的标记合并为一个标记。

例如,通过下面的代码将两个不同的标记“bell”“peper”变成一个标记“bell pepper”。(不过我不认为我的代码是正确的方法)

text='extra-virgin olive oil bell pepper Parmesan Cheese onion red bell pepper carrots cloves, beans fennel bulb parsnips vegetable broth broccoli florets macaroni Parmesan cheese'


import spacy
nlp = spacy.load('en_core_web_sm')
nlp.tokenizer.add_special_case('connection',
    [
        {   'pos': 'NOUN',
            'F': '-',
            'F': 'oil'},
        {
            'F':'bell',
            'F':'pepper'
        },
        {
            'F':'olive',
            'F':'oil'
        },
        {
            'F':'Parmesan',
            'F':'Cheese'
        }
    ])

doc= nlp(text)

doc[0]

extra

如何实现?

谢谢

看来您想要做的是将一些短语(例如“olive oil”或“bell pepper”)合并为单个标记。这通常不是您对分词器异常所做的事情——它们通常对拆分单词或处理特殊标点符号更有用。例如,您可能希望将“gimme”标记为“gim me”(以便识别“me”)或将“2km”和“2 km”都作为两个标记。

在这种情况下,我会列出所有要组成单个标记的短语,并使用 EntityRuler 为它们分配实体标签。这假设您有一个要合并的列表。

如果您没有想要变成短语的列表,鉴于您的示例文本,这将很难做到,因为在您进行的合并背后没有像词性模式这样的一般原则. spaCy 模型是在自然语言文本上训练的,而你似乎只有一个未标点符号的成分列表,所以词性标注器并不总是能很好地工作。例如,考虑这些句子:

I went to the store and bought olive oil bell peppers and cake mix.

这没有正确标点符号,但它显然是一个列表。如果标点符号正确,spaCy 的 noun_chunks 会给你想要的东西。

问题是这也是一个有效的句子:

I made olive oil bell pepper pasta for dinner.

这有点尴尬,但标点符号正确,在这种情况下,“olive oil bell pepper”是“pasta”的修饰语,而不是单独项目的列表,因此它应该是一个名词块。