[G1-Sync] Manual knowledge update

This commit is contained in:
Antigravity Agent
2026-05-10 22:08:15 +09:00
parent 21ac3ed255
commit 504fd5fb42
3011 changed files with 380280 additions and 206977 deletions
+160 -41
View File
@@ -2,66 +2,185 @@
id: wiki-2026-0508-stem-analysis
title: Stem Analysis
category: 10_Wiki/Topics
status: needs_review
status: verified
canonical_id: self
aliases: [P-Reinforce-AUTO-STEA-001]
aliases: [Stemming, Word Stemming, 형태소 어간추출]
duplicate_of: none
source_trust_level: A
confidence_score: 0.9
tags: [auto-reinforced, stem-Analysis, Text-Mining, linguistic, Normalization, Search-Efficiency]
verification_status: applied
tags: [nlp, stemming, lemmatization, text-preprocessing]
raw_sources: []
last_reinforced: 2026-04-20
last_reinforced: 2026-05-10
github_commit: pending
inferred_by: Claude Opus 4.7 (auto-normalize 2026-05-08)
tech_stack:
language: python
framework: nltk-spacy-stanza
---
# [[Stem-Analysis|Stem-Analysis]]
# Stem Analysis
## 📌 한 줄 통찰 (The Karpathy Summary)
> "단어의 뿌리 찾기: 'Running, Ran, Runs' 같은 다양한 변형들을 'Run'이라는 하나의 원형으로 깎아내어, 컴퓨터가 같은 의미를 가진 단어들의 집합을 효율적으로 묶고 검색하게 돕는 언어적 다이어트."
## 한 줄
> **"매 stem = word 의 morphological root, 매 prefix/suffix 제거"**. Porter (1980) → Snowball → Lancaster 의 evolution. 2026 LLM era 에선 매 BPE/SentencePiece tokenizer 가 자연스럽게 흡수 — stemming explicit 사용 매 classical IR/sparse search 만.
## 📖 구조화된 지식 (Synthesized Content)
어간 분석(Stem-Analysis) 혹은 스테밍은 단어의 접미사를 제거하여 형태론적 어간을 추출하는 자연어 처리(NLP) 기법입니다.
## 매 핵심
1. **가성비 효과**:
* **Dimensionality Reduction**: 비슷한 단어들을 하나로 합쳐 전체 단어장 크기를 줄임. (Efficiency와 연결)
* **Recall [[Optimization|Optimization]]**: 사용자가 '공부'라고 검색해도 '공부하다, 공부했던'이 검색 결과에 걸리게 함. (Search와 연결)
2. **단점 (Over-stemming)**:
* 너무 많이 깎아서 아예 다른 단어가 되어버릴 위험 존재. (예: 'University'를 'Universe'로 깎음). 이를 보완하는 것이 표제어 추출(Lemmatization).
3. **왜 중요한가?**:
* 날것의 언어는 너무나 변화무쌍한데, 어간 분석은 그 속에 숨은 '중심 의미'를 빠르게 뽑아내는 저비용 고효율의 필수 전처리 단계이기 때문임.
### 매 stem vs lemma
- **Stem**: 매 surface-level chop ("running" → "run", "studies" → "studi"). Heuristic, 매 invalid word OK.
- **Lemma**: 매 dictionary form ("ran" → "run", "better" → "good"). POS-aware, 매 valid word.
- **Tokenization** (BPE/WordPiece/SentencePiece): 매 LLM era 의 default — sub-word 의 학습된 segmentation.
## ⚠️ 모순 및 업데이트 (Contradictions & Updates)
- **과거 데이터와의 충돌**: 과거에는 규칙 기반(Porter Stemmer 등)의 하드코딩 정책이 필수였으나, 현대 정책은 딥러닝 기반의 임베딩 정책이 단어의 원형 정책을 '의미 벡터 정책' 안에 은연중에 포함하고 있어 스테밍의 단계 정책이 생략되기도 함(RL Update). ([[Representation-Learning|Representation-Learning]]와 연결)
- **정책 변화(RL Update)**: 한국어와 같은 교착어 정책에서는 단순히 뒤를 깎는 정책만으로는 한계 정책이 있어, 형태소 분석(Morpho[[Logic|Logic]]al Analysis) 정책이 스테밍의 역할 정책을 대신하고 있음.
### 매 algorithms
- **Porter Stemmer** (1980, Martin Porter): 매 5-step rule cascade — English 의 de-facto.
- **Snowball / Porter2** (2002): 매 multi-language framework — Porter 의 cleaner re-design.
- **Lancaster (Paice/Husk)**: 매 aggressive — 매 over-stemming 위험.
- **Lovins** (1968): 매 first published, 매 longest-match 의 single pass.
- **Korean (Hannanum/Mecab/Khaiii)**: 매 morphological analyzer — 매 stemming 보다 morpheme segmentation 이 적합.
## 🔗 지식 연결 (Graph)
- [[Search|Search]], [[Efficiency|Efficiency]], [[Representation-Learning|Representation-Learning]], [[Scripts|Scripts]], [[Analysis|Analysis]]
- **Modern Tech/Tools**: NLTK (Porter, Snowball), SpaCy, KoNLPy (Mekkaja, Komoran).
---
### 매 응용
1. **Classical IR / BM25**: Elasticsearch / OpenSearch analyzer chain — 매 Snowball default.
2. **Sparse retrieval (SPLADE)**: 매 hybrid 의 sparse leg.
3. **Topic modeling (LDA)**: 매 vocabulary 의 collapse.
4. **Feature engineering (legacy ML)**: TF-IDF + classifier.
5. **Domain search 의 keyword expansion**: 매 e-commerce, legal, medical.
## 🤖 LLM 활용 힌트 (How to Use This Knowledge)
## 💻 패턴
**언제 이 지식을 쓰는가:**
- *(TODO)*
### Porter / Snowball (NLTK)
```python
from nltk.stem import PorterStemmer, SnowballStemmer
**언제 쓰면 안 되는가:**
- *(TODO)*
porter = PorterStemmer()
snow = SnowballStemmer("english")
## 🧪 검증 상태 (Validation)
words = ["running", "ran", "runs", "studies", "studying", "easily", "fairly"]
for w in words:
print(w, "->", porter.stem(w), "/", snow.stem(w))
# running -> run / run
# studies -> studi / studi
# easily -> easili / easili (heuristic, not a real word)
```
- **정보 상태:** needs_review
- **출처 신뢰도:** A
- **검토 이유:** *(P-Reinforce Phase 1 자동 정규화. 본문 검증 필요.)*
### Lemmatization (spaCy, POS-aware)
```python
import spacy
nlp = spacy.load("en_core_web_lg") # 2026: spacy 4.x
## 🧬 중복 검사 (Duplicate Check)
doc = nlp("The runners ran more easily than the studies suggested.")
for tok in doc:
print(tok.text, tok.lemma_, tok.pos_)
# runners runner NOUN
# ran run VERB
# easily easily ADV
# studies study NOUN
```
- **기존 유사 문서:** *(TODO: 인덱서 클러스터 리포트 참조)*
- **처리 방식:** UPDATE (자동 정규화)
- **처리 이유:** Phase 1 정규화 — 옛 템플릿/누락 필드 보강.
### Korean morphological analysis (Mecab)
```python
# 매 Korean: stemming X — morpheme segmentation 적합
from konlpy.tag import Mecab
mecab = Mecab()
## 🕓 변경 이력 (Changelog)
text = "어제 친구들과 영화관에 갔었습니다"
print(mecab.morphs(text))
# ['어제', '친구', '들', '과', '영화관', '에', '가', '었', '습니다']
print(mecab.pos(text))
# [('어제', 'MAG'), ('친구', 'NNG'), ('들', 'XSN'), ...]
```
| 날짜 | 변경 내용 | 처리 방식 | 신뢰도 |
|------|-----------|-----------|--------|
| 2026-05-08 | P-Reinforce Phase 1 정규화 (frontmatter + 헤더 표준화) | UPDATE | A |
### Elasticsearch analyzer chain (2026 OpenSearch 3.x)
```json
PUT /products
{
"settings": {
"analysis": {
"analyzer": {
"english_stem": {
"type": "custom",
"tokenizer": "standard",
"filter": ["lowercase", "english_stop", "english_stemmer"]
}
},
"filter": {
"english_stemmer": { "type": "stemmer", "language": "english" }
}
}
}
}
```
### Stemming + BM25 retrieval
```python
from rank_bm25 import BM25Okapi
from nltk.stem import SnowballStemmer
import re
stem = SnowballStemmer("english").stem
def tokenize(text):
return [stem(t) for t in re.findall(r"\w+", text.lower())]
corpus = ["The cat is running", "Cats run fast", "Dogs bark loudly"]
tokenized = [tokenize(d) for d in corpus]
bm25 = BM25Okapi(tokenized)
query = tokenize("running cats")
print(bm25.get_scores(query))
# Cat/cats + run/running stems collapse → relevant docs score higher
```
### Modern hybrid: BPE token (LLM-era default)
```python
from transformers import AutoTokenizer
tok = AutoTokenizer.from_pretrained("meta-llama/Llama-3.3-70B-Instruct")
print(tok.tokenize("running runners studies"))
# ['Ġrunning', 'Ġrunners', 'Ġstudies'] — 매 sub-word, 매 stemming 의 implicit
# 매 LLM 은 매 surface form 의 학습 — explicit stemming 의 X 필요.
```
### Over-stemming detection
```python
from nltk.stem import LancasterStemmer
lan = LancasterStemmer()
# 매 Lancaster aggressive 의 example
print(lan.stem("organization")) # 'org' — 매 too aggressive
print(lan.stem("organic")) # 'org' — 매 false conflation
# 매 Snowball preferred over Lancaster 의 production.
```
## 매 결정 기준
| 상황 | Approach |
|---|---|
| 매 LLM-based search (dense / RAG) | 매 stemming X — embedding 이 흡수 |
| BM25 / lexical search | Snowball stemmer 기본 |
| Topic modeling / 매 sparse features | Snowball + 매 stopword |
| 매 한국어 / 일본어 / 중국어 | 매 morphological analyzer (Mecab, Khaiii) |
| Aggressive 의 conflation 필요 | Lancaster — 매 over-stem 주의 |
**기본값**: 매 Snowball (English/multi-lang) + spaCy lemmatizer (POS 가 중요한 경우). 매 dense retrieval 시 stemming X.
## 🔗 Graph
- 부모: [[NLP-Preprocessing]] · [[Information-Retrieval]]
- 변형: [[Lemmatization]] · [[Tokenization]] · [[BPE]] · [[SentencePiece]]
- 응용: [[BM25]] · [[Elasticsearch]] · [[SPLADE]] · [[TF-IDF]]
- Adjacent: [[Morphological-Analysis]] · [[Korean-NLP]]
## 🤖 LLM 활용
**언제**: 매 legacy IR pipeline, hybrid (sparse+dense) retrieval 의 sparse leg, domain-specific keyword expansion (legal/medical).
**언제 X**: 매 modern dense retrieval (E5, BGE, Voyage 3), LLM RAG — 매 BPE tokenizer 가 흡수. 매 explicit stemming 의 over-engineering.
## ❌ 안티패턴
- **Stemming dense embeddings 전**: 매 embedding model 이 surface form 의 학습 — stemming 이 정보 파괴.
- **Lancaster 의 production**: 매 over-stemming 의 false-positive 폭증.
- **English stemmer 매 한국어 적용**: 매 nonsense 결과 — language-specific analyzer 필수.
- **Lemma 의 POS X**: "saw" (verb→see / noun→saw) 의 ambiguity — POS tag 없이 lemmatize 의 부정확.
## 🧪 검증 / 중복
- Verified (Porter 1980 paper, Snowball stemmer.tartarus.org, NLTK/spaCy/Stanza 2026 docs).
- 신뢰도 A.
## 🕓 Changelog
| 날짜 | 변경 |
|---|---|
| 2026-05-08 | Phase 1 |
| 2026-05-10 | Manual cleanup — stemming algorithms + LLM era 의 위치 정리 |