Skip to content

Instantly share code, notes, and snippets.

@lovit
Created April 30, 2019 05:32
Show Gist options
  • Save lovit/b873e1fbc196e0e8f383414f54b1122e to your computer and use it in GitHub Desktop.
Save lovit/b873e1fbc196e0e8f383414f54b1122e to your computer and use it in GitHub Desktop.
soynlp Noun Tokenizer usage

현재 버전 (0.0.491) 에서는 코드가 정리되지 않아서 init 함수의 argument 이름이 바뀔 수 있습니다.

이 튜토리얼은 github.com/lovit/textmining-dataset 의 데이터셋을 이용한 예시입니다.

import soynlp
from soynlp.utils import DoublespaceLineCorpus
from soynlp.noun import LRNounExtractor_v2
from lovit_textmining_dataset.navernews_10days import get_news_paths

path = get_news_paths(date='2016-10-20')
corpus = DoublespaceLineCorpus(path, iter_sent=True)
noun_extractor = LRNounExtractor_v2()

# noun_scores[noun] = (score, frequency)
noun_scores = noun_extractor.train_extract(corpus)

# noun_scores[noun] = score
noun_scores = {noun:score.score for noun, score in noun_scores.items()}

위의 과정을 통하여 명사를 추출한 다음에, 아래의 토크나이저를 이용하여 명사 부분을 추출하고 있습니다.

NonuLMatchTokenizer 는 띄어쓰기 기준으로 나뉘어진 어절의 왼쪽부분에만 명사가 등장한다는 가정을 한 모델이며, NounMatchTokenizer 는 어절의 왼쪽이 아닌 부분에서 명사가 시작할 수 있다고 가정한 모델입니다.

from soynlp.tokenizer import NounLMatchTokenizer
from soynlp.tokenizer import NounMatchTokenizer

lmatch_tokenizer = NounLMatchTokenizer(nouns = noun_scores)
match_tokenizer = NounMatchTokenizer(noun_scores = noun_scores)

아마도 이후에 두 클래스를 하나로 통일하고, tokenize 함수의 argument 로 두 클래스 기능을 조절하도록 코드를 정리할 것 같습니다. 현재는 아래처럼 이용할 수 있습니다.

for word in '연합뉴스 오늘 날씨'.split():
    print(word, word in noun_scores)
연합뉴스 True
오늘 True
날씨 True
lmatch_tokenizer.tokenize('오늘의 연합뉴스날씨입니다.')
# ['오늘', '연합뉴스날씨']

lmatch_tokenizer.tokenize('오늘의 연합뉴스 날씨입니다.')
# ['오늘', '연합뉴스', '날씨']

lmatch_tokenizer.tokenize('오늘의 연합뉴스날씨입니다.', compose_compound=False)
# ['오늘', '연합뉴스', '날씨']

lmatch_tokenizer.tokenize('오늘의 ㅋ연합뉴스날씨입니다.')
# ['오늘']

match_tokenizer.tokenize('오늘의 ㅋ연합뉴스날씨입니다.')
# ['오늘', '연합뉴스날씨']

match_tokenizer.tokenize('오늘의 ㅋ연합뉴스 날씨입니다.')
# ['오늘', '연합뉴스', '날씨']

match_tokenizer.tokenize('오늘의 ㅋ연합뉴스날씨입니다.', compose_compound=False)
# ['오늘', '연합뉴스', '날씨']
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment