현재 버전 (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)
# ['오늘', '연합뉴스', '날씨']