Skip to content
Back to skills

Sentiment Lexicon Builder

ASecurity

감성 사전 구축, ABSA(Aspect-Based Sentiment Analysis) 설계, 감성 점수 보정, 도메인 특화 감성 분석 방법론 가이드. '감성 사전', '감성 분석 모델', 'ABSA', '측면별 감성', '감성 점수', '극성 사전', '도메인 감성', '감정 분류' 등 감성분석 설계 시 이 스킬을 사용한다. sentiment-analyzer의 감성분석 역량을 강화한다. 단, 텍스트 전처리나 보고서 작성은 이 스킬의 범위가 아니다.

  • 1,256 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added May 29, 2026
devopspython

Security analysis

A100/100

Scanned May 29, 2026

npx -y skills add revfactory/harness-100 --skill sentiment-lexicon-builder --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Sentiment Lexicon Builder?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Sentiment Lexicon Builder
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/revfactory-sentiment-lexicon-builder/badge)](https://www.skillsdirectory.com/skills/revfactory-sentiment-lexicon-builder)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: sentiment-lexicon-builder
description: "감성 사전 구축, ABSA(Aspect-Based Sentiment Analysis) 설계, 감성 점수 보정, 도메인 특화 감성 분석 방법론 가이드. '감성 사전', '감성 분석 모델', 'ABSA', '측면별 감성', '감성 점수', '극성 사전', '도메인 감성', '감정 분류' 등 감성분석 설계 시 이 스킬을 사용한다. sentiment-analyzer의 감성분석 역량을 강화한다. 단, 텍스트 전처리나 보고서 작성은 이 스킬의 범위가 아니다."
---

# Sentiment Lexicon Builder — 감성 사전 및 ABSA 설계 가이드

도메인 특화 감성 분석 시스템을 설계하고 구축하는 방법론.

## 감성 분석 접근법 비교

| 접근법 | 장점 | 단점 | 적합 |
|--------|------|------|------|
| 사전 기반 | 빠름, 해석 가능 | 도메인 한계, 문맥 무시 | 소규모, 빠른 프로토타입 |
| ML 기반 (전통) | 도메인 적응 | 학습 데이터 필요 | 레이블 데이터 있을 때 |
| 딥러닝 (BERT) | 문맥 이해, 높은 정확도 | 리소스 필요 | 대규모, 정확도 중시 |
| LLM (프롬프트) | 제로샷, 유연 | 비용, 속도 | 다양한 도메인, 소량 |

## 감성 사전 구축

### 한국어 기본 사전

```python
SENTIMENT_LEXICON = {
    # 긍정 (1.0 ~ 0.1)
    "좋다": 0.8, "훌륭하다": 0.9, "만족": 0.7, "추천": 0.8,
    "편리하다": 0.7, "깔끔하다": 0.6, "최고": 0.9, "친절하다": 0.8,
    "빠르다": 0.6, "저렴하다": 0.5,

    # 부정 (-0.1 ~ -1.0)
    "나쁘다": -0.8, "불만": -0.7, "실망": -0.8, "느리다": -0.6,
    "비싸다": -0.5, "불편하다": -0.7, "최악": -0.9, "불친절": -0.8,
    "고장": -0.7, "환불": -0.6,

    # 강도 수정자
    "매우": 1.5,    # 강화
    "약간": 0.5,    # 약화
    "정말": 1.5,
    "조금": 0.5,
    "너무": 1.3,    # 문맥 따라 긍/부정 모두
}

NEGATION_WORDS = {"않다", "않", "못", "없다", "없", "안"}
```

### 도메인 특화 사전 자동 구축

```python
def build_domain_lexicon(corpus, labels, base_lexicon, top_n=200):
    """
    TF-IDF + PMI 기반 도메인 감성 사전 자동 구축

    1. 긍정/부정 리뷰에서 각각 TF-IDF 상위 단어 추출
    2. PMI(Pointwise Mutual Information)로 감성 극성 계산
    3. 기존 사전과 병합
    """
    pos_texts = [t for t, l in zip(corpus, labels) if l == 'positive']
    neg_texts = [t for t, l in zip(corpus, labels) if l == 'negative']

    # 각 클래스에서의 출현 확률
    for word in vocabulary:
        p_word = count(word, corpus) / len(corpus)
        p_pos = count(word, pos_texts) / len(pos_texts)
        p_neg = count(word, neg_texts) / len(neg_texts)

        pmi_pos = log2(p_pos / p_word) if p_pos > 0 else 0
        pmi_neg = log2(p_neg / p_word) if p_neg > 0 else 0

        polarity = pmi_pos - pmi_neg  # 양수=긍정, 음수=부정

    return domain_lexicon
```

## ABSA (Aspect-Based Sentiment Analysis)

### 설계 구조

```
입력: "배송은 빠른데 제품 품질이 별로예요"

1. 측면(Aspect) 추출:
   - "배송" → [배송/서비스]
   - "품질" → [제품/품질]

2. 측면별 감성 분석:
   - 배송: "빠른" → 긍정 (0.6)
   - 품질: "별로" → 부정 (-0.7)

3. 결과:
   {
     "overall": -0.05,
     "aspects": {
       "배송": {"sentiment": "positive", "score": 0.6, "keywords": ["빠른"]},
       "품질": {"sentiment": "negative", "score": -0.7, "keywords": ["별로"]}
     }
   }
```

### 측면 카테고리 설계 (이커머스 예시)

```yaml
aspects:
  제품:
    품질: [품질, 퀄리티, 소재, 재질, 마감, 내구성]
    디자인: [디자인, 색상, 색깔, 모양, 외관]
    사이즈: [사이즈, 크기, 사이즈감, 피팅]
    가격: [가격, 가성비, 비싸, 저렴, 합리적]
  서비스:
    배송: [배송, 택배, 도착, 배달]
    포장: [포장, 박스, 패키지]
    교환환불: [교환, 환불, 반품, AS]
    고객응대: [응대, 상담, 친절, 불친절]
```

## 감성 점수 보정

### 부정어 처리

```python
def handle_negation(tokens, scores):
    """부정어 뒤 3토큰 이내 감성 반전"""
    negation_window = 0
    adjusted = []
    for token, score in zip(tokens, scores):
        if token in NEGATION_WORDS:
            negation_window = 3
        elif negation_window > 0:
            score = -score * 0.8  # 완전 반전이 아닌 80% 반전
            negation_window -= 1
        adjusted.append(score)
    return adjusted
```

### 강도 수정자 처리

```python
def apply_intensifiers(tokens, scores):
    """강도 수정자에 따른 점수 조정"""
    adjusted = []
    for i, (token, score) in enumerate(zip(tokens, scores)):
        if i > 0 and tokens[i-1] in INTENSIFIERS:
            score *= INTENSIFIERS[tokens[i-1]]
        adjusted.append(score)
    return adjusted
```

### 이모지 감성 매핑

```python
EMOJI_SENTIMENT = {
    "😊": 0.8, "😍": 0.9, "👍": 0.7, "❤️": 0.8, "🙏": 0.5,
    "😡": -0.9, "😤": -0.7, "👎": -0.8, "😢": -0.6, "💔": -0.7,
    "😐": 0.0, "🤔": -0.1,
}
```

## 감성 분석 평가 메트릭

```python
# 감성 분류 평가
from sklearn.metrics import classification_report

print(classification_report(y_true, y_pred,
    target_names=['부정', '중립', '긍정']))

# ABSA 평가
# - 측면 추출: Precision, Recall, F1
# - 측면별 감성: Accuracy, Macro-F1
# - 전체: Micro-F1 (측면추출 + 감성 모두 정확해야 정답)
```

## 보고서 구조

```markdown
## 감성 분석 결과

### 전체 요약
| 극성 | 건수 | 비율 |
|------|------|------|
| 긍정 | 650 | 65% |
| 중립 | 150 | 15% |
| 부정 | 200 | 20% |

### 측면별 감성
| 측면 | 긍정 | 부정 | 점수 | 주요 키워드 |
|------|------|------|------|-----------|
| 배송 | 80% | 10% | +0.6 | 빠른, 정확 |
| 품질 | 40% | 45% | -0.2 | 별로, 약함 |

### 시계열 추이
### 주요 부정 패턴 (액션 아이템)
```

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.