본문 바로가기
Study/NLP

한국어 띄어쓰기 모델

by GodKim 2023. 11. 16.
수업 때 실수?로 교수님 질문에 대한 답을 해버려서 떠맡게 된 한국어 띄어쓰기 모델들 소개이다.
아는 것을 공유하는 것은 좋지만 발표까지 맡게될 줄은 전혀 몰랐다...
이 기회에 안그래도 필요했던 띄어쓰기 모델들을 정리해보자.

1. 한국어에서 띄어쓰기란?

 

- 한국어 어문 규범에서의 띄어쓰기

제2항 문장의 각 단어는 띄어 씀을 원칙으로 한다.

국어에서 단어를 단위로 띄어쓰기를 하는 것은 단어가 독립적으로 쓰이는 말의 최소 단위이기 때문이다. ‘동생 밥 먹는다’에서 ‘동생’, ‘밥’, ‘먹는다’는 각각이 단어이므로 띄어쓰기의 단위가 되어 ‘동생 밥 먹는다’로 띄어 쓴다. 그런데 단어 가운데 조사는 독립성이 없어서 다른 단어와는 달리 앞말에 붙여 쓴다. ‘동생이 밥을 먹는다’에서 ‘이’, ‘을’은 조사이므로 ‘동생이’, ‘밥을’과 같이 언제나 앞말에 붙여 쓴다.

세부 규정
제5장 띄어쓰기
제1절 조사
제41항 조사는 그 앞말에 붙여 쓴다.
    ex) 꽃 / 꽃마저 / 꽃밖에 / 꽃에서부터


제42항 의존 명사는 띄어 쓴다.
    ex) 아는 이 힘이다. / 나도 할 있다. / 먹을 만큼 먹어라.


제43항 단위를 나타내는 명사는 띄어 쓴다.
    ex) 한 / 차 한 / 신 두 켤레


제44항 수를 적을 적에는 '만(萬)' 단위로 띄어 쓴다.
    ex) 십이억 삽천사백오십육만 칠천팔백구십팔


제45항 두 말을 이어 주거나 열거할 적에 쓰이는 다음의 말들은 띄어 쓴다.
    ex) 국장  과장 / 열 내지 스물 / 책상, 걸상 이 있다


제46항 단음절로 된 단어가 연이어 나타날 적에는 붙여 쓸 수 있다.
    ex) 좀더 큰것 / 이말 저말 / 한잎 두잎

제3절 보조 용언
제47항 보조 용언은 띄어 씀을 원칙으로 하되, 경우에 따라 붙여 씀도 허용한다.
    ex) 원칙 : 불이 꺼져 간다. / 허용 : 불이 꺼져간다.
          원칙 : 비가 올 성싶다. / 허용 : 비가 올성싶다.

제4절 고유 명사 및 전문 용어
제48항 성과 이름, 성과 호 등은 붙여 쓰고, 이에 덧붙는 호칭어, 관직명 등은 띄어 쓴다.
    ex) 김양수(金良洙) / 김신우 씨 / 윤정우 석사

제49항 성명 이외의 고유 명사는 단어별로 띄어 씀을 원칙으로 하되, 단위별로 띄어 쓸 수 있다.
    ex) 원칙 : 한국외국어 대학교 / 허용 : 한국외국어대학교
    ex) 원칙 : 야탑 고등학교 / 허용 : 야탑고등학교

제50항 전문 용어는 단어별로 띄어 씀을 원칙으로 하되, 붙여 쓸 수 있다.
    ex) 원칙 : 국제 음성 기호 / 허용 : 국제음성기호

 

https://kornorms.korean.go.kr//m/m_regltn.do#a

 

- 왜 띄어쓰기가 중요할까?

 

무지개같은사장님

 

 

위 예문을 보았을 때 어떻게 해석할 수 있을까?

언뜻보면 한 가지 의미로만 해석이 될 수 있지만 띄어쓰기에 따라 정반대의 의미로도 해석이 가능하다는 것을 확인할 수 있다.

 

ㄱ. 무지개 같은 사장님
ㄴ. 무지 개같은 사장님

 

ㄱ의 경우 사장님의 성품을 칭찬하는 긍정적인 의미를 나타내지만 띄어쓰기의 차이에 따라 ㄴ의 예문의 경우 사장님을 욕하는 부정적인 의미의 텍스트가 된다.

