【问题标题】:Adding a condition in the standard SpaCy tokenizer在标准 SpaCy 标记器中添加条件
【发布时间】:2021-09-29 21:01:04
【问题描述】:

我想保留 SpaCy 通常使用的分词器,但添加一个条件。

SpaCy 通常将一个点(“.”)与单词分开,并将其作为标记。我想保留它,除非我有缩写:“et al.”,在这种情况下,我想作为标记返回:['et','al.'],而不将点视为另一个标记, 就在这种情况下。

我一直在查看信息,在我看来,解决方案与下面的脚本有关,但是,我不知道我可以在哪里放置这个条件。

import spacy
from spacy.lang.char_classes import ALPHA_LOWER, ALPHA_UPPER, PUNCT
from spacy.lang.char_classes import LIST_PUNCT, LIST_ELLIPSES, LIST_QUOTES, LIST_ICONS
from spacy.lang.char_classes import CURRENCY, UNITS, ALPHA_LOWER, CONCAT_QUOTES, PUNCT, ALPHA_UPPER
from spacy.util import compile_suffix_regex

# Default tokenizer
nlp = spacy.load("pt_core_news_sm")
doc = nlp("Esse é um exemplo. Ramon et al., kcal.")
print([t.text for t in doc]) # ['Esse', 'é', 'um', 'exemplo', '.', 'Ramon', 'et', 'al', '.', ',', 'kcal', '.']

# Modify tokenizer suffix patterns

suffixes = (
LIST_PUNCT
+ LIST_ELLIPSES
+ LIST_QUOTES
+ LIST_ICONS
+ ["'s", "'S", "’s", "’S", "—", "–"]
+ [
    r"(?<=[0-9])\+",
    r"(?<=°[FfCcKk])\.",
    r"(?<=[0-9])(?:{c})".format(c=CURRENCY),
    r"(?<=[0-9])(?:{u})".format(u=UNITS),
    r"(?<=[0-9{al}{e}{p}(?:{q})])\.".format(
        al=ALPHA_LOWER, e=r"%²\-\+", q=CONCAT_QUOTES, p=PUNCT
    ),
    r"(?<=[{au}][{au}])\.".format(au=ALPHA_UPPER),
]
)

suffix_regex = compile_suffix_regex(suffixes)
nlp.tokenizer.suffix_search = suffix_regex.search
doc = nlp("Esse é um exemplo. Ramon et al., kcal.")
print([t.text for t in doc]) # Expected -> ['Esse', 'é', 'um', 'exemplo', '.', 'Ramon', 'et', 'al.', ',', 'kcal', '.']

【问题讨论】:

标签: python nlp tokenize spacy-3


【解决方案1】:

对于这种情况,我认为最简单的方法是将special case 添加到标记器。好处是您不必重新创建和重新编译所有这些标记器正则表达式,只需按如下方式添加这个实例:

import spacy
from spacy.symbols import ORTH

nlp = spacy.load("en_core_web_sm")

nlp.tokenizer.add_special_case("al.", [{ORTH: "al."}])

# Check new tokenization
print([w.text for w in nlp("et al.")])  # ['et', 'al.']

最好回顾一下标记器是如何工作的,以了解它会做什么。标记器首先处理特殊情况,因此每当它看到这个子字符串时,它都会在任何其他规则之前以这种方式标记它。这意味着此解决方案可能包含一些 误报 标记化,其中除了“et”之外,al. 之前还有另一个标记,并且您不想合并句点。对于更精确的解决方案,您可以编写一个小组件,在事物被标记化后合并 al. 标记 - spaCy 的 merge_noun_chunks (source) 就是一个很好的例子。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-07
    • 2019-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多