NLP处理:评论分句时保留原评论关联评分的实现方法
实现方案
你当前的核心问题是分句阶段仅存储了句子文本本身,没有同步保留句子和原评论的映射关系,导致后续无法关联原评论的Rank评分。以下是两种可落地的实现方式:
方案1:分句阶段同步写入关联字段(推荐)
从数据处理源头避免映射丢失,遍历原评论DataFrame时,同步记录每个拆分句子对应的原评论评分、原评论索引等字段,直接生成带完整关联关系的句子级DataFrame。
注:你原有的spacy分句代码存在语法错误,nlp()调用缺少右括号,以下代码已一并修复
import spacy from textblob import TextBlob import pandas as pd nlp = spacy.load("en_core_web_sm") sentence_records = [] # 遍历原评论表每一行 for row_idx, row in low_reviews.iterrows(): review_content = row["Review_Text"] review_rank = row["Rank"] # 替换为你表中存储整体评分的实际列名 doc = nlp(review_content) for sent in doc.sents: sent_text = sent.text.strip() if not sent_text: continue # 过滤拆分产生的空字符串 # 计算当前句子情感分 sent_polarity = TextBlob(sent_text).sentiment.polarity # 存储全量关联字段 sentence_records.append({ "source_review_id": row_idx, "sentence_content": sent_text, "sentiment_score": sent_polarity, "original_rank": review_rank }) # 直接转换为句子级DataFrame,所有字段自动对齐 sentence_level_df = pd.DataFrame(sentence_records)
这种方式生成的结果不会出现映射错位,后续可以直接通过source_review_id溯源到任意句子对应的原评论内容。
方案2:为已生成的句子表补全Rank字段
如果你已经跑完分句和情感计算流程,不想重新跑全量数据,可以按照和之前完全一致的分句逻辑,统计每条原评论拆分出的有效句子数量,按顺序为现有句子表匹配对应Rank:
# 统计每条原评论拆分出的有效句子数,分句/过滤逻辑必须和之前完全一致 sentence_num_per_review = [] for text in low_reviews["Review_Text"]: doc = nlp(text) valid_sent_count = len([s for s in doc.sents if s.text.strip()]) sentence_num_per_review.append(valid_sent_count) # 按句子数量生成对应长度的Rank列表,顺序和原表完全一致 matched_ranks = [] for rank, sent_count in zip(low_reviews["Rank"], sentence_num_per_review): matched_ranks += [rank] * sent_count # 将匹配好的Rank列写入现有句子表 your_existing_sentence_df["original_rank"] = matched_ranks
风险提示:该方案要求两次分句的逻辑100%一致,包括空值过滤、文本预处理规则等,否则会出现Rank和句子错位的问题,仅作为临时补数方案使用。
后续分析参考
拿到关联好的句子表后,按原评论ID分组聚合,即可快速计算每条评论的句子情感加权均值,和原评分做比对分析:
# 示例:计算每条评论的句子平均情感分 review_agg_result = sentence_level_df.groupby("source_review_id").agg( avg_sentiment = ("sentiment_score", "mean"), original_rank = ("original_rank", "first") ).reset_index()
内容的提问来源于stack exchange,提问作者Varunnayak
相关产品推荐
相关产品推荐