이처럼 띄어쓰기는 사용자의 의도를 정확히 전달하기 위한 수단으로 사용이 되며, 실제 사용자의 의도를 파악하는데 중요한 부분을 차지하고 있다. 따라서 사용자의 의도에 맞는 정확한 띄어쓰기가 이루어져야지 다양한 자연어처리 태스크의 정확도가 높아질 수 있다.

 

2. 오픈소스 띄어쓰기 모델

2.1. PyKospacing

네이버에서 일하는 NLP Engineer 전희원님이 개발한 오픈소스 파이썬 패키지이다. 

딥러닝 기반 모델로 1억개 이상의 뉴스 데이터로 학습시킨 모델로

세종 구어체 코퍼스(1M)에서 97.1%의 Accuracy를 보여줬고

문어체 코퍼스(3M)에서 94.3%의 성능을 보여주었다.

 

설치 방법

pip install git+https://github.com/haven-jeon/PyKoSpacing.git

 

간단한 사용법

from pykospacing import Spacing
spacing = Spacing()

spacing("김형호영화시장분석가는'1987'의네이버영화정보네티즌10점평에서언급된단어들을지난해12월27일부터올해1월10일까지통계프로그램R과KoNLP패키지로텍스트마이닝하여분석했다.")
>>> "김형호 영화시장 분석가는 '1987'의 네이버 영화 정보 네티즌 10점 평에서 언급된 단어들을 지난해 12월 27일부터 올해 1월 10일까지 통계 프로그램 R과 KoNLP 패키지로 텍스트마이닝하여 분석했다."

# Apply a list of words that must be non-spacing
spacing('귀밑에서턱까지잇따라난수염을구레나룻이라고한다.')
>>> '귀 밑에서 턱까지 잇따라 난 수염을 구레나 룻이라고 한다.'

 

특이점

  • ignore 이라는 전/후처리 전용 파라미터를 지원함
spacing("친구와함께bmw썬바이저를썼다.", ignore='none')
>>> "친구와 함께 bm w 썬바이저를 썼다."
spacing("친구와함께bmw썬바이저를썼다.", ignore='pre')
>>> "친구와 함께bmw 썬바이저를 썼다."
spacing("친구와함께bmw썬바이저를썼다.", ignore='post')
>>> "친구와 함께 bm w 썬바이저를 썼다."
spacing("친구와함께bmw썬바이저를썼다.", ignore='pre2')
>>> "친구와 함께 bmw 썬바이저를 썼다."

 

  • rules라는 커스텀 규칙도 추가 가능하며 set_rules_by_csv 메서드로 csv 형태의 파일로 규칙 삽입 가능하다.
spacing = Spacing(rules=['구레나룻'])
spacing('귀밑에서턱까지잇따라난수염을구레나룻이라고한다.')
>>> '귀 밑에서 턱까지 잇따라 난 수염을 구레나룻이라고 한다.'

### csv 파일
"""
$ cat test.csv
인덱스,단어
1,네이버영화
2,언급된단어
"""

from pykospacing import Spacing
spacing = Spacing(rules=[''])
spacing.set_rules_by_csv('./test.csv', '단어')
spacing("김형호영화시장분석가는'1987'의네이버영화정보네티즌10점평에서언급된단어들을지난해12월27일부터올해1월10일까지통계프로그램R과KoNLP패키지로텍스트마이닝하여분석했다.")
>>> "김형호 영화시장 분석가는 '1987'의 네이버영화 정보 네티즌 10점 평에서 언급된단어들을 지난해 12월 27일부터 올해 1월 10일까지 통계 프로그램 R과 KoNLP 패키지로 텍스트마이닝하여 분석했다."

 

 

https://github.com/haven-jeon/PyKoSpacing

 

GitHub - haven-jeon/PyKoSpacing: Automatic Korean word spacing with Python

Automatic Korean word spacing with Python . Contribute to haven-jeon/PyKoSpacing development by creating an account on GitHub.

github.com

 

2.2. PyHanspell

네이버 맞춤법 검사기를 이용한 파이썬용 한글 맞춤법 검사 라이브러리
현재 작동 안됨 (크롤링 이슈로 보여짐)

 

설치 방법

pip install py-hanspell

 

간단한 사용법

from hanspell import spell_checker

# hanspell_sent = spelled_sent.checked
print(spell_checker.check("나는밥을 먹었다."))
>>> 나는 밥을 먹었다.

 

