Spacing Error Correction Tools


Keywords
Space-error-correction, Korean-spacing, Korean, Natural-Language-Processing, korean-nlp, nlp, noise-cancellation, spacing, text-processing
License
GPL-3.0
Install
pip install soyspacing==1.0.13

Documentation

Korean Space Error Corrector

soyspacing 은 ν•œκ΅­μ–΄ 띄어쓰기 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ νœ΄λ¦¬μŠ€ν‹± μ•Œκ³ λ¦¬μ¦˜μ„ μ œκ³΅ν•©λ‹ˆλ‹€. Conditional Random Field 와 λΉ„κ΅ν•˜μ—¬ κ°€λ²Όμš΄ λͺ¨λΈ μ‚¬μ΄μ¦ˆμ™€ λΉ λ₯Έ ν•™μŠ΅μ΄ κ°€λŠ₯ν•©λ‹ˆλ‹€.

이 μ•Œκ³ λ¦¬μ¦˜μ€ ScatterLab의 sungguλ‹˜, Emily Yunha Shinλ‹˜κ³Ό ν•¨κ»˜ μž‘μ—…ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

  • version = 0.1.23은 λ―Έμ™„μ„±λœ CRF 기반 띄어쓰기 μ•Œκ³ λ¦¬μ¦˜μ„ ν¬ν•¨ν•˜κ³  μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
  • version = 1.0.0λΆ€ν„° λ―Έμ™„μ„±λœ CRFλ₯Ό μ§€μš°κ³  νœ΄λ¦¬μŠ€ν‹± 기반 μ•Œκ³ λ¦¬μ¦˜λ§Œ μ œκ³΅ν•©λ‹ˆλ‹€.

ν˜„μž¬ (1.0.15) λ²„μ „μ—μ„œλŠ” ν•™μŠ΅λœ λͺ¨λΈμ„ μ œκ³΅ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. 띄어쓰기 ꡐ정은 이λ₯Ό μ μš©ν•  λ°μ΄ν„°μ…‹μ˜ 단어 뢄포에 따라 μ ν•©ν•œ λͺ¨λΈμ΄ λ‹€λ¦…λ‹ˆλ‹€. μ΄λŸ¬ν•œ 이유둜 soyspacing μ—μ„œλŠ” ν•™μŠ΅λœ λͺ¨λΈ λŒ€μ‹ , ν•™μŠ΅μ΄ κ°€λŠ₯ν•œ νŒ¨ν‚€μ§€λ§Œμ„ μ œκ³΅ν•©λ‹ˆλ‹€. μ‚¬μš©λ²•μ€ μ•„λž˜μ˜ usage 에, 더 μžμ„Έν•œ μ„€λͺ…은 slides λ₯Ό μ°Έκ³ ν•˜μ„Έμš”.

Setup

pip install soyspacing

Require

  • Python >= 3.4 (not tested in Python 2)
  • numpy >= 1.12.1

Usage

ν•™μŠ΅μ€ ν…μŠ€νŠΈ 파일 경둜λ₯Ό μž…λ ₯ν•©λ‹ˆλ‹€.

from soyspacing.countbase import CountSpace

corpus_fname = '../demo_model/134963_norm.txt'
model = CountSpace()
model.train(corpus_fname)

ν•™μŠ΅λœ λͺ¨λΈμ˜ μ €μž₯을 μœ„ν•΄μ„œλŠ” λͺ¨λΈ 파일 경둜λ₯Ό μž…λ ₯ν•©λ‹ˆλ‹€. JSON ν˜•μ‹μœΌλ‘œ λͺ¨λΈμ„ μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ €μž₯된 파일 μš©λŸ‰μ„ κ³ λ €ν•˜λ©° JSON ν˜•μ‹μ΄ 아닐 λ•Œ save / load κ°€ μ’€ 더 μ‰½μŠ΅λ‹ˆλ‹€.

model.save_model(model_fname, json_format=False)

ν•™μŠ΅λœ λͺ¨λΈμ„ 뢈러올 수 μžˆμŠ΅λ‹ˆλ‹€.

model = CountSpace()
model.load_model(another_model_fname, json_format=False)

띄어쓰기 ꡐ정을 μœ„ν•œ νŒ¨λŸ¬λ©”ν„°λŠ” λ„€ 가지가 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό μž…λ ₯ν•˜μ§€ μ•ŠμœΌλ©΄ default value λ₯Ό μ΄μš©ν•©λ‹ˆλ‹€.

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

