SiameseAOE 中文-base 代码实例:ABSA 结构化结果转为 Neo4j 知识图谱节点关系
1. 项目概述与核心价值
SiameseAOE 通用属性观点抽取模型是一个专门处理中文文本属性情感分析(ABSA)任务的强大工具。这个模型基于先进的提示 + 文本构建思路,通过指针网络实现精准的片段抽取,能够从用户评论、产品反馈等文本中自动识别属性词和对应的情感词。
将 ABSA 的结构化结果转换为 Neo4j 知识图谱,可以让我们以更直观的方式理解和分析用户情感倾向。比如电商平台可以通过这种转换,快速发现哪些产品属性受到用户好评或差评,从而指导产品改进和营销策略。
2. 环境准备与快速部署
2.1 基础环境要求
确保你的系统满足以下要求:
- Python 3.8+
- Neo4j 数据库(社区版或企业版)
- 至少 8GB 内存(处理大规模数据时建议 16GB+)
2.2 安装必要依赖
# 安装 SiameseAOE 相关依赖
pip install transformers torch
# 安装 Neo4j Python 驱动
pip install neo4j
# 安装其他工具库
pip install pandas numpy
2.3 启动 Neo4j 数据库
如果你使用 Docker,可以快速启动 Neo4j:
docker run \
--name neo4j \
-p 7474:7474 -p 7687:7687 \
-d \
-v $HOME/neo4j/data:/data \
-v $HOME/neo4j/logs:/logs \
-v $HOME/neo4j/import:/var/lib/neo4j/import \
--env NEO4J_AUTH=neo4j/password \
neo4j:latest
3. ABSA 结果到 Neo4j 的转换实现
3.1 理解 ABSA 数据结构
SiameseAOE 模型输出的典型 ABSA 结果结构如下:
{
"属性词": {
"情感词": null
}
}
例如,对于输入文本"音质很好,电池续航时间长",可能输出:
{
"音质": {"很好": null},
"电池续航": {"长": null}
}
3.2 设计知识图谱 Schema
我们将构建一个简单但有效的情感分析知识图谱:
- 节点类型:
产品- 被评论的产品属性- 产品的具体属性情感- 用户对属性的情感表达
- 关系类型:
HAS_ATTRIBUTE- 产品拥有某个属性HAS_SENTIMENT- 属性获得某种情感评价
3.3 核心转换代码实现
from neo4j import GraphDatabase
import json
class ABSAToNeo4jConverter:
def __init__(self, uri, user, password):
self.driver = GraphDatabase.driver(uri, auth=(user, password))
def close(self):
self.driver.close()
def create_absa_graph(self, product_name, absa_results):
"""将 ABSA 结果转换为 Neo4j 图谱"""
with self.driver.session() as session:
# 创建产品节点
session.execute_write(
self._create_product_node, product_name
)
# 处理每个属性 - 情感对
for attribute, sentiment_info in absa_results.items():
sentiment = list(sentiment_info.keys())[0] if sentiment_info else "中性"
session.execute_write(
self._create_absa_relationship, product_name, attribute, sentiment
)
@staticmethod
def _create_product_node(tx, product_name):
"""创建产品节点"""
query = (
"MERGE (p:产品 {名称:$name}) "
"RETURN p"
)
tx.run(query, name=product_name)
@staticmethod
def _create_absa_relationship(tx, product_name, attribute, sentiment):
"""创建完整的属性 - 情感关系链"""
attr_query = (
)
tx.run(attr_query, attr_name=attribute)
sent_query = (
)
tx.run(sent_query, sentiment=sentiment)
product_attr_query = (
)
tx.run(product_attr_query, product_name=product_name, attribute=attribute)
attr_sent_query = (
)
tx.run(attr_sent_query, attribute=attribute, sentiment=sentiment)
__name__ == :
converter = ABSAToNeo4jConverter(, , )
absa_results = {
: {: },
: {: },
: {: }
}
converter.create_absa_graph(, absa_results)
converter.close()
4. 实际应用案例
4.1 电商评论分析实战
假设我们有一个电商平台的用户评论数据集,我们可以这样处理:
def process_ecommerce_reviews(converter, product_name, reviews):
"""处理电商评论并构建知识图谱"""
for review in reviews:
# 使用 SiameseAOE 进行情感分析(这里简化表示)
absa_results = siamese_aoe_analyze(review.text)
# 转换为知识图谱
converter.create_absa_graph(product_name, absa_results)
# 批量处理示例
reviews = [
"音质很棒,但是电池续航一般",
"拍照效果很好,系统流畅",
"价格有点贵,但做工精致"
]
converter = ABSAToNeo4jConverter("bolt://localhost:7687", "neo4j", "password")
process_ecommerce_reviews(converter, "智能手机 X", reviews)
converter.close()
4.2 可视化查询示例
构建完知识图谱后,我们可以执行有用的查询:
// 查询所有被提及的产品属性
MATCH (a:属性)
RETURN a.名称 AS attribute, count(*) AS mention_count
ORDER BY mention_count DESC
// 查询正面评价最多的属性
MATCH (a:属性)-[:HAS_SENTIMENT]->(s:情感)
WHERE s.描述 IN ["很好", "棒", "优秀", "满意"]
RETURN a.名称 AS attribute, count(s) AS positive_count
ORDER BY positive_count DESC
// 查询需要改进的属性(负面评价)
MATCH (a:属性)-[:HAS_SENTIMENT]->(s:情感)
WHERE s.描述 IN ["差", "不好", "一般", "偏高"]
RETURN a.名称 AS attribute, s.描述 AS sentiment, count(*) AS count
ORDER BY count DESC
5. 高级功能与优化建议
5.1 情感强度分析增强
我们可以扩展基础模型来捕捉情感强度:
def enhanced_absa_conversion(tx, product_name, absa_results_with_strength):
"""增强版的情感分析转换,包含情感强度"""
for attribute, sentiment_data in absa_results_with_strength.items():
sentiment = sentiment_data['sentiment']
strength = sentiment_data['strength']
# 0-1 的情感强度值
# 创建增强的情感节点(包含强度信息)
query = (
"MERGE (s:情感 {描述:$sentiment, 强度:$strength}) "
"RETURN s"
)
tx.run(query, sentiment=sentiment, strength=strength)
# ... 其余关系创建逻辑类似基础版本
5.2 批量处理优化
对于大规模数据处理,建议使用批量操作提高性能:
def batch_create_absa_data(tx, batch_data):
"""批量创建 ABSA 图谱数据"""
query = (
"UNWIND $data AS item "
"MERGE (p:产品 {名称:item.product}) "
"MERGE (a:属性 {名称:item.attribute}) "
"MERGE (s:情感 {描述:item.sentiment}) "
"MERGE (p)-[:HAS_ATTRIBUTE]->(a) "
"MERGE (a)-[:HAS_SENTIMENT]->(s)"
)
tx.run(query, data=batch_data)
# 准备批量数据
batch_data = [
{"product": "智能手机 X", "attribute": "音质", "sentiment": "很好"},
{"product": "智能手机 X", "attribute": "电池", "sentiment": "一般"}
# ... 更多数据
]
6. 总结与下一步建议
通过将 SiameseAOE 的 ABSA 结构化结果转换为 Neo4j 知识图谱,我们创建了一个强大的情感分析可视化工具。这种方法不仅让复杂的情感数据变得直观易懂,还为深入的数据分析提供了坚实基础。
实践建议:
- 从小规模开始:先用几百条评论测试整个流程,确保所有组件正常工作
- 优化查询性能:为常用查询创建索引,例如对属性名称、情感描述等字段建立索引
- 考虑实时更新:对于需要实时分析的场景,可以设计增量更新机制
- 扩展分析维度:除了基础的情感分析,还可以加入时间维度、用户群体分析等
进一步探索方向:
- 结合时间序列分析情感趋势变化
- 整合用户画像数据,分析不同群体的情感倾向
- 构建情感传播图谱,分析情感如何在用户间传播
这种方法特别适合电商平台、社交媒体监控、客户反馈分析等场景,能够帮助企业和组织更好地理解用户需求和情感倾向。

