SiameseUIE中文-base代码实例自定义Schema抽取商品评论情感属性1. 引言从海量评论中快速提取关键信息你有没有遇到过这种情况面对电商平台上成百上千条商品评论想快速了解用户对产品各个方面的真实评价却感觉无从下手。一条条看太费时间用传统的关键词搜索又不够精准常常会漏掉重要信息。比如一款蓝牙耳机用户可能同时评价了“音质”、“续航”、“佩戴舒适度”和“发货速度”。我们不仅想知道用户提到了哪些方面更想知道他们对每个方面是“满意”还是“不满意”。这种“属性-情感”的配对信息就是产品改进和营销决策的黄金数据。今天要介绍的SiameseUIE中文-base模型就是专门解决这个问题的利器。它是一个通用信息抽取模型特别擅长从中文文本中提取结构化的信息。而我们今天要重点演示的就是如何用它来自定义Schema精准抽取商品评论中的情感属性。简单来说你可以告诉模型“帮我从评论里找出用户提到的产品属性以及他们对每个属性的情感倾向。”模型就能自动完成这项工作把非结构化的文本变成结构化的数据表格。2. SiameseUIE是什么为什么选择它在深入代码之前我们先花几分钟了解一下这个模型的特别之处。2.1 核心思路提示文本的双流设计传统的命名实体识别模型通常需要针对特定任务进行训练——你要识别“人名”就得用标注了人名的数据训练要识别“商品属性”又得重新训练一个模型。这种方式不够灵活扩展成本高。SiameseUIE采用了一种更聪明的思路提示Prompt文本Text。你可以把它想象成一个特别听话的助手。你不需要提前训练它认识“音质”这个词只需要在提问时告诉它“请从下面这段话里找出所有的‘属性词’和对应的‘情感词’。”模型就会根据你的“提示”去文本中寻找匹配的内容。这种设计带来了几个明显优势零样本或少样本能力即使模型没有在“商品评论”数据上专门训练过只要你的提示描述清楚它也能很好地完成任务。灵活可定制通过修改提示也就是我们后面要讲的Schema同一个模型可以完成NER、关系抽取、事件抽取、情感分析等多种任务。效率更高模型采用双流编码器分别处理提示和文本推理速度比传统UIE模型提升约30%。2.2 技术实现指针网络抓取文本片段模型内部使用了一种叫做指针网络Pointer Network的技术来实现片段抽取Span Extraction。这又是什么意思呢我们用一个简单例子说明。假设评论是“音质非常出色但续航有点短。”传统分类模型可能会给每个词打标签B-属性, I-属性, B-情感, I-情感...而SiameseUIE的做法更直接它直接找出文本中的片段范围。对于“属性词”这个提示模型会输出[0, 2]“音质”的位置和[10, 12]“续航”的位置 对于“情感词”这个提示模型会输出[3, 5]“出色”的位置和[13, 14]“短”的位置然后根据你的Schema定义属性词-情感词的对应关系模型会自动配对最终得到属性“音质” → 情感“出色”属性“续航” → 情感“短”这种基于位置的抽取方式比基于词汇分类的方式更加精确特别是对于中文这种没有明显单词边界语言。3. 环境准备与快速启动好了理论部分就到这里现在我们开始动手实践。我会带你一步步搭建环境运行代码最终实现商品评论的情感属性抽取。3.1 模型基本信息首先了解一下我们要使用的这个具体镜像属性说明模型名称nlp_structbert_siamese-uie_chinese-base模型来源阿里达摩院 ModelScope模型大小391 MB缓存路径/root/ai-models/iic/nlp_structbert_siamese-uie_chinese-base这个模型已经预置在镜像中你不需要自己下载开箱即用。3.2 一键启动Web服务最简单的使用方式是通过Gradio启动一个Web界面。只需要一行命令python /root/nlp_structbert_siamese-uie_chinese-base/app.py执行后你会看到类似下面的输出Running on local URL: http://0.0.0.0:7860 Running on public URL: https://xxxx.gradio.live在浏览器中访问http://localhost:7860就能看到一个简洁的Web界面。这个界面提供了基础的文本输入和Schema输入框适合快速测试。但今天我们要做的是更实用的场景——用代码批量处理商品评论。所以接下来我们重点看Python代码的实现方式。3.3 核心依赖检查模型运行需要以下Python包这些都已经在镜像中预装好了# 主要依赖包 modelscope 1.34.0 # 阿里ModelScope框架 gradio 6.0.0 # Web界面框架可选 transformers 4.48.3 # Hugging Face transformers torch # PyTorch深度学习框架 huggingface-hub 0.33.5 # 模型仓库支持如果你想在自己的环境中部署可以用pip安装pip install modelscope transformers torch4. 核心概念Schema格式详解Schema是SiameseUIE模型的核心配置它定义了你要抽取什么信息、信息之间有什么关系。理解Schema的写法就掌握了这个模型的使用钥匙。4.1 Schema的四种基本类型模型支持四种主要的Schema格式对应不同的信息抽取任务1. 实体识别NER{人物: null, 地理位置: null, 组织机构: null}格式说明键名是实体类型值固定为null表示只抽取这个类型的实体不关心实体间关系。2. 关系抽取RE{人物: {比赛项目: null, 参赛地点: null, 获奖时间: null}}格式说明外层键是主体实体内层对象表示与该主体相关的关系类型。3. 事件抽取EE{胜负: {时间: null, 胜者: null, 败者: null, 赛事名称: null}}格式说明外层键是事件类型内层对象是该事件的各个要素。4. 情感抽取ABSA{属性词: {情感词: null}}格式说明这是我们今天重点要用的格式。外层“属性词”是我们要找的产品属性内层“情感词”是对应属性的情感表达。4.2 为商品评论设计专属Schema对于商品评论情感分析我们可以设计更精细的Schema。下面是一个完整的例子{ 产品属性: { 正面情感: null, 负面情感: null, 改进建议: null } }这个Schema的意思是从文本中找出所有的“产品属性”然后对于每个属性看看用户表达了“正面情感”、“负面情感”还是“改进建议”。实际使用时我们可以根据具体产品类别调整Schema。比如对于耳机产品{ 音质: {评价: null}, 续航: {评价: null}, 佩戴舒适度: {评价: null}, 外观设计: {评价: null}, 性价比: {评价: null} }这种预先定义好属性的方式适合你知道用户会关注哪些方面的情况。如果产品属性不确定用第一种通用格式更合适。5. 代码实战批量处理商品评论现在进入最实用的部分——用Python代码批量处理商品评论。我会提供一个完整的、可运行的代码示例。5.1 基础单条评论分析我们先从最简单的单条评论开始from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks # 初始化信息抽取管道 model_id damo/nlp_structbert_siamese-uie_chinese-base ie_pipeline pipeline(Tasks.information_extraction, modelmodel_id) # 定义商品评论情感分析的Schema schema { 属性词: {情感词: null} # 注意这里的null在Python中是None } # 要分析的评论 text 这款耳机音质非常出色低音浑厚有力高音清晰不刺耳但是续航时间有点短只能坚持4个小时左右。 # 执行信息抽取 result ie_pipeline(text, schema) print(抽取结果) print(result)运行这段代码你会得到类似下面的输出{ 属性词: [ { text: 音质, start: 3, end: 5, relations: { 情感词: [ {text: 出色, start: 6, end: 8}, {text: 浑厚有力, start: 11, end: 15}, {text: 清晰不刺耳, start: 18, end: 23} ] } }, { text: 续航时间, start: 30, end: 34, relations: { 情感词: [ {text: 短, start: 37, end: 38} ] } } ] }看模型成功识别出了属性“音质” → 正面情感“出色”、“浑厚有力”、“清晰不刺耳”属性“续航时间” → 负面情感“短”5.2 处理真实电商评论数据实际工作中我们通常要处理的是CSV或Excel文件中的批量评论。下面是一个完整的批量处理示例import pandas as pd import json from tqdm import tqdm from modelscope.pipelines import pipeline from modelscope.utils.constant import Tasks def analyze_product_reviews(input_file, output_file): 批量分析商品评论文件 参数 input_file: 输入文件路径支持CSV或Excel output_file: 输出文件路径 # 1. 加载数据 if input_file.endswith(.csv): df pd.read_csv(input_file) elif input_file.endswith(.xlsx): df pd.read_excel(input_file) else: raise ValueError(只支持CSV或Excel文件) # 假设数据列名为comment可根据实际情况调整 if comment not in df.columns: # 尝试自动识别评论列 for col in df.columns: if 评论 in col or 评价 in col or content in col.lower(): df.rename(columns{col: comment}, inplaceTrue) break # 2. 初始化模型 print(正在加载模型...) ie_pipeline pipeline(Tasks.information_extraction, modeldamo/nlp_structbert_siamese-uie_chinese-base) # 3. 定义情感分析Schema schema {属性词: {情感词: None}} # 4. 批量处理 results [] print(f开始处理 {len(df)} 条评论...) for idx, row in tqdm(df.iterrows(), totallen(df)): comment str(row[comment]).strip() if not comment or len(comment) 3: # 跳过空评论或过短评论 results.append({ original_comment: comment, attributes: [], sentiments: [], error: 评论过短 }) continue try: # 执行信息抽取 result ie_pipeline(comment, schema) # 解析结果 attributes [] sentiments [] if 属性词 in result: for attr in result[属性词]: attr_text attr[text] attributes.append(attr_text) if relations in attr and 情感词 in attr[relations]: for sentiment in attr[relations][情感词]: sentiments.append(f{attr_text}:{sentiment[text]}) results.append({ original_comment: comment, attributes: ;.join(attributes), sentiments: ;.join(sentiments), attribute_count: len(attributes), sentiment_count: len(sentiments), error: None }) except Exception as e: results.append({ original_comment: comment, attributes: [], sentiments: [], error: str(e) }) # 5. 保存结果 result_df pd.DataFrame(results) # 合并原始数据除了评论列 original_cols [col for col in df.columns if col ! comment] if original_cols: result_df pd.concat([df[original_cols], result_df], axis1) # 保存到文件 if output_file.endswith(.csv): result_df.to_csv(output_file, indexFalse, encodingutf-8-sig) else: result_df.to_excel(output_file, indexFalse) print(f处理完成结果已保存到 {output_file}) # 6. 生成统计报告 print(\n 分析报告 ) total_comments len(result_df) successful len(result_df[result_df[error].isna()]) avg_attributes result_df[attribute_count].mean() print(f总评论数: {total_comments}) print(f成功分析: {successful} ({successful/total_comments*100:.1f}%)) print(f平均每条评论提及属性数: {avg_attributes:.2f}) # 统计最常提到的属性 all_attributes [] for attrs in result_df[attributes]: if isinstance(attrs, str): all_attributes.extend(attrs.split(;)) from collections import Counter if all_attributes: top_attributes Counter(all_attributes).most_common(10) print(\n最常提到的产品属性TOP10:) for attr, count in top_attributes: print(f {attr}: {count}次) # 使用示例 if __name__ __main__: # 假设你的评论数据在comments.csv中 analyze_product_reviews( input_fileproduct_comments.csv, output_fileanalysis_results.csv )这个脚本做了以下几件事从CSV/Excel文件读取商品评论使用SiameseUIE模型分析每条评论提取属性词和情感词保存结构化结果到新文件生成分析报告包括最常提到的产品属性5.3 高级技巧情感极性分类上面的代码只提取了情感词但实际分析中我们通常需要知道情感是正面还是负面。我们可以添加一个情感词典来进行分类class SentimentAnalyzer: 情感分析增强类 # 情感词典可根据需要扩展 POSITIVE_WORDS { 好, 优秀, 出色, 棒, 赞, 满意, 喜欢, 超值, 划算, 流畅, 清晰, 舒适, 方便, 快捷, 耐用, 漂亮, 精美 } NEGATIVE_WORDS { 差, 糟糕, 烂, 差劲, 不满意, 讨厌, 贵, 不值, 卡顿, 模糊, 难受, 麻烦, 慢, 易坏, 丑, 粗糙 } NEUTRAL_WORDS { 一般, 普通, 还行, 可以, 中等, 寻常 } classmethod def classify_sentiment(cls, word): 对单个情感词进行分类 if word in cls.POSITIVE_WORDS: return 正面 elif word in cls.NEGATIVE_WORDS: return 负面 elif word in cls.NEUTRAL_WORDS: return 中性 else: # 简单规则包含否定词的可能为负面 neg_prefixes [不, 没, 无, 非] for prefix in neg_prefixes: if word.startswith(prefix) and len(word) 1: return 负面 return 未知 classmethod def analyze_comment(cls, ie_result): 分析单条评论的情感倾向 if 属性词 not in ie_result: return [] analysis [] for attr in ie_result[属性词]: attribute attr[text] if relations in attr and 情感词 in attr[relations]: for sentiment in attr[relations][情感词]: sentiment_word sentiment[text] polarity cls.classify_sentiment(sentiment_word) analysis.append({ attribute: attribute, sentiment_word: sentiment_word, polarity: polarity, start: sentiment[start], end: sentiment[end] }) return analysis # 使用示例 if __name__ __main__: # 假设我们已经有了ie_pipeline和schema comment 手机拍照效果很好但是电池续航太差了一天要充三次电。 result ie_pipeline(comment, schema) analysis SentimentAnalyzer.analyze_comment(result) print(情感分析结果) for item in analysis: print(f属性: {item[attribute]}, 情感词: {item[sentiment_word]}, 极性: {item[polarity]})输出结果属性: 拍照效果, 情感词: 很好, 极性: 正面 属性: 电池续航, 情感词: 差, 极性: 负面6. 实际应用案例理论讲完了代码也写了现在看看这个技术在实际业务中能怎么用。6.1 案例一电商产品评价监控假设你负责一款智能手环的产品运营需要每周分析用户评价找出产品改进点。传统做法人工阅读上千条评论手动记录用户提到的问题整理Excel表格统计问题出现频率耗时2-3天/周使用SiameseUIE的做法导出上周所有商品评论CSV格式运行我们的批量处理脚本30分钟自动得到最常被提到的属性TOP10每个属性的正面/负面评价比例具体的问题描述汇总实际发现70%的用户提到“续航”其中60%为负面评价“佩戴舒适度”提及率30%正面评价占80%“心率监测准确度”提及率15%负面评价占40%决策建议优先优化电池续航保持佩戴舒适度的优势在营销中重点宣传调研心率监测不准的具体原因6.2 案例二竞品分析你想了解自家产品与竞品在用户评价上的差异。分析流程爬取或购买竞品商品评论数据使用相同Schema分析所有产品评论对比分析def compare_products(product_a_results, product_b_results): 对比两个产品的评价 comparison {} # 统计各属性的提及率和情感分布 for product, results in [(A, product_a_results), (B, product_b_results)]: # ... 分析代码 ... pass return comparison可能发现你的产品在“音质”上评价更好竞品在“降噪”功能上更受好评两者在“价格”上都被认为偏贵6.3 案例三客服工单分析客服部门每天收到大量用户反馈其中包含产品问题描述。应用场景def analyze_customer_tickets(tickets): 分析客服工单中的产品问题 schema { 问题类型: {具体描述: None, 严重程度: None} } # 使用更针对性的Schema problem_schema { 硬件问题: {现象: None}, 软件问题: {现象: None}, 使用问题: {疑问: None}, 售后问题: {诉求: None} } results [] for ticket in tickets: analysis ie_pipeline(ticket[content], problem_schema) results.append({ ticket_id: ticket[id], analysis: analysis, priority: calculate_priority(analysis) # 根据问题类型自动分配优先级 }) return results7. 性能优化与注意事项在实际使用中有几个重要的注意事项可以帮助你获得更好的效果。7.1 输入文本长度限制模型对输入文本长度有限制建议不超过300字。如果评论过长可以考虑以下策略def process_long_text(text, max_length300): 处理超长文本 if len(text) max_length: return [text] # 按标点符号分割尽量保持语义完整 import re sentences re.split(r[。!?], text) chunks [] current_chunk for sentence in sentences: if not sentence.strip(): continue if len(current_chunk) len(sentence) max_length: current_chunk sentence 。 else: if current_chunk: chunks.append(current_chunk) current_chunk sentence 。 if current_chunk: chunks.append(current_chunk) return chunks # 使用示例 long_comment 非常详细的长评论... # 超过300字 chunks process_long_text(long_comment) results [] for chunk in chunks: result ie_pipeline(chunk, schema) results.append(result) # 合并结果 final_result merge_results(results)7.2 Schema设计最佳实践实体名称要具体不好{东西: {评价: null}}好{产品属性: {情感评价: null}}关系设计要合理避免过于复杂的关系嵌套一级关系通常足够使用测试多个版本# 测试不同Schema的效果 schemas [ {属性词: {情感词: null}}, {产品特征: {用户评价: null}}, {方面: {观点: null}} ] best_result None best_score 0 for s in schemas: result ie_pipeline(test_text, s) score evaluate_result(result, ground_truth) if score best_score: best_score score best_result result7.3 错误处理与重试在实际生产环境中需要添加适当的错误处理def safe_extraction(text, schema, max_retries3): 带重试机制的信息抽取 for attempt in range(max_retries): try: result ie_pipeline(text, schema) # 验证结果格式 if validate_result(result): return result else: print(f第{attempt1}次尝试结果格式无效重试...) except Exception as e: print(f第{attempt1}次尝试失败: {str(e)}) if attempt max_retries - 1: raise time.sleep(1) # 等待1秒后重试 return None8. 总结通过本文的介绍和代码实践你应该已经掌握了使用SiameseUIE中文-base模型进行商品评论情感属性抽取的核心方法。让我们回顾一下关键要点8.1 技术优势总结零样本能力强不需要针对商品评论进行专门训练通过合适的Schema就能直接使用灵活可定制一套模型支持多种信息抽取任务只需修改Schema配置中文优化好针对中文语言特点进行优化分词和实体识别更准确部署简单提供Web界面和Python API两种使用方式满足不同场景需求8.2 实际应用价值对于电商运营、产品经理、市场分析人员来说这个技术可以提升分析效率从几天的人工分析缩短到几小时的自动处理发现隐藏洞察自动识别用户关注的产品属性和情感倾向支持数据驱动决策基于真实的用户反馈优化产品和营销策略监控竞品动态系统化分析竞品用户评价知己知彼8.3 下一步学习建议如果你希望进一步深入探索更多Schema模式尝试事件抽取、关系抽取等其他任务结合其他NLP技术将抽取结果输入到情感分析模型进行更深度的分析构建完整分析流水线从数据采集、清洗、分析到可视化报告的全流程自动化优化性能针对大批量数据考虑使用批处理、异步处理等技术提升效率信息抽取技术正在改变我们处理文本数据的方式。从人工阅读到自动分析从模糊感受到量化洞察这种转变不仅能提升工作效率更能帮助我们发现那些容易被忽略的重要信息。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。