sent = 'μ΄κ±΄μ§„μ§œμ’‹μ€μ˜ν™” λΌλΌλžœλ“œμ§„μ§œμ’‹μ€μ˜ν™”'

# with parameters
sent_corrected, tags = model.correct(
    doc=sent,
    verbose=verbose,
    force_abs_threshold=ft,
    nonspace_threshold=nt,
    space_threshold=st,
    min_count=mc)

# without parameters
sent_corrected, tags = model.correct(sent)

print(sent_corrected)
# 이건 μ§„μ§œ 쒋은 μ˜ν™” λΌλΌλžœλ“œμ§„μ§œ 쒋은 μ˜ν™”

νŠΉμ • 단어, ν˜Ήμ€ μ–΄μ ˆμ˜ μ•ž λ’€λ₯Ό λ°˜λ“œμ‹œ λ„κ±°λ‚˜ λΆ™μ—¬μ“΄λ‹€λŠ” κ·œμΉ™μ΄ μžˆλ‹€λ©΄ 이λ₯Ό μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜μ²˜λŸΌ μ–΄μ ˆκ³Ό μ–΄μ ˆ μ•ž, 뒀에 λŒ€ν•œ 띄어쓰기 νƒœκ·Έκ°€ ν¬ν•¨λ˜μ–΄ μžˆλŠ” ν…μŠ€νŠΈ νŒŒμΌμ„ μ€€λΉ„ν•©λ‹ˆλ‹€. μ§„μ§œ λΌλŠ” λ‹¨μ–΄μ˜ μ•ž, λ’€λŠ” λ°˜λ“œμ‹œ 띄어쓰기λ₯Ό ν•˜κ³ , 진과 짜 μ‚¬μ΄μ—λŠ” λ°˜λ“œμ‹œ λΆ™μ—¬μ“°κΈ°λ₯Ό ν•œλ‹€λŠ” μ˜λ―Έμž…λ‹ˆλ‹€. 이 νŒŒμΌμ„ rules.txt 에 μ €μž₯ν•©λ‹ˆλ‹€.

κ°€λ Ή	101
μ§„μ§œ	101
κ°€κ²ŒλŠ”	1001
κ°€κ²Œλ‘œ	1001
κ°€κ²Œμ•Ό	1001

μœ„μ˜ νŒŒμΌμ„ RuleDict 둜 μ½μ–΄μ˜¨ λ’€, μœ„μ˜ μ˜ˆμ‹œλ₯Ό λ‹€μ‹œ μ μš©ν•˜λ©΄ λΌλΌλžœλ“œμ™€ μ§„μ§œ 사이가 λ„μ–΄μ‘ŒμŒμ„ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

from soyspacing.countbase import RuleDict

rule_dict = RuleDict('filepath')
sent_corrected, tags = model.correct(sent, rules=rule_dict)
print(sent_corrected)
# 이건 μ§„μ§œ 쒋은 μ˜ν™” λΌλΌλžœλ“œ μ§„μ§œ 쒋은 μ˜ν™”

더 μžμ„Έν•œ λ‚΄μš©μ˜ Jupyter notebook ν˜•μ‹ tutorial 파일이 ./tutorials/에 μžˆμŠ΅λ‹ˆλ‹€.

κ΄€λ ¨ 연ꡬ / μ œμ•ˆλœ λͺ¨λΈμ˜ 원리 / CRF μ™€μ˜ μ„±λŠ₯ 비ꡐ / κ·Έ μ™Έ ν™œμš© 팁의 λ‚΄μš©μ΄ ν¬ν•¨λ˜μ–΄ μžˆλŠ” presentation 파일이 μ œκ³΅λ©λ‹ˆλ‹€.

CRF based space error correction

pycrfsuite λ₯Ό μ΄μš©ν•˜μ—¬ 띄어쓰기λ₯Ό κ΅μ •ν•˜λŠ” νŒ¨ν‚€μ§€μž…λ‹ˆλ‹€. pycrfsuite 에 데이터λ₯Ό μž…λ ₯ν•˜κΈ° νŽΈν•˜λ„λ‘ Template, Transformer 의 utils λ₯Ό ν•¨κ»˜ μ œκ³΅ν•©λ‹ˆλ‹€.

링크