0

对于希望将数字和符号或单词一起标记的情况,如何向 spacy 添加自定义标记化规则。例如下面的句子:

“我 100% 喜欢苹果。我喜欢 500 克的苹果”

被标记如下:

['I', '100', '%', 'like', 'apples', '.', 'I', 'like', '500', 'g', 'of', 'apples']

如果它像这样被标记化会更好:

['I', '100%', 'like', 'apples', '.', 'I', 'like', '500g', 'of', 'apples']

以下代码用于生成此代码:

import spacy
nlp = spacy.load("en_core_web_sm")
text = "I 100% like apples. I like 500g of apples"
print([token.text for token in nlp(text)])
4

2 回答 2

1

所以通常你可以通过添加特殊规则或其他东西来修改标记器,但在这种特殊情况下,它比这更棘手。spaCy 实际上有很多代码来确保您的示例中的后缀成为单独的标记。所以你要做的就是删除相关规则。

在这个示例代码中,我只是查找包含 '%' 的规则集并将其删除;碰巧该规则还包含诸如“g”之类的单位后缀。所以这就是你想要的:

import spacy

nlp = spacy.blank("en")
text = "I 100% like apples. I like 500g of apples"

# remove the entry with units and %
suffixes = [ss for ss in nlp.Defaults.suffixes if '%' not in ss]
suffix_regex = spacy.util.compile_suffix_regex(suffixes)
nlp.tokenizer.suffix_search = suffix_regex.search

print(list(nlp(text)))

您可以在此处查看规则定义列表。

于 2021-04-20T10:49:31.170 回答
0

我理解你的意思是举一个简单的例子,但这里有几件事值得关注。

  • 通常,首先删除停用词和标点符号,特别是在主题建模中,它们占用了相当多的处理能力,但增加的很少。
  • 如果您通读文档,您会发现词性分析是一个相当重要的功能。虽然您可能不打算使用它,但您应该明白,您在这里违背了规律,因为您希望将事物结合起来(例如,QUANTMOD 或量词短语修饰符与 NUM 或它修改的数字),而不是从术语中梳理出概念(SpaCy 示例是 'Gimme' --> 'gim'(或给予)和 'me')

但是,如果您真的一心想要走这条路,SpaCy 文档将助您一臂之力。

于 2021-04-19T02:43:48.043 回答