특이점

  • 맞춤법 검사기이기에 띄어쓰기 뿐만 아니라 맞춤법도 교정해준다.
from hanspell import spell_checker

result = spell_checker.check(u'안녕 하세요. 저는 한국인 입니다. 이문장은 한글로 작성됬습니다.')
result
>>> Checked(result=True, original='안녕 하세요. 저는 한국인 입니다. 이문장은 한글로 작성됬습니다.', checked='안녕하세요. 저는 한국인입니다. 이 문장은 한글로 작성됐습니다.', errors=4, words=OrderedDict([('안녕하세요.', 2), ('저는', 0), ('한국인입니다.', 2), ('이', 2), ('문장은', 2), ('한글로', 0), ('작성됐습니다.', 1)]), time=0.10472893714904785)

 

https://github.com/ssut/py-hanspell

 

GitHub - ssut/py-hanspell: 파이썬 한글 맞춤법 검사 라이브러리. (네이버 맞춤법 검사기 사용)

파이썬 한글 맞춤법 검사 라이브러리. (네이버 맞춤법 검사기 사용). Contribute to ssut/py-hanspell development by creating an account on GitHub.

github.com

 

2.3. QuickSpacer

스캐터랩의 박상준님이 개발한 한국어 띄어쓰기 모델로 pip를 통해 간단한 설치와 커스텀 학습도 가능하다.

Convolution을 이용한 모델이며 국립국어원 모두의 말뭉치(vr. 1.0) 데이터를 사용해 학습하였다.

 

설치 방법

pip install quickspacer

 

간단한 사용법

from quickspacer import Spacer

spacer = Spacer()
spacer.space(["띄어쓰기를안한나쁜말", "또는 띄어쓰기가 잘 되어있는 좋은 말"])
>>> ['띄어쓰기를 안한 나쁜 말', '또는 띄어쓰기가 잘 되어 있는 좋은 말']

 

특이점

  • Level을 설정하여 띄어쓰기 성능을 높일 수 있다.
from quickspacer import Spacer

# Level 1 Default, Same as Spacer()
spacer1 = Spacer(level=1)
# Level 2
spacer2 = Spacer(level=2)
# Level 3
spacer1 = Spacer(level=3)

 

  • rules라는 커스텀 규칙도 추가 가능하며 set_rules_by_csv 메서드로 csv 형태의 파일로 규칙 삽입 가능하다.
spacing = Spacing(rules=['구레나룻'])
spacing('귀밑에서턱까지잇따라난수염을구레나룻이라고한다.')
>>> '귀 밑에서 턱까지 잇따라 난 수염을 구레나룻이라고 한다.'

### csv 파일
"""
$ cat test.csv
인덱스,단어
1,네이버영화
2,언급된단어
"""

from pykospacing import Spacing
spacing = Spacing(rules=[''])
spacing.set_rules_by_csv('./test.csv', '단어')
spacing("김형호영화시장분석가는'1987'의네이버영화정보네티즌10점평에서언급된단어들을지난해12월27일부터올해1월10일까지통계프로그램R과KoNLP패키지로텍스트마이닝하여분석했다.")
>>> "김형호 영화시장 분석가는 '1987'의 네이버영화 정보 네티즌 10점 평에서 언급된단어들을 지난해 12월 27일부터 올해 1월 10일까지 통계 프로그램 R과 KoNLP 패키지로 텍스트마이닝하여 분석했다."

 

https://cosmoquester.github.io/quickspacer/

 

한국어 띄어쓰기 교정 모델 개발 (Quickspacer)

Convolution을 이용한 간단한 한국어 띄어쓰기 교정 모델입니다. 속도를 우선으로 고려하였습니다.아래에서 바로 사용해보실 수 있습니다. 이 데모의 모델들은 모두의 말뭉치 국립국어원 문어 말

cosmoquester.github.io

https://github.com/cosmoquester/quickspacer

 

GitHub - cosmoquester/quickspacer: 빠른 속도와 준수한 정확도를 목표로하는 한국어 띄어쓰기 교정 모델

빠른 속도와 준수한 정확도를 목표로하는 한국어 띄어쓰기 교정 모델입니다. (It is a Korean spacing correction model that aims for fast speed and moderate accuracy.) - GitHub - cosmoquester/quickspacer: 빠른 속도와 준수한

github.com

 

2.4. SoySpacing

