如何让spaCy为文本列表中未识别实体添加UNKNOWN标签?
为文本列表所有元素匹配实体标签(未识别标记为UNKNOWN)
需求与问题
需要实现一个函数,接收文本列表后返回每个元素对应的文本与实体标签:
- 被spaCy识别的实体返回对应标签
- 未被识别的实体标记为
UNKNOWN
当前代码仅返回spaCy识别出的实体,无法覆盖所有输入元素;尝试通过doc.sents处理拼接后的文本,但添加的句号导致标签匹配失效。
当前代码
def get_label(text: list): doc = nlp('. '.join(text) + '.') keywords = [] for ent in doc.ents: keywords.append((ent.text, ent.label_)) return keywords
输入示例
['Kaggle', 'Google', 'San Francisco', 'this week', 'as early as tomorrow', 'Kag-ingle', 'about half a million', 'Ben Hamner', '2010', 'Earlier this month', 'YouTube', 'Google Cloud Platform', 'Crunchbase', '$12.5 to $13 million', 'Index Ventures', 'SV Angel', 'Hal Varian', 'Khosla Ventures', 'Yuri Milner']
解决方案
核心思路是逐个处理输入列表中的每个文本元素,避免拼接文本带来的匹配干扰,确保每个输入项的标签判断独立准确。
修改后的代码
import spacy # 提前加载spaCy模型,避免重复加载 nlp = spacy.load("en_core_web_sm") def get_label(text_list: list): result = [] for item in text_list: doc = nlp(item) # 验证实体文本与输入元素完全匹配,避免部分匹配的误判 if doc.ents and doc.ents[0].text.strip() == item.strip(): result.append((item, doc.ents[0].label_)) else: result.append((item, "UNKNOWN")) return result
代码说明
- 遍历输入列表的每个元素,单独用spaCy处理生成文档对象
- 检查文档是否包含实体,且实体文本与输入元素完全一致(去除首尾空白避免格式干扰)
- 匹配成功则返回实体标签,否则标记为
UNKNOWN
输出示例(部分)
[ ('Kaggle', 'ORG'), ('Google', 'ORG'), ('San Francisco', 'GPE'), ('this week', 'UNKNOWN'), ('as early as tomorrow', 'UNKNOWN'), ('Kag-ingle', 'UNKNOWN'), ('Ben Hamner', 'PERSON'), ('2010', 'DATE'), ... ]
内容的提问来源于stack exchange,提问作者Jared
相关产品推荐
相关产品推荐

