- 第一种模式:只给结构不给领域引导
- 模式特点:这种模式主要侧重于利用文本的通用结构特征来构建知识图谱,而不依赖于特定领域的先验知识。通常会利用语言的语法、语义结构以及一些通用的文本模式来识别实体和关系。例如,通过词性标注、命名实体识别等自然语言处理技术来抽取文本中的名词(可能是实体)和动词(可能是关系)。
- 应用场景和优势:在处理跨领域的文本集合或者对领域知识不太明确的文本时比较有用。比如,对于一些通用的新闻报道或者社交媒体文本,这种模式可以快速地构建一个初步的知识图谱,挖掘出文本中人物、组织、事件等实体之间的简单关联,如“某人做了某事”“某组织与另一组织有合作关系”等。它的优势在于通用性强,不需要对特定领域有深入的了解就能开始知识图谱的构建。
- 技术实现示例:可以使用一些开源的自然语言处理工具包,如NLTK(Natural Language Toolkit)。首先对文本进行句子分割、词法分析,然后通过命名实体识别(NER)来标记出人名、地名、组织名等实体。例如,对于句子“苹果公司发布了新款iPhone”,可以识别出“苹果公司”是一个组织实体,“发布”是一个关系,“新款iPhone”是一个产品实体。接着,根据这些识别结果构建简单的知识图谱,将实体作为节点,关系作为边。
- 第二种模式:给结构给领域引导
- 模式特点:除了利用文本的结构信息外,还引入了特定领域的引导信息。这种引导可以是领域的本体(ontology)、概念模型或者领域术语表等。例如,在医学领域,会有医学本体来定义疾病、症状、治疗方法等概念之间的关系,在构建知识图谱时,就可以根据这些预先定义好的领域知识来引导抽取过程。
- 应用场景和优势:适用于有明确领域需求的情况,能够构建出更符合领域专业知识的知识图谱。以生物医学研究论文为例,通过提供医学领域的结构引导,可以更准确地抽取基因、蛋白质、疾病之间的复杂关系,如基因与疾病的因果关系、蛋白质之间的相互作用等。这种模式的优势在于能够提高知识图谱的准确性和专业性,更好地服务于特定领域的知识挖掘和应用。
- 技术实现示例:以构建法律领域知识图谱为例。首先,获取法律领域的本体,定义了法律主体、法律行为、法律责任等概念之间的关系。在处理法律文本时,结合自然语言处理技术和领域本体。例如,对于法律条文“法人应当对其法定代表人的职务行为承担民事责任”,利用自然语言处理技术识别出“法人”“法定代表人”“职务行为”“民事责任”等法律术语,然后根据法律领域本体中规定的关系,如“承担责任”关系,构建知识图谱,将这些术语作为节点,正确地连接起来。
- 第三种模式:给结构、给领域引导、给领域few - shot样本
- 模式特点:在第二种模式的基础上,进一步提供了领域内的少量样本(few - shot samples)作为示例。这些样本可以帮助模型更好地理解领域知识的具体应用方式和复杂的语义关系。例如,在金融领域,除了提供金融领域的本体和结构引导外,还给出一些关于金融产品推荐、风险评估等方面的具体文本样本,展示如何在实际文本中抽取知识。
- 应用场景和优势:特别适用于领域知识复杂且难以通过简单的结构和引导完全描述的情况。对于新兴的领域或者具有复杂业务逻辑的领域,这种模式可以让知识图谱的构建更加精准。以人工智能领域的技术报告抽取知识图谱为例,通过提供少量的技术报告样本,展示如何抽取模型架构、性能评估指标、应用场景等知识,结合领域本体和文本结构信息,能够更有效地构建出符合人工智能领域实际应用需求的知识图谱。这种模式的优势在于可以利用样本的具体实例来补充和细化领域知识,提高模型对复杂领域知识的抽取能力。
- 技术实现示例:假设构建一个电商领域知识图谱。首先,提供电商领域的本体,包括商品、消费者、商家、订单等概念及其关系。同时,给出一些电商产品评论和商品详情页的样本文本。例如,在产品评论样本“这款手机的摄像头像素很高,拍照效果非常好,但是电池续航一般”中,结合本体知识和文本结构,识别出“手机”是商品实体,“摄像头像素高”“拍照效果好”“电池续航一般”是商品属性关系。然后,利用这些样本中的抽取方式来处理其他电商文本,构建知识图谱,将商品属性等知识准确地融入其中。
第一种模式实现
import json
import os.path
import pandas as pd
import re
from openai import OpenAI
# 配置OpenAI客户端
client = OpenAI(
api_key="sk-",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
# 读取数据
NavigationAdvisory = json.loads(
pd.read_excel("../data/南海战略态势感知计划.xlsx").to_json(orient="records", force_ascii=False)
)
# 初始化列表
datapath = "./基于qwen-turbo-2024-11-01非关系限制非场景引导型军事知识图谱抽取2024年11月28日.xlsx"
if os.path.exists(datapath):
b = json.loads(
pd.read_excel("./基于qwen-turbo-2024-11-01非关系限制非场景引导型军事知识图谱抽取2024年11月28日.xlsx").to_json(orient="records", force_ascii=False)
)
history = json.loads(
pd.read_excel("./基于qwen-turbo-2024-11-01非关系限制非场景引导型军事知识图谱抽取2024年11月28日.xlsx").to_json(orient="records", force_ascii=False)
)
print(history[:3])
if not os.path.exists(datapath):
b = []
history = []
# 使用集合来跟踪已处理的输入,以去除重复
processed_inputs = set()
for his_one in history:
processed_inputs.add(his_one['input'])
# 处理数据
for advisory in NavigationAdvisory:
try:
advisory['字段1'].split("\n")
except:
continue
for i in advisory['字段1'].split("\n"):
if len(i) > 128 and i not in processed_inputs:
prompt_message = """
如果内容中没有可以抽取的知识图谱数据,直接返回跳过。
返回的实体必须在原文中出现过,不要返回没出现过的实体。
**输出内容**
按以下知识图谱结构提取并输出数据:
```yaml
knowledge_graph:
entities:
- name: "<实体名称>"
type: "<实体类型>"
attributes:
- {name: "<属性名称>", value: "<属性值>"}
relationships:
- {from: "<实体1名称>", to: "<实体2名称>", relationship: "<关系描述>"}
**基于以上要求及以下内容构建军事知识图谱
""" + i
try:
completion = client.chat.completions.create(
model="qwen-max-latest",
messages=[{
"role": "user", "content": prompt_message}]
)
resp_body_result = json.loads(completion.model_dump_json())["choices"][0]["message"]['content']
with open("基于qwen-turbo-2024-11-01非关系限制非场景引导型军事知识图谱抽取.md", "a", encoding='utf-8') as f:
f.write(i + "\n")
f.write(resp_body_result + "\n")
b.append({
"input": i, "output": resp_body_result, "prompt": str(prompt_message)})
processed_inputs.add(i) # 添加到已处理输入集合中
except Exception as e:
print(f"An error occurred: {e}")
continue
try:
pd.DataFrame(b).to_excel(
"基于qwen-turbo-2024-11-01非关系限制非场景引导型军事知识图谱抽取2024年11月28日.xlsx", index=False
)
except Exception as e:
print(f"An error occurred while saving Excel: {e}")
b.pop()
第二种模式实现
import json
import pandas as pd
from openai import OpenAI
# 配置OpenAI客户端
client = OpenAI(
api_key="sk-",
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
# 读取数据
NavigationAdvisory = json.loads(
pd.read_excel("../data/南海战略态势感知计划.xlsx").to_json(orient="records", force_ascii=False)
)
# 初始化列表
b = json.loads(
pd.read_excel("./基于qwen-turbo-2024-11-01非关系限制型军事知识图谱抽取2024年11月28日.xlsx").to_json(orient="records", force_ascii=False)
)
history = json.loads(
pd.read_excel("./基于qwen-turbo-2024-11-01非关系限制型军事知识图谱抽取2024年11月28日.xlsx").to_json(orient="records", force_ascii=False)
)
print(history[:3])
# 使用集合来跟踪已处理的输入,以去除重复
processed_inputs = set()
for his_one in history:
processed_inputs.add(his_one['input'])
# 处理数据
for advisory in NavigationAdvisory:
try:
advisory['字段1'].split("\n")
except:
continue
for i in advisory['字段1'].split("\n"):
if len(i) > 128 and i not in processed_inputs:
prompt_message = """1. **输入内容**
提供与军事领域相关的文本数据,包含但不限于以下内容:
- 军事单位基本信息(单位名称、隶属关系、人员规模等)
- 作战能力指标(武器装备、作战行动、战术战略)
- 后勤保障指标(物资供应、运输保障、设施建设)
- 军事合作与国际关系(军事同盟、合作项目、国际演习)
- 安全防护与风险管理(情报分析、防御措施、危机应对)
如果内容中没有可以抽取的知识图谱数据,直接返回跳过。
返回的实体必须在原文中出现过,不要返回没出现过的实体。
2. **输出内容**
按以下知识图谱结构提取并输出数据:
```yaml
knowledge_graph:
entities:
- name: "<实体名称>"
type: "<实体类型>" # 如 "军事单位", "作战能力", "后勤保障", "军事合作"
attributes:
- {name: "<属性名称>", value: "<属性值>"} # 如 "单位名称", "兵力", "战略", "合作项目"
relationships:
- {from: "<实体1名称>", to: "<实体2名称>", relationship: "<关系描述>"}
**基于以上要求及以下内容构建军事知识图谱
""" + i
try:
completion = client.chat.completions.create(
model="qwen-max-latest",
messages=[{
"role": "user", "content": prompt_message}]
)
resp_body_result = json.loads(completion.model_dump_json())["choices"][0]["message"]['content']
with open("基于qwen-turbo-2024-11-01非关系限制型军事知识图谱抽取.md", "a", encoding='utf-8') as f:
f.write(i + "\n")
f.write(resp_body_result + "\n")
b.append({
"input": i, "output": resp_body_result, "prompt": str(prompt_message)})
processed_inputs.add(i) # 添加到已处理输入集合中
except Exception as e:
print(f"An error occurred: {e}")
continue
try:
pd.DataFrame(b).to_excel(
"基于qwen-turbo-2024-11-01非关系限制型军事知识图谱抽取2024年11月28日.xlsx", index=False
)
except Exception as e:
print(f"An error occurred while saving Excel: {e}")
b.pop()
因为图谱结果是比较长的 所以为了更加聚焦 我们需要基于一些手段寻找差异化
接下来我们使用传统的差异化分析工具 分析 图谱在不同情况下的抽取 差异化
在Python中,进行对象差异化分析通常意味着比较两个或多个对象,并找出它们之间的差异。根据需求的不同,差异化分析可以是对比两个对象的属性值差异,或者是对比嵌套对象的差异等。这里是一个通用的示例,展示如何通过dataclasses
和deepdiff
库来实现对象差异化分析。
1. 使用 dataclasses
和 deepdiff
比较对象的差异
假设我们有两个类 Person
,其中包含了一些属性,并希望比较它们的差异。
安装 deepdiff
首先,需要安装 deepdiff
库。可以通过以下命令安装:
pip install deepdiff
示例代码
from dataclasses import dataclass
from deepdiff import DeepDiff
# 定义数据类
@dataclass
class Person:
name: str
age: int
address: str
# 创建两个对象,模拟差异化
person1 = Person(name="Alice", age=30, address="123 Wonderland")
person2 = Person(name="Alice", age=31, address="456 Wonderland")
# 使用 DeepDiff 对象进行差异化分析
diff = DeepDiff(person1, person2, verbose_level=2)
# 输出差异
print("差异化分析结果:")
print(diff)
输出示例
差异化分析结果:
{'values_changed': {"root['age']": {'new_value': 31, 'old_value': 30}},
'type_changes': {"root['address']": {'new_type': <class 'str'>, 'old_type': <class 'str'>}}}
2. 进一步分析嵌套对象
假设我们有更复杂的结构,其中一个类包含另一个类的对象作为属性。以下是更复杂的差异化分析示例:
示例代码
@dataclass
class Address:
street: str
city: str
@dataclass
class Person:
name: str
age: int
address: Address
# 创建两个对象,模拟差异化
address1 = Address(street="123 Wonderland", city="Dreamland")
address2 = Address(street="456 Wonderland", city="Fantasyland")
person1 = Person(name="Alice", age=30, address=address1)
person2 = Person(name="Alice", age=31, address=address2)
# 使用 DeepDiff 对象进行差异化分析
diff = DeepDiff(person1, person2, verbose_level=2)
# 输出差异
print("差异化分析结果:")
print(diff)
输出示例
差异化分析结果:
{'values_changed': {"root['age']": {'new_value': 31, 'old_value': 30}},
'dictionary_item_added': {"root['address']['city']": 'Fantasyland'},
'dictionary_item_removed': {"root['address']['city']": 'Dreamland'},
'values_changed': {"root['address']['street']": {'new_value': '456 Wonderland', 'old_value': '123 Wonderland'}}}
3. 自定义差异化分析
你还可以通过继承 __eq__
和 __ne__
方法来定义自定义的差异化比较逻辑。例如,如果你不想比较某些字段,可以在 __eq__
中忽略它们:
@dataclass
class Person:
name: str
age: int
address: str
def __eq__(self, other):
if isinstance(other, Person):
return self.name == other.name and self.age == other.age
return False
这种方法通常适用于简单的对象比较,但对于更复杂的数据结构,deepdiff
或 dict
比较等方法会更为强大。
总结
- 使用
deepdiff
库可以轻松比较对象并找出它们的差异。 - 对于嵌套对象,
deepdiff
会递归地对比内部属性。 - 对象的自定义比较方法可以通过修改
__eq__
和__ne__
实现,以支持更灵活的差异化分析。
在Python中,比较两个字典(dict
)的差异可以通过多种方式实现。常见的方式包括使用内建的对比操作符(如==
),或使用第三方库,如 deepdiff
和 dictdiffer
,这些库能够提供更丰富的差异分析和更详细的输出。
1. 使用内建的对比操作符
如果只是想知道两个字典是否完全相等,可以使用简单的==
操作符:
dict1 = {
"name": "Alice", "age": 30, "city": "Wonderland"}
dict2 = {
"name": "Alice", "age": 30, "city": "Wonderland"}
# 简单比较两个字典
print(dict1 == dict2) # True, 如果字典相等
但如果字典不完全相同,==
只会返回 False
,并不会显示具体的差异。
2. 使用 deepdiff
库进行字典差异比较
deepdiff
库提供了非常详细的差异化比较功能,能够递归地比较字典以及字典中的嵌套对象。
安装 deepdiff
库
pip install deepdiff
示例代码
from deepdiff import DeepDiff
dict1 = {
"name": "Alice", "age": 30, "city": "Wonderland"}
dict2 = {
"name": "Alice", "age": 31, "city": "Fantasyland"}
# 使用 DeepDiff 进行比较
diff = DeepDiff(dict1, dict2, verbose_level=2)
# 输出差异
print("差异化分析结果:")
print(diff)
输出示例
差异化分析结果:
{
'values_changed': {
"root['age']": {
'new_value': 31, 'old_value': 30},
"root['city']": {
'new_value': 'Fantasyland', 'old_value': 'Wonderland'}
}
}
deepdiff
会输出详细的差异信息,包括具体的字段变更 (values_changed
)。
3. 使用 dictdiffer
库
另一个常用的库是 dictdiffer
,它也可以用来比较字典之间的差异,并以便于阅读的格式输出差异。
安装 dictdiffer
库
pip install dictdiffer
示例代码
import dictdiffer
dict1 = {
"name": "Alice", "age": 30, "city": "Wonderland"}
dict2 = {
"name": "Alice", "age": 31, "city": "Fantasyland"}
# 比较两个字典
diff = list(dictdiffer.diff(dict1, dict2))
# 输出差异
print("差异化分析结果:")
for item in diff:
print(item)
输出示例
差异化分析结果:
['change', "['age']", 30, 31]
['change', "['city']", 'Wonderland', 'Fantasyland']
4. 手动编写简单差异化比较函数
如果你不想依赖第三方库,也可以手动编写简单的函数,来对比两个字典并找出它们的差异。例如:
def compare_dicts(dict1, dict2):
diff = {
"added": {
}, "removed": {
}, "changed": {
}}
# 检查 dict1 中有但 dict2 中没有的项(removed)
for key in dict1:
if key not in dict2:
diff["removed"][key] = dict1[key]
elif dict1[key] != dict2[key]:
diff["changed"][key] = {
"old": dict1[key], "new": dict2[key]}
# 检查 dict2 中有但 dict1 中没有的项(added)
for key in dict2:
if key not in dict1:
diff["added"][key] = dict2[key]
return diff
dict1 = {
"name": "Alice", "age": 30, "city": "Wonderland"}
dict2 = {
"name": "Alice", "age": 31, "city": "Fantasyland"}
# 调用比较函数
differences = compare_dicts(dict1, dict2)
print(differences)
输出示例
{
'added': {
},
'removed': {
},
'changed': {
'age': {
'old': 30, 'new': 31},
'city': {
'old': 'Wonderland', 'new': 'Fantasyland'}
}
}
总结
- 内建对比操作符 (
==
):适用于简单的字典相等比较。 deepdiff
:适用于复杂的差异化分析,能够递归地比较字典中的嵌套结构,并提供详细的差异信息。dictdiffer
:提供简单明了的字典差异比较,输出结果易于理解。- 自定义函数:如果需求简单,可以手动编写比较逻辑,适用于对差异的输出有更细致要求的场景。
```python
import json
import re
import yaml
def compare_dicts(dict1, dict2):
diff = {"added": {}, "removed": {}, "changed": {}}
# 检查 dict1 中有但 dict2 中没有的项(removed)
for key in dict1:
if key not in dict2:
diff["removed"][key] = dict1[key]
elif dict1[key] != dict2[key]:
diff["changed"][key] = {"old": dict1[key], "new": dict2[key]}
# 检查 dict2 中有但 dict1 中没有的项(added)
for key in dict2:
if key not in dict1:
diff["added"][key] = dict2[key]
return diff
import pandas as pd
a = json.loads(
pd.read_excel("./基于qwen-turbo-2024-11-01非关系限制型军事知识图谱抽取2024年11月28日.xlsx").to_json(orient="records", force_ascii=False)
)
b = json.loads(
pd.read_excel("./基于qwen-turbo-2024-11-01非关系限制非场景引导型军事知识图谱抽取2024年11月28日.xlsx").to_json(orient="records", force_ascii=False)
)
def get_yaml_content(text):
# 定义匹配yaml标记之间内容的正则表达式模式
pattern = r"```yaml(.*?)```"
result = re.findall(pattern, text, re.DOTALL)
if result:
return result[0].strip()
return ""
for i in range(100):
data_a = yaml.safe_load(get_yaml_content(a[i]['output']))
data_b = yaml.safe_load(get_yaml_content(b[i]['output']))
# 调用比较函数
try:
differences = compare_dicts(data_a, data_b)
except:
continue
if differences:
print(a[i]['input'])
print(differences)
差异化结果展现
```bash
事情的起因是2012年4月在南海发生的一个事件。那一年的4月11日,中国的报纸和网络媒体以头条的方式,报道了中国渔民在黄岩岛潟湖内受到菲律宾海军侮辱的新闻。4月10日,12艘中国渔船在黄岩岛潟湖内正常作业时,菲律宾的“德尔皮拉尔”号的汉密尔顿级巡逻舰突然出现,对中国渔民进行堵截和干扰。新闻照片显示,中国渔民被扒去上衣在菲方舰只的甲板上曝晒,头上顶着菲律宾海军的枪口。这些照片瞬间在中国社会产生爆炸性效果,引发全国声讨。
{'added': {}, 'removed': {}, 'changed': {'knowledge_graph': {'old': {'entities': [{'name': '黄岩岛', 'type': '地点', 'attributes': [{'name': '位置', 'value': '南海'}]}, {'name': '中国渔民', 'type': '人员', 'attributes': [{'name': '活动', 'value': '在黄岩岛潟湖内正常作业'}]}, {'name': '菲律宾海军', 'type': '军事单位', 'attributes': [{'name': '行动', 'value': '堵截和干扰中国渔民'}, {'name': '舰只', 'value': '德尔皮拉尔号汉密尔顿级巡逻舰'}]}, {'name': '德尔皮拉尔号', 'type': '武器装备', 'attributes': [{'name': '类型', 'value': '汉密尔顿级巡逻舰'}]}], 'relationships': [{'from': '菲律宾海军', 'to': '德尔皮拉尔号', 'relationship': '拥有'}, {'from': '菲律宾海军', 'to': '中国渔民', 'relationship': '堵截和干扰'}, {'from': '中国渔民', 'to': '黄岩岛', 'relationship': '在...作业'}]}, 'new': {'entities': [{'name': '菲律宾', 'type': '国家'}, {'name': '《美西巴黎条约》', 'type': '条约', 'attributes': [{'name': '签订年份', 'value': '1898年'}]}, {'name': '《美西华盛顿条约》', 'type': '条约', 'attributes': [{'name': '签订年份', 'value': '1900年'}]}, {'name': '《英美条约》', 'type': '条约', 'attributes': [{'name': '签订年份', 'value': '1930年'}]}, {'name': '黄岩岛', 'type': '岛屿'}, {'name': '《菲律宾共和国宪法》', 'type': '法律文件', 'attributes': [{'name': '发布年份', 'value': '1935年'}]}, {'name': '《美菲一般关系条约》', 'type': '条约', 'attributes': [{'name': '签订年份', 'value': '1947年'}]}, {'name': '《菲美军事同盟条约》', 'type': '条约', 'attributes': [{'name': '签订年份', 'value': '1952年'}]}, {'name': '第3046号法令', 'type': '法令', 'attributes': [{'name': '发布日期', 'value': '1961年6月17日'}]}, {'name': '1968年菲律宾关于领海基线的修正令', 'type': '法令'}], 'relationships': [{'from': '菲律宾', 'to': '《美西巴黎条约》', 'relationship': '界定领土范围'}, {'from': '菲律宾', 'to': '《美西华盛顿条约》', 'relationship': '界定领土范围'}, {'from': '菲律宾', 'to': '《英美条约》', 'relationship': '界定领土范围'}, {'from': '《美西巴黎条约》', 'to': '黄岩岛', 'relationship': '未包括在内'}, {'from': '《美西华盛顿条约》', 'to': '黄岩岛', 'relationship': '未包括在内'}, {'from': '《英美条约》', 'to': '黄岩岛', 'relationship': '未包括在内'}, {'from': '菲律宾', 'to': '《菲律宾共和国宪法》', 'relationship': '重申法律效力'}, {'from': '菲律宾', 'to': '《美菲一般关系条约》', 'relationship': '重申法律效力'}, {'from': '菲律宾', 'to': '《菲美军事同盟条约》', 'relationship': '重申法律效力'}, {'from': '菲律宾', 'to': '第3046号法令', 'relationship': '重申法律效力'}, {'from': '菲律宾', 'to': '1968年菲律宾关于领海基线的修正令', 'relationship': '重申法律效力'}]}}}}
中国政府对黄岩岛进行持续有效管理的史实记录在中国历代官方文件、地方志和官方地图中都有反映。据《元史·郭守敬传》记载,1279年,元代著名天文学家郭守敬奉皇帝的旨意进行“四海测验”,南海的测量点就在黄岩岛。这说明至少在元朝,中国就已经发现并管辖黄岩岛了。黄岩岛及其周边海域自古以来就是中国的传统渔场,中国渔民,特别是海南省谭门镇的渔民,世世代代在这片海域从事渔业生产活动。流传至今的《更路簿》(以文字形式呈现中国渔民在南海进行渔业生产和贸易活动的航行指南)等古籍,完整记载了祖祖辈辈的中国渔民在黄岩岛及其附近海域从事渔业活动的航线。
{'added': {}, 'removed': {}, 'changed': {'knowledge_graph': {'old': {'entities': [{'name': '黄岩岛', 'type': '军事单位', 'attributes': [{'name': '管理', 'value': '中国政府对黄岩岛进行持续有效管理'}, {'name': '历史记录', 'value': '史实记录在中国历代官方文件、地方志和官方地图中都有反映'}, {'name': '发现时间', 'value': '至少在元朝(1279年)'}, {'name': '用途', 'value': '传统渔场'}]}, {'name': '郭守敬', 'type': '人物', 'attributes': [{'name': '身份', 'value': '元代著名天文学家'}, {'name': '活动', 'value': '奉皇帝的旨意进行‘四海测验’,南海的测量点就在黄岩岛'}]}, {'name': '《更路簿》', 'type': '文献', 'attributes': [{'name': '内容', 'value': '记载了祖祖辈辈的中国渔民在黄岩岛及其附近海域从事渔业活动的航线'}]}, {'name': '海南省谭门镇的渔民', 'type': '群体', 'attributes': [{'name': '活动', 'value': '世世代代在这片海域从事渔业生产活动'}]}], 'relationships': [{'from': '黄岩岛', 'to': '中国政府', 'relationship': '被管理'}, {'from': '黄岩岛', 'to': '《更路簿》', 'relationship': '被记载为传统渔场'}, {'from': '黄岩岛', 'to': '海南省谭门镇的渔民', 'relationship': '是其传统渔业活动区域'}, {'from': '郭守敬', 'to': '黄岩岛', 'relationship': '进行了地理测量'}]}, 'new': {'entities': [{'name': '菲律宾', 'type': '国家'}, {'name': '黄岩岛', 'type': '岛屿'}, {'name': '《公约》', 'type': '国际法律文件'}], 'relationships': [{'from': '菲律宾', 'to': '黄岩岛', 'relationship': '提出领土主权要求'}, {'from': '菲律宾', 'to': '《公约》', 'relationship': '曲解'}]}}}}
近现代有关黄岩岛最重要的记载是在1935年1月,中华民国政府的内政部、外交部、海军部和教育部等官方机构派成员组成水陆地图审查委员会,公布了中国辖属的南海诸岛中132个岛礁沙滩的名称,其中黄岩岛以“斯卡巴罗礁”(Scarborough Reef)之名,作为中沙群岛的一部分列入中华民国版图。1947年10月,中华民国政府核定和公布的南海诸岛新旧名称对照表中,将斯卡巴罗礁改称“民主礁”(Minzhu Jiao),列在中沙群岛范围内。
{'added': {}, 'removed': {}, 'changed': {'knowledge_graph': {'old': {'entities': [{'name': '中华民国政府', 'type': '军事单位', 'attributes': [{'name': '行动', 'value': '核定和公布南海诸岛新旧名称对照表'}, {'name': '时间', 'value': '1947年10月'}]}, {'name': '水陆地图审查委员会', 'type': '军事单位', 'attributes': [{'name': '组成部门', 'value': '内政部, 外交部, 海军部, 教育部'}, {'name': '活动', 'value': '公布了中国辖属的南海诸岛中132个岛礁沙滩的名称'}, {'name': '时间', 'value': '1935年1月'}]}, {'name': '黄岩岛', 'type': '地理位置', 'attributes': [{'name': '别名', 'value': '斯卡巴罗礁, 民主礁'}, {'name': '所属区域', 'value': '中沙群岛'}]}], 'relationships': [{'from': '中华民国政府', 'to': '黄岩岛', 'relationship': '管理并命名'}, {'from': '水陆地图审查委员会', 'to': '黄岩岛', 'relationship': '首次正式记录'}]}, 'new': {'entities': [{'name': '黄岩岛', 'type': '地理位置'}, {'name': '中国', 'type': '国家'}, {'name': '菲律宾', 'type': '国家'}, {'name': '1997年4月30日', 'type': '日期'}, {'name': '1990年', 'type': '日期'}, {'name': '1997年5月20日', 'type': '日期'}, {'name': '1997年8月5日', 'type': '日期'}, {'name': '1998年1月至3月', 'type': '日期范围'}, {'name': '中国海监船', 'type': '船只'}, {'name': '菲律宾海军', 'type': '军队'}, {'name': '美国', 'type': '国家'}, {'name': '琼海00473号', 'type': '渔船'}, {'name': '琼海00372号', 'type': '渔船'}, {'name': '中远渔313号', 'type': '渔船'}, {'name': '中远渔311号', 'type': '渔船'}, {'name': '海南省琼海市潭门镇', 'type': '地理位置'}], 'relationships': [{'from': '菲律宾', 'to': '黄岩岛', 'relationship': '登上'}, {'from': '菲律宾', 'to': '黄岩岛', 'relationship': '炸毁主权碑'}, {'from': '菲律宾', 'to': '黄岩岛', 'relationship': '插上国旗'}, {'from': '菲律宾国会议员', 'to': '黄岩岛', 'relationship': '登岛'}, {'from': '中国海监船', 'to': '黄岩岛', 'relationship': '抵达现场'}, {'from': '中国海监船', 'to': '菲律宾军舰', 'relationship': '对峙'}, {'from': '菲律宾海军', 'to': '中国渔船', 'relationship': '拘捕'}, {'from': '菲律宾海军', 'to': '中国渔民', 'relationship': '扣押'}, {'from': '菲律宾', 'to': '美国', 'relationship': '举行联合军演'}, {'from': '菲律宾海军', 'to': '琼海00473号', 'relationship': '拦截'}, {'from': '菲律宾海军', 'to': '琼海00372号', 'relationship': '拦截'}, {'from': '菲律宾海军', 'to': '中远渔313号', 'relationship': '拦截'}, {'from': '菲律宾海军', 'to': '中远渔311号', 'relationship': '拦截'}, {'from': '菲律宾', 'to': '中国渔民', 'relationship': '指控非法入境'}, {'from': '菲律宾', 'to': '中国渔民', 'relationship': '拘押'}]}}}}
中国对南海诸岛的管辖得到国际承认。日本战败后,中国政府根据《开罗宣言》和《波茨坦公告》对南海诸岛实施接收和管辖;1947年编写了《南海诸岛地理志略》,绘制标有南海“断续线”的《南海诸岛位置图》;1948年中华民国政府正式公布了《中华民国行政区域图》,其中包括《南海诸岛位置图》。1949年中华人民共和国成立后,新中国政府完整继承和延续了对南海诸岛的管辖。中华人民共和国在1958年发布的《关于领海的声明》中重申了对南海诸岛的领土主权。
{'added': {}, 'removed': {}, 'changed': {'knowledge_graph': {'old': {'entities': [{'name': '中国', 'type': '国家', 'attributes': [{'name': '行动', 'value': '对南海诸岛实施接收和管辖'}, {'name': '时间点', 'value': '日本战败后'}, {'name': '依据', 'value': '《开罗宣言》和《波茨坦公告》'}]}, {'name': '中华民国政府', 'type': '政府机构', 'attributes': [{'name': '行动', 'value': '正式公布《中华民国行政区域图》,其中包括《南海诸岛位置图》'}, {'name': '时间点', 'value': '1948年'}]}, {'name': '中华人民共和国', 'type': '国家', 'attributes': [{'name': '行动', 'value': '完整继承和延续了对南海诸岛的管辖'}, {'name': '时间点', 'value': '1949年后'}, {'name': '声明', 'value': '在1958年发布的《关于领海的声明》中重申了对南海诸岛的领土主权'}]}], 'relationships': [{'from': '中国', 'to': '南海诸岛', 'relationship': '实施接收和管辖'}, {'from': '中华民国政府', 'to': '南海诸岛', 'relationship': '绘制并公布位置图'}, {'from': '中华人民共和国', 'to': '南海诸岛', 'relationship': '继承并继续管辖'}]}, 'new': {'entities': [{'name': '菲律宾', 'type': '国家'}, {'name': '中国', 'type': '国家'}, {'name': '南海', 'type': '海域'}, {'name': '马尼拉', 'type': '城市'}, {'name': '《南海各方行为宣言》(DOC)', 'type': '文件'}, {'name': '南沙海域', 'type': '海域'}], 'relationships': [{'from': '中国', 'to': '菲律宾', 'relationship': '进行了多轮谈判和磋商'}, {'from': '中国', 'to': '马尼拉', 'relationship': '参加了在马尼拉举行的中菲关于在南海建立信任措施工作小组会议'}, {'from': '中国', 'to': '东盟国家', 'relationship': '启动了针对南沙海域的《南海各方行为宣言》(DOC)的谈判'}, {'from': '菲律宾', 'to': '南海', 'relationship': '存在占岛企图'}, {'from': '《南海各方行为宣言》(DOC)', 'to': '南沙海域', 'relationship': '适用范围'}]}}}}
进入20世纪70年代,中国政府加强了对南海诸岛的管辖,多次派科学考察队到黄岩岛进行科学考察。1977年10月,中国科学院南海海洋研究所的科研人员登上黄岩岛进行考察。1978年6月,该所科研人员再次登岛进行考察活动。1985年4月,由国家海洋局南海分局组织的综合考察队登上黄岩岛实施综合考察。1994年我南海科学考察队抵达黄岩岛进行考察,并在岛上建了一块一米高的水泥纪念碑。中国政府主管部门在1994年、1995年、1997年和2007年先后四次批准无线电爱好者登岛进行无线电测量。
{'added': {}, 'removed': {}, 'changed': {'knowledge_graph': {'old': {'entities': [{'name': '中国科学院南海海洋研究所', 'type': '军事单位', 'attributes': [{'name': '单位名称', 'value': '中国科学院南海海洋研究所'}]}, {'name': '国家海洋局南海分局', 'type': '军事单位', 'attributes': [{'name': '单位名称', 'value': '国家海洋局南海分局'}]}, {'name': '黄岩岛', 'type': '地点', 'attributes': [{'name': '地理位置', 'value': '南海诸岛'}]}], 'relationships': [{'from': '中国科学院南海海洋研究所', 'to': '黄岩岛', 'relationship': '考察'}, {'from': '国家海洋局南海分局', 'to': '黄岩岛', 'relationship': '综合考察'}]}, 'new': {'entities': [{'name': '黄岩岛', 'type': '地理实体'}, {'name': '菲律宾', 'type': '国家'}, {'name': '中国驻菲律宾大使', 'type': '职位'}, {'name': '中国渔船', 'type': '船只'}, {'name': '菲方舰只', 'type': '军舰'}, {'name': '渔民', 'type': '人员'}, {'name': '马尼拉', 'type': '城市'}, {'name': '菲律宾国家地图和资源信息局', 'type': '机构'}, {'name': '马尼拉新闻俱乐部', 'type': '组织'}], 'relationships': [{'from': '菲律宾', 'to': '黄岩岛', 'relationship': '领土主张'}, {'from': '中国渔船', 'to': '黄岩岛', 'relationship': '附近作业'}, {'from': '菲方舰只', 'to': '中国渔船', 'relationship': '骚扰'}, {'from': '菲方舰只', 'to': '中国渔船', 'relationship': '撞沉'}, {'from': '菲律宾海军', 'to': '渔民', 'relationship': '扣留'}, {'from': '中国外交部', 'to': '菲律宾', 'relationship': '提出严正抗议'}, {'from': '中国驻菲律宾大使馆', 'to': '菲律宾', 'relationship': '连夜交涉'}, {'from': '菲律宾国家地图和资源信息局', 'to': '菲律宾地图', 'relationship': '出版'}, {'from': '中国驻菲律宾大使', 'to': '马尼拉新闻俱乐部', 'relationship': '应邀参加记者采访'}, {'from': '中国驻菲律宾大使', 'to': '菲律宾地图', 'relationship': '展示给记者看'}]}}}}
在你提出的“只给结构”与“给结构与领域引导”知识图谱抽取之间的差异化分析中,具体可以从以下几个方面来对比这两种方法的效果和结果。
1. 知识图谱结构的差异
只给结构的知识图谱抽取:
这种方式只提供了基本的图谱结构,不包括任何领域特定的引导信息。图谱构建通常依赖于自动化的文本分析,如实体识别、关系抽取等。没有明确的领域引导时,模型更多依赖语言模型的通用理解,从文本中抽取出广义的实体和关系。例如,模型可能会将“黄岩岛”标记为“地点”,并标出相关的“军事单位”或“机构”,但可能无法准确把握这些实体在特定领域中的重要性或角色。例子:
- 实体:如“黄岩岛”被标记为地点,且相关实体如“中国科学院南海海洋研究所”与“黄岩岛”之间的关系仅仅抽取为“考察”。
- 关系:如“中国科学院南海海洋研究所”和“黄岩岛”的关系只是标注为“考察”关系。
给结构和领域引导的知识图谱抽取:
在这种方法中,不仅提供了基本的图谱结构,还提供了领域特定的知识或引导信息,帮助模型更精准地抽取特定领域的实体、关系和属性。在化工安全或地理领土争端等复杂领域,这种领域引导会显著提升抽取质量。例如,在南海争端的情境下,模型会明确识别出“菲律宾”和“黄岩岛”的领土主张关系,而非单纯的“考察”关系,或者可以在“菲方舰只”与“渔民”之间标注更详细的冲突关系(如骚扰、撞沉等)。例子:
- 实体:如“黄岩岛”被标注为地理实体,而非单纯的地点。此外,模型能够精确标识“菲律宾”、“中国渔船”与“菲方舰只”之间的紧张关系。
- 关系:如“菲律宾”与“黄岩岛”之间的关系被明确标注为“领土主张”,而不是仅仅是一个一般性的“考察”关系。此外,涉及到的冲突(如“菲方舰只”骚扰“中国渔船”)也得到了准确标注。
2. 知识图谱的丰富度和准确性
只给结构的结果:
图谱的实体和关系抽取较为基础,不能充分体现领域内复杂的互动和关系。图谱中的实体可能较为简单,关系也仅限于直接的文本信息抽取,不具备足够的上下文理解。它们可能过于泛化,缺乏精细的领域分析。例如,抽取出的实体“黄岩岛”可能仅仅是作为“地点”进行标注,并且涉及的军事单位和机构的关系也仅仅是基础的“考察”或“综合考察”。
给结构和领域引导的结果:
图谱的构建不仅涉及基础实体和关系的抽取,还能根据领域引导补充更加复杂、精细的关系信息,提升图谱的准确性和丰富度。模型能在图谱中体现出更深层次的领域知识,如在南海争端的案例中,图谱能够揭示“菲律宾”和“黄岩岛”之间的复杂政治、法律关系,而不仅仅是简单的地理实体间的关系。比如,在这种领域引导下,涉及的实体如“中国驻菲律宾大使”和“菲律宾国家地图和资源信息局”的互动关系会被精准地标识出来,包括外交抗议、地图发布等行为,这些都能为后续的分析和推理提供更为细致的信息。
3. 领域特定的推理与问答能力
只给结构的知识图谱:
在此方法下,图谱更多地是基于通用的文本数据构建,可能无法很好地处理特定领域的复杂推理任务。例如,若用户询问与南海争端相关的问题,模型可能会提供较为基础的答案,无法深入到“菲律宾和中国渔船的冲突”或“领土主张争端”的具体细节。给结构和领域引导的知识图谱:
领域引导能够显著提升图谱在特定领域中的推理能力。比如,在涉及南海争端时,模型不仅能够提供“黄岩岛”的基本信息,还能深入回答如“菲律宾是否拥有对黄岩岛的领土主张”或“中国外交部对菲方行为的反应”这类复杂问题。这是因为领域引导让模型能够理解和解析更多的上下文信息,从而提供更精确、深度的推理。
4. 图谱可扩展性与适应性
只给结构的图谱:
这类图谱通常更依赖于普适的实体和关系模式,可能难以应对跨领域或复杂应用场景。在实际应用中,如果引入了新的领域知识或背景信息,可能需要对图谱结构进行较大修改和补充。给结构和领域引导的图谱:
在具有领域引导的情况下,图谱更加灵活和可扩展。对于特定领域的知识图谱,模型能通过引导信息快速适应新的数据源或新的领域需求。例如,在添加南海争端相关的文献或数据时,图谱能自动适配新数据,并识别出领域相关的新实体和关系。
结论:
通过“只给结构”和“给结构和领域引导”这两种方法的对比,可以发现,领域引导在提升知识图谱的准确性、丰富度和推理能力方面具有显著优势。尤其是在特定领域(如南海争端、化工安全等)的应用中,领域引导能够帮助模型识别出更复杂的关系和更深层次的知识,进而提升问答和推理的效果。而仅依赖结构的图谱抽取则可能过于简单,无法有效应对复杂的领域问题。
从更公平的角度对两种抽取结构进行分析
要对“只给结构”和“给结构和领域引导”两种知识图谱抽取方式进行公平公正的评估,我们需要在多个维度上分析每种方法的优劣,并通过客观的数据支持这些结论。以下是对这两种方法的详细对比分析,每种方法的优缺点都有具体的论证:
1. 准确性与全面性
只给结构的知识图谱抽取:
- 优点:
- 该方法简洁且具有普适性,适合处理一些通用领域的数据。可以自动地从原始文本中抽取出基础的实体和关系,而不依赖于事先的领域知识或人工标注。
- 适合从大规模通用文本中快速生成初步的知识图谱,尤其是在没有明确领域约束的情况下。
- 缺点:
- 准确性较低:由于没有领域引导,模型可能会将一些模糊、广义的实体(如“黄岩岛”)或关系(如“考察”)错误地抽取出来。很多关系可能只是基于语言的直接理解,并非具有实际领域内的深刻意义。
- 缺乏深度:模型可能无法深入理解实体之间的复杂关系。例如,在南海争端的情境下,模型可能会把“黄岩岛”与“中国科学院南海海洋研究所”的关系简化为“考察”,而忽略它们在领土争议中的重要性。
- 优点:
给结构和领域引导的知识图谱抽取:
- 优点:
- 提高准确性:通过引入领域知识,模型能更准确地识别和区分不同的实体和关系。例如,在南海争端的案例中,模型能够准确识别出“菲律宾”和“黄岩岛”之间的“领土主张”关系,而不是简单的“考察”。
- 深度增强:引导帮助模型理解实体之间的复杂互动和更深层次的关系。例如,关于“菲律宾”和“中国渔船”的冲突,领域引导会促使模型提取出骚扰、撞沉等具体的行为。
- 缺点:
- 领域依赖性强:该方法依赖于领域知识和引导信息,需要额外的人工输入或者已经构建好的领域数据库。在没有合适的领域引导时,模型的表现会受到限制。
- 适应性较差:当需要处理跨领域或多领域的数据时,模型可能需要针对每个领域单独进行优化和训练,这可能会导致模型在多领域问题上的表现不一致。
- 优点:
2. 推理能力
只给结构的知识图谱抽取:
- 优点:
- 灵活性高:由于不依赖于领域引导,模型能够广泛适用于不同类型的文本和数据。对于不需要复杂推理或领域特定知识的应用场景,该方法可以快速产生初步的结果。
- 缺点:
- 推理能力有限:在面对需要复杂推理的任务时,模型的表现通常较差。例如,模型可能无法有效地回答复杂的问题,如“菲律宾和中国渔船之间的冲突为何如此频繁”,因为它只关心基础的实体和关系,而无法对复杂的政治、法律和社会背景做出深入理解。
- 优点:
给结构和领域引导的知识图谱抽取:
- 优点:
- 推理能力强:领域引导的知识图谱能够帮助模型进行更复杂的推理和问题解答。例如,关于“菲律宾与黄岩岛的领土争端”,模型能够根据领域知识推导出菲律宾的法律立场和中国的外交反应,而不是仅停留在简单的事实层面。
- 增强推理深度:在处理涉及复杂历史背景、政治关系或技术规范的任务时,领域引导提供的上下文信息能帮助模型从多角度进行综合推理。
- 缺点:
- 推理灵活性差:由于模型依赖领域知识,若输入的领域背景信息不全面或数据缺失,推理效果可能受到影响。若数据更新滞后,推理可能无法反映当前的实际情况。
- 优点:
3. 数据覆盖范围
只给结构的知识图谱抽取:
- 优点:
- 通用性强:对于广泛领域的应用,尤其是没有具体领域知识限制的情况,模型可以从原始文本中自动抽取出多种实体和关系,涵盖较广泛的知识。
- 可扩展性好:能够应对新的文本和信息源,灵活适应各种类型的数据,尤其是开放领域的数据。
- 缺点:
- 缺乏针对性:在处理特定领域的复杂问题时,模型的覆盖范围有限。比如,在南海争端这类特定领域中,模型可能无法抽取到与特定事件或政治背景相关的实体和关系。
- 优点:
给结构和领域引导的知识图谱抽取:
- 优点:
- 更精准的领域覆盖:通过领域引导,模型能够准确捕捉到特定领域中的关键实体和关系,并且能够深入到细节中,提供有针对性的知识图谱。
- 缺点:
- 局限于特定领域:领域引导可能导致模型的适用范围较窄,只能覆盖指定领域的知识。在跨领域应用中,模型需要针对不同的领域重新进行适配,增加了复杂性。
- 优点:
4. 构建成本和效率
只给结构的知识图谱抽取:
- 优点:
- 低成本和高效率:该方法通过自动化的方式从原始文本中抽取实体和关系,不需要过多人工干预。适合于需要快速生成知识图谱的大规模文本数据。
- 缺点:
- 生成结果粗糙:由于缺乏领域引导,模型生成的知识图谱结果可能较为简略,需进一步清理和优化。
- 优点:
给结构和领域引导的知识图谱抽取:
- 优点:
- 高质量输出:领域引导能够确保生成的知识图谱具有较高的质量和精度,适用于复杂任务。
- 缺点:
- 高成本和低效率:领域知识的引入需要额外的人工输入和领域专家参与,构建过程相对较为繁琐和时间消耗较大。
- 优点:
结论
综合评估后,可以得出以下结论:
只给结构的知识图谱抽取:适合用于大规模文本数据的初步抽取,能够快速生成通用的知识图谱,但在复杂领域的推理和准确性上存在较大局限,推理能力和数据覆盖有限。
给结构和领域引导的知识图谱抽取:适合于需要高准确度和深入推理的领域特定应用,能够提供高质量的领域知识图谱,并能应对复杂问题,但构建过程较为繁琐,且在跨领域应用中可能遇到适应性问题。
根据实际应用需求选择合适的方式是关键。如果任务要求精度高且具备领域特定的背景知识,领域引导的方法无疑更为有效;如果任务需要处理海量数据,且没有复杂领域依赖,那么只给结构的方法会更具优势。