|
|
@@ -76,38 +76,26 @@ class OllamaService:
|
|
|
types = entity_types or settings.entity_types
|
|
|
types_desc = ", ".join(types)
|
|
|
|
|
|
- prompt = f"""你是一个专业的命名实体识别(NER)系统。请从以下文本中提取实体。
|
|
|
+ prompt = f"""/no_think
|
|
|
+你是一个专业的命名实体识别(NER)系统。请从以下文本中提取实体,直接输出JSON,不要解释。
|
|
|
|
|
|
-## 任务要求
|
|
|
-1. 识别以下类型的实体: {types_desc}
|
|
|
-2. 每个实体需要包含: 名称(name)、类型(type)、在文本中的起始位置(charStart)和结束位置(charEnd)
|
|
|
-3. 只提取明确的、有意义的实体,避免提取过于泛化的词汇
|
|
|
-4. 严格按照 JSON 格式输出
|
|
|
+## 实体类型: {types_desc}
|
|
|
+- PERSON: 人名
|
|
|
+- ORG: 机构/公司
|
|
|
+- LOC: 地点
|
|
|
+- DATE: 日期
|
|
|
+- NUMBER: 数值(带单位)
|
|
|
+- DEVICE: 设备仪器
|
|
|
+- PROJECT: 项目/工程
|
|
|
+- METHOD: 方法/标准
|
|
|
|
|
|
-## 实体类型说明
|
|
|
-- PERSON: 人名(如:张三、李经理)
|
|
|
-- ORG: 机构/组织/公司(如:成都检测公司、环保局)
|
|
|
-- LOC: 地点/地址(如:成都市、高新区)
|
|
|
-- DATE: 日期时间(如:2024年5月15日、2024-05-15)
|
|
|
-- NUMBER: 带单位的数值(如:50分贝、100万元)
|
|
|
-- DEVICE: 设备仪器(如:噪音检测仪、分析仪器)
|
|
|
-- PROJECT: 项目/工程(如:环境监测项目、XX工程)
|
|
|
-- METHOD: 方法/标准(如:GB/T 12345、检测方法)
|
|
|
+## 输出格式(严格JSON,不要其他内容):
|
|
|
+{{"entities": [{{"name": "实体名", "type": "类型", "charStart": 0, "charEnd": 0}}]}}
|
|
|
|
|
|
-## 输出格式
|
|
|
-请严格按以下 JSON 格式输出,不要包含其他内容:
|
|
|
-```json
|
|
|
-{{
|
|
|
- "entities": [
|
|
|
- {{"name": "实体名称", "type": "实体类型", "charStart": 起始位置, "charEnd": 结束位置}}
|
|
|
- ]
|
|
|
-}}
|
|
|
-```
|
|
|
-
|
|
|
-## 待处理文本
|
|
|
+## 文本:
|
|
|
{text}
|
|
|
|
|
|
-## 提取结果
|
|
|
+## JSON结果:
|
|
|
"""
|
|
|
return prompt
|
|
|
|
|
|
@@ -150,6 +138,9 @@ class OllamaService:
|
|
|
entities = []
|
|
|
|
|
|
try:
|
|
|
+ # Qwen3 可能有 thinking 模式,需要移除 <think>...</think> 部分
|
|
|
+ response = re.sub(r'<think>[\s\S]*?</think>', '', response)
|
|
|
+
|
|
|
# 尝试提取 JSON 部分
|
|
|
json_match = re.search(r'\{[\s\S]*\}', response)
|
|
|
if not json_match:
|