如何使用 python 使用 spaCy 正确识别令牌的实体类型?

问题描述 投票:0回答:1

我使用 spaCy 从文本描述中提取和识别实体类型(如 ORG、GPE、DATE 等)。但是,我注意到一些不正确的结果,并且我不确定如何解决这个问题。

这是我正在使用的代码:

import spacy

nlp = spacy.load("en_core_web_sm")

def getPayeeName(description):
    description = description.replace("-", " ").replace("/", " ").strip()
    doc = nlp(description)

    for token in doc:
        print(f"Token: {token.text}, Entity: {token.ent_type_ if token.ent_type_ else 'None'}")

# Example input
description = "UPI DR 400874707203 BENGALORE 08 JAN 2024 14:38:56 MEDICAL LTD HDFC 50200"
getPayeeName(description)

代币:UPI,实体:ORG

代币:DR,实体:ORG

代币:400874707203,实体:无

代币:BENGALORE,实体:无

令牌:08,实体:DATE

代币:JAN,实体:DATE

代币:2024,实体:DATE

令牌:14:38:56,实体:无

代币:医疗,实体:ORG

代币:LTD,实体:ORG

代币:HDFC,实体:ORG

代币:50200,实体:ORG

  • 50200 被识别为 ORG,但它只是一个数字。

  • BENGALORE 是一座城市,但它不被识别为 GPE 或位置 (返回无)。

  • UPI 和 DR 是首字母缩略词/缩写词,但它们是不正确的 识别为 ORG。

我希望实体识别更加准确可靠。 我该如何解决这些问题?我是否应该使用其他 spaCy 配置、自定义规则或预训练模型来改进实体识别?

注意:我也尝试过ChatGPT,但这个问题仍然没有解决。

python machine-learning nlp spacy
1个回答
0
投票

如果您已尝试使用 GPT 来完成相同的任务,但仍然面临相同的问题。那么其他预训练模型就不起作用了。因为现在的 GPT 远远优于其他预训练模型。

大多数基于 Bert 的 NER 模型都没有针对印度数据集进行微调。这就是您看到不正确结果的原因。

第二个原因是上下文不足。您提供的示例没有足够的上下文。即使是人类也无法说出你的例子是关于什么的。如果您尝试使示例有意义,那么将修改后的示例传递给已使用的模型将给出更好的结果。拥有正确的上下文是先决条件,因为大多数深度学习模型都是根据上下文词进行预测的。


我添加了一个可能对您有用的代码,因为它在印度数据集上进行了微调。

代码:

import torch from transformers import AutoTokenizer, AutoModelForTokenClassification, pipeline # Checking if GPU is available device = 0 if torch.cuda.is_available() else -1 # GPU: 0, CPU: -1 # Load pre-trained tokenizer and model tokenizer = AutoTokenizer.from_pretrained("Venkatesh4342/NER-Indian-xlm-roberta") model = AutoModelForTokenClassification.from_pretrained("Venkatesh4342/NER-Indian-xlm-roberta") # Initiating NER Model ner_pipeline = pipeline("ner", model=model, tokenizer=tokenizer, device=device) # Example data input_text = "UPI DR 400874707203 BENGALORE 08 JAN 2024 14:38:56 MEDICAL LTD HDFC 50200" # Calling NER Model results = ner_pipeline(input_text) # Display the output for entity in results: print(f"Entity: {entity['word']}, Label: {entity['entity']}, Confidence: {entity['score']:.2f}")

最终输出:

Entity: ▁U, Label: organization, Confidence: 0.99 Entity: PI, Label: organization, Confidence: 0.99 Entity: ▁DR, Label: organization, Confidence: 0.99 Entity: ▁BEN, Label: location, Confidence: 0.76 Entity: GAL, Label: location, Confidence: 0.83 Entity: ORE, Label: location, Confidence: 0.79 Entity: ▁MEDI, Label: organization, Confidence: 1.00 Entity: CAL, Label: organization, Confidence: 0.99 Entity: ▁LTD, Label: organization, Confidence: 1.00 Entity: ▁HD, Label: organization, Confidence: 0.99 Entity: FC, Label: organization, Confidence: 0.98

最终输出稍好一些,经过后处理逻辑后,您也可以将损坏的单词组合在一起。

最后一点:我建议根据您的数据微调基于 NER 的模型。并尝试有有意义的背景

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.