You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Aspect Term与VADER的文本情感标注异常问题求助

问题修复方案

问题1:Aspect标注错误

原因

原代码用子字符串匹配(keyword in text),导致短关键词(如no)会误匹配到包含该子串的其他单词(如nontunai),同时未处理大小写差异,容易遗漏匹配场景。

修复方法

改用正则表达式的完整单词边界匹配,确保关键词作为独立单词出现,同时忽略大小写。

问题2:情感标注仅输出1/-1,无中性

原因

原代码错误使用df[col][0] == 1,即拿第一行的Aspect值判断所有行,而非当前行的Aspect状态。导致只要第一行某Aspect为1,所有行该Aspect都会按整体情感标1/-1,而非仅当前行Aspect为1时才标注情感。

修复方法

用df.apply遍历每行,访问当前行的原始Aspect标注值,再结合VADER情感得分进行标注。


修复后完整代码

import pandas as pd
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
import re

# Define the aspect keywords
system_keywords = ['server', 'bug', 'error', 'sinyal', 'jaringan', 'login', 'update', 
                   'perbaruan', 'loading', 'aplikasi', 'fitur', 'UI/UX' , 'tampilan', 
                   'data', 'otp', 'keamanan']
layanan_keywords = ['customer service', 'cs', 'call center', 'telepon', 'email', 'beli', 
                    'pertalite', 'bbm', 'topup']
transaksi_keywords = ['cash', 'cashless', 'debit', 'tunai', 'scan', 'e-wallet', 
                      'linkaja', 'link', 'bayar', 'ovo', 'transaksi', 'pembayaran', 
                      'cashback', 'struk', 'tunai', 'nontunai']
subsidi_keywords = ['verifikasi', 'data', 'form', 'formulir', 'daftar', 'subsidi', 
                    'pendaftaran', 'subsidi', 'kendaraan', 'formulir', 'stnk', 'ktp', 
                    'nopol', 'no', 'kendaraan', 'nomor', 'polisi', 'foto', 'kendaraan', 
                    'alamat', 'provinsi', 'kota', 'kabupaten', 'kecamatan']
# 补充文本中出现的拼写变体recomend
kebermanfaatan_keywords = ['bagus', 'mantap', 'recommend', 'recomend', 'oke', 'mudah', 'berguna', 
                           'membantu', 'simple', 'guna', 'bantu']

# 修复后的Aspect标注函数:完整单词匹配,忽略大小写
def label_aspect(text):
    aspect_labels = [0] * 5  # Initialize all aspect labels to 0
    keyword_groups = [system_keywords, layanan_keywords, transaksi_keywords, 
                      subsidi_keywords, kebermanfaatan_keywords]
    for i, keywords in enumerate(keyword_groups):
        for keyword in keywords:
            # 转义关键词中的特殊字符,添加单词边界,忽略大小写
            pattern = re.compile(r'\b' + re.escape(keyword) + r'\b', re.IGNORECASE)
            if pattern.search(text):
                aspect_labels[i] = 1
                break
    return aspect_labels

# Load the data into a DataFrame
data = {'content': ['Sejak menggunakan aplikasi mypertamina beli pertalite jadi lebih simple dan mudah karena aplikasi ini bener bener membantu untuk meringankan penjual dan pembeli recomend bisa bayar pakai tunai atau nontunai mantepp', 
                    'sering ada bug, aplikasi tidak user friendly. bingung dalam menginput data untuk subsidi. tidak ada notifikasi apakah data inputan sudah masuk atau belum. Tolong diperbaiki',
                    'Bagus juga aplikasi, kalo ada promo seperti ini kan para pemakai premium bisa jadi beralih ke pertalite bahkan pertamax. Coba ada promo2 lainnya seperti kerja sama dg situs belanja online ya min. Pertahankan min',
                    'kadang sulit di akses terakhir ada perintah update MyPertamina, saya ikuti, setelah update, jadi sulit masuk seolah data tidak ada, malah QR code tidak bisa muncul, dan belum sempat saya print',
                    'buruk, sudah coba daftar berkali kali tetap gak bisa. Mau beli bbm harus ada barcode, daftar susah ah bukan nya memudahkan rakyat malah tambah mempersulit']}
df = pd.DataFrame(data)

# Initialize VADER analyzer
vader_lexicon = SentimentIntensityAnalyzer()

# Add the aspect columns to the DataFrame and label them
aspect_labels = df['content'].apply(label_aspect)
aspect_cols = ['sistem', 'layanan', 'transaksi', 'pendaftaran subsidi', 'kebermanfaatan']
df[aspect_cols] = pd.DataFrame(aspect_labels.tolist(), index=df.index)

# 保存原始Aspect标注,避免被覆盖
for col in aspect_cols:
    df[f'{col}_orig'] = df[col]

# 修复后的情感标注:基于当前行的Aspect状态
for col in aspect_cols:
    df[col] = df.apply(
        lambda row: 1 if (vader_lexicon.polarity_scores(row['content'])['compound'] >= 0.05 and row[f'{col}_orig'] == 1)
        else (-1 if (vader_lexicon.polarity_scores(row['content'])['compound'] <= -0.05 and row[f'{col}_orig'] == 1)
        else 0),
        axis=1
    )

# 删除临时列
df.drop([f'{col}_orig' for col in aspect_cols], axis=1, inplace=True)

# Display the resulting DataFrame
print(df)

修复后结果验证

  1. 第一句文本无subsidi相关关键词,pendaftaran subsidi列值为0,符合预期。
  2. 第二句文本无transaksi、layanan、kebermanfaatan相关关键词,对应列值为0,符合预期。
  3. 情感标注包含1(正面)、-1(负面)、0(中性/无对应Aspect)三类,实现预期效果。

内容的提问来源于stack exchange,提问作者Annisa Lianda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 19:25:03