如何在用户评论分析程序中处理否定词,排除带否定修饰的目标词汇?
解决评论中否定场景的统计问题
先指出原代码的两个核心问题:
- 仅处理了单条评论(
df['review_text'].loc[i]中的i未定义,且未遍历所有行) - 未覆盖"not cheap"、"never cheap"这类否定修饰的场景
以下是优化后的完整解决方案:
步骤1:准备分词器
确保nltk的分词资源已下载,避免运行报错:
import nltk nltk.download('punkt')
步骤2:优化文本处理函数
简化分词逻辑,同时处理空评论/缺失值:
import pandas as pd import nltk def get_review_words(review): # 处理空评论或缺失值,防止分词报错 if pd.isna(review): return [] # 分词并统一转小写 return [word.lower() for word in nltk.word_tokenize(review)]
步骤3:定义否定词与判断逻辑
覆盖常见否定词(含缩写形式),检查目标词是否被否定修饰:
# 常见否定词集合,可根据实际评论风格补充 negation_words = {'not', 'never', 'no', 'none', 'hardly', 'scarcely', 'barely', 'don\'t', 'didn\'t', 'wasn\'t', 'isn\'t', 'haven\'t', 'hasn\'t'} def is_positive_mention(review_words, target_word='cheap'): # 目标词未出现,直接返回False if target_word not in review_words: return False # 找到所有目标词的出现位置 target_indices = [idx for idx, word in enumerate(review_words) if word == target_word] for idx in target_indices: # 检查目标词前1-2个词是否有否定词(覆盖直接否定场景) start_pos = max(0, idx - 2) for i in range(start_pos, idx): if review_words[i] in negation_words: # 发现否定修饰,该评论不计入统计 return False # 所有目标词均未被否定,返回True return True
步骤4:遍历所有评论统计数量
修正原代码单条评论的问题,遍历整个数据集:
# 读取数据 df = pd.read_csv("lastFile3.csv", sep=',') # 初始化统计变量 x = 0 # 逐条处理评论 for review in df['review_text']: review_words = get_review_words(review) if is_positive_mention(review_words): x += 1 # 大数据量可改用更高效的apply方式: # df['valid_mention'] = df['review_text'].apply(lambda r: is_positive_mention(get_review_words(r))) # x = df['valid_mention'].sum() print(f"符合条件的评论数:{x}")
关键说明
- 否定词范围:检查目标词前1-2个词是平衡准确性与复杂度的方案,既覆盖"not cheap"这类直接否定,又不会误判距离过远的无关否定(比如"I don't like the color, but it's cheap"不会被错误排除)。若需更精准,可引入句法分析,但会大幅提升复杂度。
- 扩展性:可根据评论的语言习惯,在
negation_words中补充更多否定词(如"rarely"、"seldom"等)。
内容的提问来源于stack exchange,提问作者mohamad jumaa
相关产品推荐
相关产品推荐

