我使用 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,但这个问题仍然没有解决。
如果您已尝试使用 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 的模型。并尝试有有意义的背景