【问题标题】:Add rules to Spacy lemmatization向 Spacy 词形还原添加规则
【发布时间】:2021-02-03 16:04:07
【问题描述】:

我正在使用 Spacy 词形还原来预处理文本。

doc = 'ups'
for i in nlp(doc):
print(i.lemma_)
>> up

我明白为什么 spacy 会删除“s”,但对我来说很重要的是,在这种情况下,它不会这样做。有没有办法向 spacy 添加特定规则,或者我必须在进程之外使用 If 语句(这是我不想做的事情)

【问题讨论】:

  • 您可以自定义查找和规则的内部表格,但详细信息取决于nlp 的配置方式。加载了哪种模型/语言,管道是否包含标记器?
  • 管道仅用于词形还原。我使用: nlp.pipe(sentence.split(),disable=["parser","ner"]) 。将每个单词作为上下文中的“孤独”单词运行。知道如何更改流程以仅针对这些情况包含词形还原规则而不丢失所有其他情况吗?
  • 什么是nlp
  • en_core_web_sm 模型

标签: nlp spacy


【解决方案1】:

在 Spacy 3 中,接受的解决方案会引发错误:

KeyError: "[E159] Can't find table 'lemma_exc' in lookups. Available tables: ['lexeme_norm']"

由于lemmatizer 现在是专用的 Spacy 组件,因此必须直接在组件上修改查找(这至少对我有用)

nlp.get_pipe('lemmatizer').lookups.get_table("lemma_exc")["noun"]["data"] = ["data"]

希望这对某人有帮助!

【讨论】:

    【解决方案2】:

    根据您是否有标注器,您可以自定义基于规则的词形还原异常或查找表:

    import spacy
    
    # original
    nlp = spacy.load("en_core_web_sm", disable=["parser", "ner"])
    # may be "up" or "ups" depending on exact version of spacy/model because it
    # depends on the POS tag
    assert nlp("ups")[0].lemma_ in ("ups", "up")
    
    # 1. Exception for rule-based lemmatizer (with tagger)
    
    # reload to start with a clean lemma cache
    nlp = spacy.load("en_core_web_sm", disable=["parser", "ner"])
    # add an exception for "ups" as with POS NOUN or VERB
    nlp.vocab.lookups.get_table("lemma_exc")["noun"]["ups"] = ["ups"]
    nlp.vocab.lookups.get_table("lemma_exc")["verb"]["ups"] = ["ups"]
    assert nlp("ups")[0].lemma_ == "ups"
    
    # 2. New entry for lookup lemmatizer (without tagger)
    
    nlp = spacy.load("en_core_web_sm", disable=["tagger", "parser", "ner"])
    nlp.vocab.lookups.get_table("lemma_lookup")["ups"] = "ups"
    assert nlp("ups")[0].lemma_ == "ups"
    

    如果您单独处理单词,则标注器不会非常可靠(您可能会得到 NOUNPROPNVERB 类似 ups),因此它可能更容易处理自定义查找词形还原器。基于规则的引理的质量总体上更好,但您至少需要完整的短语,最好是完整的句子,才能获得合理的结果。

    【讨论】:

    • 与仅添加 'if value == 'ups' : lemma = 'ups' " 有什么区别?有没有办法直接更改表/模型,然后将其与更改一起保存?我不希望我的代码库在每次使用 nlp = spacy.load(..) 时都充满特定单词的规则
    • 如果您使用nlp.to_disk() 保存修改后的模型,那么您可以重新加载该自定义模型而无需再次进行更改。您可以使用spacy package 将保存的目录打包成一个可以使用pip 安装的包,如您喜欢的en_core_web_sm,但您也可以只从保存的目录路径加载。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-27
    相关资源
    最近更新 更多