hyunwoongko / pecab

Pecab: Pure python Korean morpheme analyzer based on Mecab
Apache License 2.0
156 stars 13 forks source link

숫자, 외국어의 tokenizing 문제 #8

Open tsbach opened 1 year ago

tsbach commented 1 year ago

숫자와 외국어의 token 인식이 문자단위로 이루어집니다.

from pecab import PeCab

pecab = PeCab()
pecab.pos('2023년, 드디어 python으로 한글을 분석합니다.')
[('2', 'SN'),
 ('0', 'SN'),
 ('2', 'SN'),
 ('3', 'SN'),
 ('년', 'NNBC'),
 (',', 'SC'),
 ('드디어', 'MAG'),
 ('p', 'SL'),
 ('y', 'SL'),
 ('t', 'SL'),
 ('h', 'SL'),
 ('o', 'SL'),
 ('n', 'SL'),
 ('으로', 'JKB'),
 ('한글', 'NNG'),
 ('을', 'JKO'),
 ('분석', 'NNG'),
 ('합니다', 'XSV+EF'),
 ('.', 'SF')]
SmilingSammy commented 1 year ago

저도 이 영어 단어가 문자 단위로 분리되는 것을 어떻게 막을 수 있는지 궁금합니다 ㅠ

smbslt3 commented 7 months ago
from pecab import PeCab
pecab = PeCab()

def pecab_tokenizer(text):
    clean_tokens = []
    raw_tk_n_pos = pecab.pos(text)
    i = 0
    while i < len(raw_tk_n_pos):
        tk, pos = raw_tk_n_pos[i]
        if pos in ['SN', 'SL']:
            # 현재 토큰과 같은 품사를 가진 연속된 토큰을 찾아 결합합니다.
            while i + 1 < len(raw_tk_n_pos) and raw_tk_n_pos[i + 1][1] == pos:
                i += 1
                tk += raw_tk_n_pos[i][0]
        clean_tokens.append(tk)
        i += 1
    return clean_tokens

test_sentence = 'abc2023년, 드디어 python으로 한글을 분석합니다. 12'

print(pecab.morphs( test_sentence ))
# >>> ['a', 'b', 'c', '2', '0', '2', '3', '년', ',', '드디어', 'p', 'y', 't', 'h', 'o', 'n', '으로', '한글', '을', '분석', '합니다', '.', '1', '2']
print(pecab_tokenizer( test_sentence ))
# >>> ['abc', '2023', '년', ',', '드디어', 'python', '으로', '한글', '을', '분석', '합니다', '.', '12']

저도 이 문제를 겪고있는데 업데이트가 없어 pecab.morphs를 대체할 수 있는 함수를 남깁니다. 급하신 분은 이대로 넣고 돌리시면 됩니다만, 반복문이있어 pecab.morphs보다는 속도가 느립니다.