김현중님이 개발한 한국어 전처리 패키지(SoyNLP)와 함께 개발된 띄어쓰기 수정 모델이다.

본래 띄어써야하는 부분을 교정하는 것을 중점으로 개발되었으며 휴리스틱 알고리즘으로 작성되었다.

전체 학습에 사용된 데이터에서 자주 등장한 패턴을 기준으로 수정되었으며 이로 인해 데이터 내의 띄어쓰기 분포에 따라 적합한 모델이 다르기에 학습된 모델을 제공하지 않았다.

설치 방법

pip install soyspacing

 

간단한 사용법

import soyspacing

from soyspacing.countbase import RuleDict, CountSpace

soy_model = CountSpace()
soy_model.load_model("학습된 모델 경로", json_format=False)


verbose=False
mc = 10  # min_count
ft = 0.3 # force_abs_threshold
nt =-0.3 # nonspace_threshold
st = 0.3 # space_threshold

# with parameters
sent_corrected, tags = org_soy_model.correct(
    doc=test_sents,
    verbose=verbose,
    force_abs_threshold=ft,
    nonspace_threshold=nt,
    space_threshold=st,
    min_count=mc)
>>> 삼각대와 랜턴 연결하는 너트가 헐거워 캠핑당일날은 고리에 걸어 사용했지만 홈페이지에 문의해서 리뉴얼된 너트를 빠른시일내에 배송받았고, 결합해본 결과 튼튼하게 고정됩니다.


# without parameters
sent_corrected, tags = org_soy_model.correct(test_sents)
>>> 삼각대와 랜턴 연결하는 너트가 헐거워 캠핑당일날은 고리에 걸어 사용했지만 홈페이지에 문의해서 리뉴얼된 너트를 빠른시일내에 배송받았고, 결합해본 결과 튼튼하게 고정됩니다.

 

특이점

  • 본인의 데이터로 학습이 가능하다.
### 학습 방법

import soyspacing

from soyspacing.countbase import RuleDict, CountSpace

## 모델 학습하기
corpus_fname = "텍스트(.txt) 형식으로 된 코퍼스 파일"
model = CountSpace()
model.train(corpus_fname)

model_fname = "저장될 모델 경로(.model 파일 형식)"
model.save_model(model_fname, json_format=False)

## 모델 불러오기
model2 = CountSpace()
model2.load_model(model_fname, json_format=False)

 

  • 5개의 파라미터 조정이 가능
    • force_abs_threshold: 점수의 절대값이 이 수준 이상이면 최고점이 아니더라도 즉각 태깅
    • nonspace_threshold : 이 점수 이하일 때만 0으로 태깅
    • space_threshold : 이 점수 이상일 때만 1로 태깅
    • min_count : L, C, R 각각의 feature 빈도수가 min_count 이하이면 불확실한 정보로 판단, 띄어쓰기 계산 시 무시
    • verbose: iteration 마다 띄어쓰기가 어떻게 되고 있는지 확인
verbose=False
mc = 10  # min_count
ft = 0.3 # force_abs_threshold
nt =-0.3 # nonspace_threshold
st = 0.3 # space_threshold

sent_corrected, tags = model2.correct(
    "교정할 문장",
    verbose=verbose,
    force_abs_threshold=ft,
    nonspace_threshold=nt,
    space_threshold=st,
    min_count=mc
)

 

 

 

soyspacing

https://github.com/lovit/soyspacing

 

GitHub - lovit/soyspacing: 띄어쓰기 오류 교정 라이브러리입니다. CRF 와 같은 머신러닝 알고리즘이 아

띄어쓰기 오류 교정 라이브러리입니다. CRF 와 같은 머신러닝 알고리즘이 아닌, 직관적인 접근법으로 띄어쓰기를 교정합니다. - GitHub - lovit/soyspacing: 띄어쓰기 오류 교정 라이브러리입니다. CRF 와

github.com

 

2.5. PyCRFsuite

Coditional Random Field를 사용한 띄어쓰기 모델

 

설치 방법

git clone https://github.com/lovit/pycrfsuite_spacing.git

 

사용법

from pycrfsuite_spacing.pycrfsuite_spacing import PyCRFSuiteSpacing

model_path = 'demo_model.crfsuite'
correct = PyCRFSuiteSpacing(to_feature)
correct.load_tagger(model_path)

