本文目录导读:
我可以帮你了解如何使用spaCy库抽取文档中的关键实体,以下是一个完整的示例:
基础安装和配置
# 首先安装spaCy和语言模型 # pip install spacy # python -m spacy download zh_core_web_sm # 中文模型 # python -m spacy download en_core_web_sm # 英文模型 import spacy from spacy import displacy from collections import Counter
基础实体抽取
def extract_basic_entities(text, language='zh'):
"""
基础实体抽取函数
"""
# 加载对应语言模型
if language == 'zh':
nlp = spacy.load('zh_core_web_sm')
else:
nlp = spacy.load('en_core_web_sm')
# 处理文本
doc = nlp(text)
# 提取实体
entities = []
for ent in doc.ents:
entities.append({
'text': ent.text,
'label': ent.label_,
'start': ent.start_char,
'end': ent.end_char
})
return entities, doc
# 示例文本
chinese_text = """
苹果公司今天在北京召开新品发布会,CEO蒂姆·库克介绍了新款iPhone。
这款产品将于12月15日在京东商城开售,售价8999元。
"""
# 提取实体
entities, doc = extract_basic_entities(chinese_text)
for ent in entities:
print(f"实体: {ent['text']}, 类型: {ent['label']}, 位置: {ent['start']}-{ent['end']}")
高级实体抽取功能
class AdvancedEntityExtractor:
def __init__(self, language='zh'):
self.language = language
self.nlp = spacy.load(f'{language}_core_web_sm')
def extract_entities_with_confidence(self, text):
"""提取实体并计算置信度"""
doc = self.nlp(text)
entities = []
for ent in doc.ents:
# 基于实体长度和类型计算简单置信度
confidence = self._calculate_confidence(ent)
entities.append({
'text': ent.text,
'label': ent.label_,
'confidence': confidence,
'description': spacy.explain(ent.label_)
})
return sorted(entities, key=lambda x: x['confidence'], reverse=True)
def _calculate_confidence(self, ent):
"""计算实体置信度"""
score = 0.5 # 基础分
# 实体长度加分(一般较长的实体更可靠)
if len(ent.text) >= 4:
score += 0.2
# 特定类型加分
high_confidence_labels = ['PERSON', 'ORG', 'GPE', 'DATE', 'MONEY']
if ent.label_ in high_confidence_labels:
score += 0.3
return min(score, 1.0)
def extract_entity_summary(self, text):
"""提取实体摘要统计"""
doc = self.nlp(text)
# 统计实体类型分布
entity_types = Counter([ent.label_ for ent in doc.ents])
# 统计高频实体
entity_texts = Counter([ent.text for ent in doc.ents])
return {
'total_entities': len(doc.ents),
'entity_types': dict(entity_types.most_common()),
'frequent_entities': dict(entity_texts.most_common(10))
}
# 使用示例
extractor = AdvancedEntityExtractor()
text = """
2023年11月,特斯拉公司在上海超级工厂宣布,其新款Model Y将在中国市场上市,
售价从26.39万元起,马斯克表示,这款电动车将配备最新的自动驾驶系统。
"""
# 提取带置信度的实体
entities = extractor.extract_entities_with_confidence(text)
for ent in entities:
print(f"实体: {ent['text']} [{ent['label']}] - 置信度: {ent['confidence']:.2f}")
# 获取实体摘要
summary = extractor.extract_entity_summary(text)
print(f"\n实体统计:")
print(f"总实体数: {summary['total_entities']}")
print(f"实体类型分布: {summary['entity_types']}")
print(f"高频实体: {summary['frequent_entities']}")
可视化实体
def visualize_entities(text, language='zh'):
"""可视化文本中的实体"""
nlp = spacy.load(f'{language}_core_web_sm')
doc = nlp(text)
# 方法1:使用displaCy在Jupyter中展示
displacy.render(doc, style='ent', jupyter=True)
# 方法2:生成HTML
html = displacy.render(doc, style='ent', page=True)
with open('entity_visualization.html', 'w', encoding='utf-8') as f:
f.write(html)
return html
# 示例
text = "华为技术有限公司在深圳发布了最新的Mate 60 Pro智能手机,售价6999元。"
visualize_entities(text)
批量处理文档
def batch_extract_entities(documents, language='zh'):
"""批量处理多个文档"""
nlp = spacy.load(f'{language}_core_web_sm')
results = []
for i, doc_text in enumerate(documents):
doc = nlp(doc_text)
entities = []
for ent in doc.ents:
entities.append({
'doc_id': i + 1,
'text': ent.text,
'label': ent.label_
})
results.append({
'doc_id': i + 1,
'entity_count': len(entities),
'entities': entities
})
return results
# 批量处理示例
documents = [
"百度公司的总部在北京,李彦宏是创始人。",
"阿里巴巴在杭州成立了达摩院,投资1000亿元用于科技研发。",
"腾讯游戏在2023年推出了多款热门手游。"
]
batch_results = batch_extract_entities(documents)
for result in batch_results:
print(f"\n文档 {result['doc_id']} (共{result['entity_count']}个实体):")
for ent in result['entities'][:3]: # 只显示前3个
print(f" - {ent['text']} ({ent['label']})")
主要特点
- 多语言支持:支持中文、英文等多种语言
- 实体类型丰富:可识别人名、组织、地点、日期、金额等
- 位置信息:提供实体在原文中的起止位置
- 置信度评估:可计算实体的可信度
- 可视化展示:支持在网页或Jupyter中可视化实体
- 批量处理:适合处理大量文档
使用spaCy进行实体抽取的优势在于其速度快、准确性高,且易于集成到各种应用中。