Awesome
Python library for Keyword Extraction
키워드 / 연관어 추출을 위한 파이썬 라이브러리 입니다. by Lovit (Hyunjoong) and Hunsik Shin
soykeyword 에서 추출하는 키워드와 연관어는 다음과 같이 정의됩니다. 한 문서 집합의 키워드는 다른 문서 집합과 해당 문서 집합을 구분할 수 있는 질 좋은 단어이며 (구분력, discriminative power), 해당 집합을 잘 설명할 수 있는 (설명력, high coverage) 단어입니다. 빈도수가 낮은 단어는 한 집합에서만 등장할 가능성이 높기 때문에 구분력은 크지만 설명력이 약합니다. 제안된 두 가지 알고리즘은 높은 설명력과 구분력을 동시에 지니는 단어들을 키워드로 선택합니다.
연관어는 기준 단어가 포함된 문서 집합과 포함되지 않은 문서 집합을 구분하는 키워드를 연관어로 정의합니다. 이는 co-occurrence 가 높은 단어라는 의미이기도 합니다. co-occurrence 가 높으면서도 설명력이 좋은 단어를 선택합니다.
Setup
- pip install soykeyword
Requires
- Python >= 3.4 (not tested in Python 2)
- numpy >= 1.12.1
- scikit-learn >= 0.18
- psutil >=5.0.1
Usage
Lasso Regerssion Keyword Extractor
학습은 sparse matrix x 를 extractor 에 입력합니다. index2word 는 word idx 에 대한 단어 list 형식입니다. 이를 train() 에 입력하지 않으면 키워드와 연관어가 단어가 아닌 word idx 로 출력됩니다.
from soykeyword.lasso import LassoKeywordExtractor
lassobased_extractor = LassoKeywordExtractor(min_tf=20, min_df=10)
lassobased_extractor.train(x, index2word) # x: sparse matrix
키워드를 추출할 문서 집합 documents 를 extract_from_docs() 에 입력하면, 해당 문서 집합과 그 외의 문서 집합을 구분하는 keywords 를 추출합니다.
keywords = lassobased_extractor.extract_from_docs(
documents,
min_num_of_keywords=30
)
연관어는 extract_from_word 에 단어를 입력하면 됩니다.
lassobased_extractor.extract_from_word(
'아이오아이',
min_num_of_keywords=30
)
하루 뉴스를 기준으로 '아이오아이'의 연관어를 추출한 예시입니다.
[KeywordScore(word='아이오아이', frequency=270, coefficient=17.850189941320671),
KeywordScore(word='엠카운트다운', frequency=221, coefficient=1.200759338786378),
KeywordScore(word='뮤직', frequency=195, coefficient=1.081777863860977),
KeywordScore(word='일산동구', frequency=36, coefficient=0.98636875892070186),
KeywordScore(word='키미', frequency=297, coefficient=0.70877507721215616),
KeywordScore(word='챔피언', frequency=105, coefficient=0.51940928356916138),
KeywordScore(word='강렬', frequency=352, coefficient=0.36972563098092176),
KeywordScore(word='컴백', frequency=536, coefficient=0.30677481146665397),
KeywordScore(word='화려', frequency=518, coefficient=0.26764304959838653),
KeywordScore(word='수출', frequency=735, coefficient=0.23882691530127598),
KeywordScore(word='걸그룹', frequency=1060, coefficient=0.20972098801573957),
KeywordScore(word='방영', frequency=208, coefficient=0.19694219657704334),
KeywordScore(word='프로듀스101', frequency=96, coefficient=0.17074232136595247),
...
자세한 튜토리얼은 링크에 있습니다.
Proportion based Keyword Extractor
Proportion based 키워드 / 연관어 추출은 두 집합의 단어 출연 확률의 비율을 바탕으로 키워드를 추출합니다. P(w|pos) 는 키워드를 추출할 문서 집합에서의 단어 w 의 출연 비율이며, P(w|neg)는 그 외의 문서 집합에서의 단어 w의 출연 비율 입니다.
score(w) = P(w|pos) / { P(w|pos) + P(w|neg) }
학습 데이터의 형태는 (sparse matrix, index2word) 혹은 텍스트 데이터, 두 종류를 모두 지원합니다.
텍스트 데이터 형식으로 학습을 할 경우에는 min_tf, min_df, tokenize 를 설정해줍니다. 다음의 예시는 default value 입니다.
from soykeyword.proportion import CorpusbasedKeywordExtractor
corpusbased_extractor = CorpusbasedKeywordExtractor(
min_tf=20,
min_df=2,
tokenize=lambda x:x.strip().split(),
verbose=True
)
# docs: list of str like
corpusbased_extractor.train(docs)
키워드를 추출할 문서 집합 documents 를 입력합니다.
keywords = corpusbased_extractor.extract_from_docs(
documents,
min_score=0.8,
min_frequency=100
)
연관어를 추출할 단어 word 를 입력합니다.
keywords = corpusbased_extractor.extract_from_word(
'아이오아이',
min_score=0.8,
min_frequency=100
)
하루의 뉴스를 바탕으로 추출한 아이오아이의 연관어 입니다.
keywords[:10]
[KeywordScore(word='아이오아이', frequency=270, score=1.0),
KeywordScore(word='엠카운트다운', frequency=221, score=0.997897148491129),
KeywordScore(word='펜타곤', frequency=104, score=0.9936420169665052),
KeywordScore(word='잠깐', frequency=162, score=0.9931809154109712),
KeywordScore(word='엠넷', frequency=125, score=0.9910325251765126),
KeywordScore(word='걸크러쉬', frequency=111, score=0.9904705029926091),
KeywordScore(word='타이틀곡', frequency=311, score=0.987384461584851),
KeywordScore(word='코드', frequency=105, score=0.9871835929954923),
KeywordScore(word='본명', frequency=105, score=0.9863934667369743),
KeywordScore(word='엑스', frequency=101, score=0.9852544036088814)]
학습데이터의 형태가 (sparse matrix, index2word) 라면 MatrixbasedKeywordExtractor 를 이용합니다.
from soykeyword.proportion import MatrixbasedKeywordExtractor
matrixbased_extractor = MatrixbasedKeywordExtractor(
min_tf=20,
min_df=2,
verbose=True
)
matrixbased_extractor.train(x, index2word)
자세한 튜토리얼은 링크에 있습니다.
함께 이용하면 좋은 라이브러리들
soynlp
한국어 자연어처리를 위한 미등록단어 문제 해결을 위한 단어 추출 / 단어 추출기의 학습 결과를 이용하는 토크나이저 / 품사 판별 / 정규화 를 지원합니다.
- https://github.com/lovit/soynlp
- pip install soynlp
KoNLPy
KoNLPy 는 한국어 정보처리를 위한 파이썬 패키지입니다. 한나눔, 꼬꼬마, 코모란, MeCab-ko, 트위터 한국어 분석기를 파이썬 환경에서 제공합니다.
- http://konlpy.org
- KoNLPy 는 Java를 이용하기 때문에 Java 와 JPype 가 필요합니다. 홈페이지의 설치법을 반드시 보시기 바랍니다.
customized KoNLPy
KoNLPy 에 등록되지 않은 단어를 손쉽게 처리하기 위하여 템플릿과 사전 기반 string match 를 KoNLPy 와 함께 이용하는 wrapping 파이썬 패키지입니다.
- https://github.com/lovit/customized_konlpy
- pip install customized_konlpy
soyspacing
띄어쓰기 오류가 있을 경우 이를 제거하면 텍스트 분석이 쉬워질 수 있습니다. 분석하려는 데이터를 기반으로 띄어쓰기 엔진을 학습하고, 이를 이용하여 띄어쓰기 오류를 교정합니다.
- https://github.com/lovit/soyspacing
- pip install soyspacing