correct('이건진짜좋은영화라라랜드진짜좋은영화')
>>> '이건 진짜 좋은 영화 라라랜드 진짜 좋은 영화'

 

특이점

  • 본인의 데이터로 학습이 가능하다.
    • 조정 가능한 파라미터
      • feature_minfreq
        • 기본값은 0 입니다. 이 값이 지나치게 작으면 features 개수가 커집니다. 메모리가 많이 필요하니 적절한 수준으로 잡아줍니다.
      • max_iterations
        • 기본값은 100 입니다.
      • l1_cost, l2_cost
        • 기본값은 각각 l1_cost = 0, l2_cost=1.0 입니다. Lasso CRF 를 이용하려면 l2_cost = 0, l1_cost > 0 으로 설정합니다.
        • L1, L2 regularization 을 모두 이용하려면 l1_cost > 0 & l2_cost > 0 으로 설정합니다. 
      • default parameter 를 이용하려면 아래처럼 to_feature 만 입력합니다. 
        • correct = PyCRFSuiteSpacing(to_feature)
### 학습 방법
from pycrfsuite_spacing import PyCRFSuiteSpacing

## 모델 학습하기

correct = PyCRFSuiteSpacing(
    to_feature = to_feature,
    feature_minfreq=3, # default = 0
    max_iterations=100,
    l1_cost=1.0,
    l2_cost=1.0
)
correct.train("학습 파일 경로", "모델 저장 경로(.crfsuite 형식))

## 모델 불러오기
correct.load_tagger(r'D:\Shin\NLP\Preprocess\Spacer\model\Pycrfsuite-soymerged.crfsuite')

print(soy_merged_correct(test_sents))
>>> 삼각 대와 랜턴 연결 하는 너트가 헐거워 캠핑 당일 날은 고리에 걸어 사용 했지만 홈페이지에 문의해서 리뉴 얼된 너트를 빠른 시일 내에 배송 받았 고, 결합 해본 결과 튼튼하게 고정 됩니다.

 

https://github.com/lovit/pycrfsuite_spacing

 

GitHub - lovit/pycrfsuite_spacing: python-crfsuite를 이용한 한국어 띄어쓰기 교정기

python-crfsuite를 이용한 한국어 띄어쓰기 교정기. Contribute to lovit/pycrfsuite_spacing development by creating an account on GitHub.

github.com

 

2.6. KorSEC

  • 사용자의 입력 의도를 반영한 띄어쓰기 오류 교정
  • 음절 N-gram 방식을 사용
  • OOV를 해결하기 위해 음절 간 띄어쓰기 확률을 간접적으로 계산하는 방식을 사용

설치 방법

pip install KorSEC
git clone https://github.com/seoyeon9646/KorSEC.git

 

사용법

from KorSEC import SEC

org_sec = SEC(모델 경로)
org_sec.correction("아빠가 방에서서류봉 투를꺼냈 다.")
>>> 아빠가 방에서 서류봉투를 꺼냈다.

 

특이점

  • 본인의 데이터로 학습이 가능하다.
    • 조정 가능한 파라미터
      • tuning_data_ratio[float, default=0.1]
        • 가중치 튜닝에 사용할 데이터 양
        • 전체 데이터 * tuning_data_ratio만큼 튜닝에 사용합니다.
      • min_count[int, default=5]
        • 임의의 N-gram 음절에 최소 등장 횟수
        • 학습 데이터에서 min_count보다 적은 횟수 등장하면 버려집니다.
  • 저장 경로에 한글이 있으면 불러지지 않는 오류가 있다.
### 학습 방법
from KorSEC import Trainer

## 모델 학습하기

sec_trainer = Trainer(min_count=5)
sec_trainer.train("학습 데이터 경로", "모델 저장 경로(폴더단위)")

 

https://velog.io/@seoyeon96/%ED%95%9C%EA%B5%AD%EC%96%B4-%EB%9D%84%EC%96%B4%EC%93%B0%EA%B8%B0-%EA%B5%90%EC%A0%95-%EB%AA%A8%EB%8D%B8-1.-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98
https://github.com/seoyeon9646/KorSEC
https://www.dbpia.co.kr/journal/articleDetail?nodeId=NODE09874447

 

[한국어 띄어쓰기 교정 모델] 1. 알고리즘

석사 과정을 진행할 때 한국어 띄어쓰기 교정 시스템을 관련해서 연구를 진행했었는데, 이걸 다시 python 패키지로 만드록 싶다는 욕심이 생겨서 진행하는 개인 프로젝트이다. 1. 서론 [Video Labelhtt

velog.io

 

GitHub - seoyeon9646/KorSEC: KorSEC : Korean Space Error Correction

KorSEC : Korean Space Error Correction. Contribute to seoyeon9646/KorSEC development by creating an account on GitHub.

github.com

 

사용자의 입력 의도를 반영한 음절 N-gram 기반 한국어 띄어쓰기 및 붙여쓰기 시스템 | DBpia

박서연, 옥철영 | 한국정보과학회 학술발표논문집 | 2020.7

www.dbpia.co.kr

 

2.6. RAWS(Real-time Automatic Word Segmentation for user generated texts)

  • 자소 단위 임베딩(Fasttext)을 활용한 띄어쓰기 모델
  • 사용자 생성문에 특화되어 있음
  • 텐서플로우 구버전으로 인한 Fasttext 모델의 불러오기 오류가 있음

설치 방법

https://github.com/warnikchow/raws.git

 

사용법

  • 버전 오류로 인해 아래 모듈로 수정 후 사용
import numpy as np
import fasttext

# maxlen = 100
# wdim = 100
sent = test_sents
dic_kor = fasttext.load_model("Fasttext 모델 경로(.bin 파일)")

# threshold_kor=0.001
overlap=30

from keras.models import load_model
model_kor = load_model("model_kor.hdf5 경로")

def pred_correction_rnn(sent,model,dic,maxlen,wdim, threshold_kor):
    conv = np.zeros((1,maxlen,wdim,1))
    rnn  = np.zeros((1,maxlen,wdim))
    charcount = -1
    for j in range(len(sent)):
        if j<maxlen and sent[j]!=' ':
            charcount=charcount+1
            conv[0][charcount,:,0]=dic[sent[j]]
            rnn[0][charcount,:]=dic[sent[j]]
    z = model.predict([conv,rnn])[0]
    sent_raw = ''
    count_char=-1
    lastpoint=-1
    lastchar=-1
    for j in range(len(sent)):
        if sent[j]!=' ':
            count_char=count_char+1
            sent_raw = sent_raw+sent[j]
            # print(9999,z[count_char])
            if z[count_char]>threshold_kor:
                sent_raw = sent_raw+' '
                if j<overlap:
                    print(overlap)
                    lastpoint=len(sent_raw)
                    lastchar=j
            else:
                lastchar=j
                lastpoint=len(sent_raw)
    # print(lastpoint, lastchar)
    return sent_raw, lastpoint, lastchar

def kor_spacing_man(s, threshold_kor):
    if len(s)<overlap:
        temp,lp,lc = pred_correction_rnn(s,model_kor,dic_kor,100,100, threshold_kor)
        z = temp+"\n"
    else:
      z=''
      start=0
      while start<len(s):
        if start+overlap<len(s):
          temp,lp,lc =pred_correction_rnn(s[start:start+2*overlap],model_kor,dic_kor,100,100, threshold_kor)
          temp=temp[:lp]
        else:
          temp,lp,lc =pred_correction_rnn(s[start:],model_kor,dic_kor,100,100, threshold_kor)
          lc = overlap
        z = z+temp
        start=start+lc+1
      z = z+"\n"
    return z

# kor_spacing

 

특이점

  • threshold의 값과 overlap 값에 따라 결과가 달라짐
kor_spacing_man(test_sents, threshold_kor=0.001)

 

https://github.com/warnikchow/raws

 

GitHub - warnikchow/raws: Real-time automatic word segmentation (for user-generated texts)

Real-time automatic word segmentation (for user-generated texts) - GitHub - warnikchow/raws: Real-time automatic word segmentation (for user-generated texts)

github.com

 

2.7. Kiwipiepy Spacing

  • 이민철님이 오픈소스로 공개한 한국어 형태소 분석기 Kiwi에 포함된 띄어쓰기 교정 모델
  • 형태소 분석기 기반한 띄어쓰기 교정

설치 방법

pip install kiwipiepy

 

간단 사용법

from kiwipiepy import Kiwi

kiwi = Kiwi(model_type='sbg')
kiwi.space(test_sents, reset_whitespace=True)
>>> '삼각대와 랜턴 연결하는 너트가 헐거워 캠핑 당일 날은 고리에 걸어 사용했지만 홈페이지에 문의해 서리 뉴 얼된 너트를 빠른 시일 내에 배송 받았고, 결합해 본 결과 튼튼하게 고정됩니다.'

 

특이점

  • reset_whitespace 값을 False로 바꾸면 기존의 띄어쓰기는 수정하지 않음
  • kiwi를 불러올 때 모델을 "sbg" 혹은 "knlm" 둘 중 하나 선택이 가능하며 다양한 생성자들이 존재(깃헙 참고)
  • Kiwi.space_tolerance를 조절하여 형태소 내 공백을 무시할 수 있음
kiwi.space("띄 어 쓰 기 문 제 가 있 습 니 다")
>>> "띄어 쓰기 문 제 가 있 습 니 다"
kiwi.space_tolerance = 2 # 형태소 내 공백을 최대 2개까지 허용
kiwi.space("띄 어 쓰 기 문 제 가 있 습 니 다")
>>> "띄어 쓰기 문제가 있습니다"

 

https://github.com/bab2min/kiwipiepy

 

GitHub - bab2min/kiwipiepy: Python API for Kiwi

Python API for Kiwi. Contribute to bab2min/kiwipiepy development by creating an account on GitHub.

github.com

 

3. 후기글에 대한 커스텀 학습 모델과 기존 모델에 대한 성능 비교

 

내가 주로 연구하는 분야가 사용자 생성문에 기반한 NLP 태스크들이기에 사용자 생성문인 후기글에 대해 얼마나 좋은 성능을 보여주는지 확인하기 위해 간단하게 평가를 진행하였다. 평가에서는 custom 모델 학습이 가능한 패키지에 대해서는 드라마 [자이언트]의 대본을 전처리하여 사용하였다. 사용자 생성문은 주로 구어체적인 특성이 많이 보여지기에 구어체 텍스트 중 띄어쓰기가 비교적 정확하게 이루어진 대본 텍스트를 사용하였다. 학습에 사용된 데이터는 간단한 전처리 과정과 최소 3어절 이상의 문장만 필터링하여 총 1,717,991 문장으로 구성되어있다.

실제 스포츠 도메인 후기글 100개의 문장을 언어학 전공자가 직접 띄어쓰기를 수정한 데이터를 정답지로 두었으며 문장의 띄어쓰기가 완벽히 일치한 경우만을 정답으로 가정하는 restrict한 방식을 사용하였다. 따라서 각 어절별로 평가한 성능은 더 좋게 나올 것으로 예상한다.

 

 

결과를 간단히 살펴보면, Quick Spacer의 original 모델이 가장 좋은 성능(65%)을 보였으며, KorSEC의 original 모델과 KIWI spacing 모델일 60% 이상의 성능을 보여주었다. Quick Spacer의 GIANT 모델은 데이터 부족으로 인해 성능이 낮게 나온 것으로 유추되며, RAWS 모델의 경우 기존에 제공하는 Fasttext 사전 학습 모델이 버전 불일치로 사용을 못해 자체적으로 구축한 임베딩 모델을 사용하였는데 이로 인해 성능이 낮게 나온 것으로 보여진다.

 

내가 찾지 못한 더 많은 한국어 띄어쓰기 모델이 있을 수도 있다.
현재까지 찾은 모델 중에 가장 성능이 좋았던 Qucik Spacer 모델을
다음 프로젝트 전처리 과정에 사용해볼 예정이다.
하지만 한국어 띄어쓰기는 띄어쓰기에 따라 사용자가 의도한 문장이 달라질 수도 있지만,
기본적으로 어문 규정에 그 규칙들이 나열되어있다.
이러한 언어학적 특성을 기반으로 사용자 생성문에 특화된 띄어쓰기 모델을 만들어보는 것도 좋은 프로젝트일 것으로 기대된다.

T4R!!(Thanks for Reading이라는 뜻~)
공감 한 번만 눌러주시면 감사하겠슴당ㅠㅜ

 

반응형

'Study > NLP' 카테고리의 다른 글

Emotion Analysis (감정 분석)  (4) 2023.12.20
It's all about the Data - Data Cascade의 위험성  (0) 2023.12.13
감성 분석이란?  (0) 2023.11.16
자연어처리란?  (0) 2023.11.16
Stanford CS224n - Lecture 2 Word Vectors and Word Senses  (0) 2021.07.29

댓글