soynlp

jaeha_lee·2023년 5월 3일
0

kkma나 Okt의 경우 사전 기반의 단어 처리 --> 미등록 단어가 나왔을 경우 문제가 발생할 수 있음

이러한 문제점을 해결할 수 있는 라이브러리가 soynlp
: 학습 데이터 내 자주 발생하는 패턴을 기반으로 단어의 경계선을 구분함

soynlp 사용 전제 조건

  • 단어는 연속으로 등장하는 글자의 조합, 글자 간 연관성이 높다
  • 한국어의 어절을 좌/우 구조로 2등분 할 수 있다
  • 좌/우 구조는 보통 (좌 : 의미적 기능 | 우 : 문법적 기능을 담당한다.)

DoublespaceLineCorpus

from soynlp.utils import DoublespaceLineCorpus

# 말 뭉치 -> 문서 단위로 분리 + 다수의 문서로 분리
# 문서 단위 말뭉치 생성 
corpus = DoublespaceLineCorpus("data.txt")
"""
DoublespaceLineCorpus는 soyNLP에서 제공하는 Corpus 중 하나입니다. 이 Corpus는 한 줄씩 띄어쓰기가 두 번 들어간 텍스트 파일을 처리하기 위한 클래스입니다.

보통 한 줄씩 띄어쓰기가 두 번 들어간 텍스트 파일은 예를 들어 한국어 위키피디아 덤프 파일 등에서 볼 수 있습니다. 이러한 파일을 읽어들이기 위해서는 일반적인 TextCorpus 클래스로는 제대로 처리하지 못하는 경우가 있습니다.

하지만 DoublespaceLineCorpus는 이러한 파일을 제대로 처리할 수 있도록 구현된 클래스입니다. 이 클래스는 각 줄마다 띄어쓰기를 제거하고, 빈 줄은 건너뛰어 처리합니다. 또한, 파일의 각 줄을 generator 형태로 반환하여 메모리 사용량을 줄이면서 파일을 처리할 수 있도록 구현되어 있습니다.



예를 들어, 아래와 같은 텍스트 파일이 있다고 가정해봅시다.

Copy code
첫 번째 줄의 내용

두 번째 줄의 내용


세 번째 줄의 내용
위 파일을 DoublespaceLineCorpus로 읽어들이면, 아래와 같은 generator가 반환됩니다.

python
Copy code
['첫 번째 줄의 내용', '두 번째 줄의 내용', '세 번째 줄의 내용']

"""

LRNounExtractor_v2

LRNounExtractor_v2는 soyNLP에서 제공하는 명사 추출기(Noun Extractor) 중 하나입니다.

이 추출기는 L-Tokenizer와 R-Tokenizer, 그리고 L-R Graph를 사용하여 명사를 추출합니다. L-Tokenizer는 왼쪽부터 읽어들이는 형태소 분석기(Tokenization)이며, R-Tokenizer는 오른쪽부터 읽어들이는 형태소 분석기입니다. 이 두 Tokenizer를 이용하여 토큰들을 생성하고, 이를 바탕으로 L-R Graph를 만듭니다. L-R Graph는 토큰들 간의 연관성을 나타내는 그래프로, 이를 이용하여 명사를 추출합니다.

LRNounExtractor_v2는 LRNounExtractor에서 성능 개선을 위해 개발된 버전입니다. 이전 버전과 달리 L-Tokenizer와 R-Tokenizer의 빈도 정보를 이용하여 보다 정확하게 명사를 추출합니다. 또한, 이전 버전에서는 추출된 명사가 한 글자인 경우에도 반환했지만, LRNounExtractor_v2는 한 글자 명사를 추출하지 않습니다.

LRNounExtractor_v2는 soyNLP의 Pipeline에서 사용될 수 있습니다. 예를 들어, 아래와 같이 사용할 수 있습니다.

from soy.nlp.pipeline import Pipeline
from soy.nlp.hangle import compose, decompose
from soy.nlp.tokenizer import LTokenizer
from soy.nlp.word import WordExtractor
from soy.nlp.pos import Dictionary
from soy.nlp.noun import LRNounExtractor_v2

pipeline = Pipeline([
    compose,
    WordExtractor(min_frequency=5),
    Dictionary(total_words=None, min_frequency=0),
    LRNounExtractor_v2(verbose=False)
])

corpus = ['영화 나쁜 녀석들: 더 무비를 봤어요. 이 영화는 엄청 재밌었어요.', '책방에서 책을 구매하였습니다.']
sents = [s.split() for s in corpus]
sents = [[w for w in sent if len(w) > 1] for sent in sents]

nouns = pipeline(sents)

print(nouns)

위 예제에서는 LTokenizer를 사용하여 한글 자모 분리를 수행한 후, WordExtractor와 Dictionary를 이용하여 단어를 추출하고, 추출된 단어를 이용하여 LRNounExtractor_v2를 수행합니다. 이를 통해 두 개의 문장에서 추출된 명사들이 반환됩니다.

0개의 댓글