Published by hyunwoongko 6 months ago
alias()
function and fix some docs.Published by hyunwoongko 6 months ago
Published by hyunwoongko 6 months ago
KSS is a Korean string processing suite that provides various functions for processing Korean strings. It is designed to be simple and easy to use, and it is designed to be used in various fields such as natural language processing, data preprocessing, and data analysis.
All functions can be used by creating an instance of the Kss class and calling the instance with the inputs.
from kss import Kss
module = Kss("MODULE_NAME")
output = module("YOUR_INPUT_STRING", **kwargs)
If you want to check the available modules, you can use the available()
function.
from kss import Kss
Kss.available()
['augment', 'collocate', 'g2p', 'hangulize', 'split_hanja', 'is_hanja', 'hanja2hangul', 'h2j', 'h2hcj', 'j2h', 'j2hcj', 'hcj2h', 'hcj2j', 'is_jamo', 'is_jamo_modern', 'is_hcj', 'is_hcj_modern', 'is_hangul_char', 'select_josa', 'combine_josa', 'extract_keywords', 'split_morphemes', 'paradigm', 'anonymize', 'clean_news', 'is_completed_form', 'get_all_completed_form_hangul_chars', 'get_all_incompleted_form_hangul_chars', 'filter_out', 'half2full', 'reduce_char_repeats', 'reduce_emoticon_repeats', 'remove_invisible_chars', 'normalize', 'preprocess', 'qwerty', 'romanize', 'is_unsafe', 'split_sentences', 'correct_spacing', 'summarize_sentences']
If you want to check the usage of each module, you can use the help()
function.
from kss import Kss
module = Kss("split_sentences")
module.help()
Split texts into sentences.
Args:
text (Union[str, List[str], Tuple[str]]): single text or list/tuple of texts
backend (str): morpheme analyzer backend. 'mecab', 'pecab', 'punct' are supported
num_workers (Union[int, str]): the number of multiprocessing workers
strip (bool): strip all sentences or not
return_morphemes (bool): whether to return morphemes or not
ignores (List[str]): list of strings to ignore
Returns:
Union[List[str], List[List[str]]]: outputs of sentence splitting
Examples:
>>> from kss import Kss
>>> split_sentences = Kss("split_sentences")
>>> text = "회사 동료 분들과 다녀왔는데 분위기도 좋고 음식도 맛있었어요 다만, 강남 토끼정이 강남 쉑쉑버거 골목길로 쭉 올라가야 하는데 다들 쉑쉑버거의 유혹에 넘어갈 뻔 했답니다 강남역 맛집 토끼정의 외부 모습."
>>> split_sentences(text)
['회사 동료 분들과 다녀왔는데 분위기도 좋고 음식도 맛있었어요', '다만, 강남 토끼정이 강남 쉑쉑버거 골목길로 쭉 올라가야 하는데 다들 쉑쉑버거의 유혹에 넘어갈 뻔 했답니다', '강남역 맛집 토끼정의 외부 모습.']
If you input a list of strings, Kss will automatically use multiprocessing to process the strings in parallel.
And you can set the number of processes to use by setting the num_workers
parameter.
If you input num_workers<2
, Kss will not use multiprocessing.
from kss import Kss
module = Kss("MODULE_NAME")
# using all cores
output = module(["YOUR_INPUT_STRING1", "YOUR_INPUT_STRING2", ...], **kwargs)
# using 4 cores
output = module(["YOUR_INPUT_STRING1", "YOUR_INPUT_STRING2", ...], num_workers=4, **kwargs)
# using 1 core (no multiprocessing)
output = module(["YOUR_INPUT_STRING1", "YOUR_INPUT_STRING2", ...], num_workers=1, **kwargs)
The old version of Kss used functional usage. KSS also supports this for backward compatibility.
from kss import split_sentences
output = split_sentences("YOUR_INPUT_STRING", **kwargs)
See here for more details.
Published by hyunwoongko 7 months ago
is_compliable()
function to check Cython implementation is available for the user environment.def is_compilable():
try:
# 1. Try to compile csrc/sentence_splitter.cpp
extra_compile_args, extra_link_args = get_extra_compile_args()
compiler = new_compiler()
customize_compiler(compiler)
compiler.compile(['csrc/sentence_splitter.cpp'], extra_postargs=extra_compile_args)
return True
except:
# 2. Cannot compile csrc/sentence_splitter.cpp
return False
Published by hyunwoongko 7 months ago
fast
backendIf you want to split sentences quickly, you can use the split_sentences
function with the backend='fast'
option from Kss 5.0.0. This method is based on the fast algorithm utilized in Kss versions prior to 3.0. It offers significantly faster processing compared to the mecab
backend, but less accurate. Therefore, This feature could be useful when you need to split sentences very quickly but don't need high accuracy. Furthermore, the fast
backend has been implemented in both Python and Cython.
Cython
, Kss will use the Cython implementation, which boasts the fastest performance (x600 faster than mecab
).mecab
backend (x4 faster than mecab
).Given the substantial speed advantage of the Cython implementation, it is strongly recommended over the Python alternative. Kss automatically detects the availability of Cython in your environment and will install it if feasible, so you don't need to worry about Cython and C++ dependencies.
Backend | blogs_ko | blogs_lee | nested | sample | tweets | v_ending | wikipedia |
---|---|---|---|---|---|---|---|
mecab |
0.8860 | 0.8887 | 0.9206 | 0.9682 | 0.8137 | 0.4815 | 1.0000 |
fast (Python) |
0.6281 | 0.7899 | 0.6899 | 0.7482 | 0.5315 | 0.1596 | 0.7358 |
fast (Cython) |
0.6545 | 0.8132 | 0.6372 | 0.8407 | 0.5892 | 0.1596 | 0.9566 |
Backend | blogs_ko | blogs_lee | nested | sample | tweets | v_ending | wikipedia |
---|---|---|---|---|---|---|---|
mecab |
538.10 | 293.31 | 225.05 | 56.35 | 184.91 | 20.55 | 899.99 |
fast (Python) |
146.75 | 70.94 | 52.84 | 12.11 | 37.80 | 4.69 | 255.90 |
fast (Cython) |
0.91 | 0.55 | 0.46 | 0.09 | 0.40 | 0.05 | 1.12 |
Please note that while the core algorithm in the fast
backend mirrors that of Kss C++ 1.3.1, several bugs identified in the original implementation have been rectified in Kss 5.0.0.
Published by hyunwoongko over 1 year ago
Published by hyunwoongko over 1 year ago
return_pos
parameter to split_morphemes
function. (https://github.com/hyunwoongko/kss/pull/64)Published by hyunwoongko over 1 year ago
Fix a bug reported from https://github.com/hyunwoongko/kss/issues/60.
Published by hyunwoongko almost 2 years ago
Published by hyunwoongko almost 2 years ago
ignores
parameter to prevent missplitting sentencesYou can add ignores
list to split_sentences
and summarize_sentences
.
import kss
text = """첫째. 베트남 지역에서는 일찍부터 반랑국, 어우락 왕국, 남비엣(남월) 등이 건국되어 발전하였다. 그러나 한 무제의 공격으로 중국의 지배를 받기 시작하면서 중국 문화의 영향을 받게 되었다. 특히 당의 지배를 받으면서 당 문화의 영향을 많이 받았다.
둘째. 베트남에서도 중국 문화의 영향 속에서 유교 문화가 발달하였다. 특히 베트남의 리 왕조 때에는 문묘가 설치되고, 과거제가 시행되기도 하였다. 한편 레(후기) 왕조 때에는 성리학을 바탕으로 한 유교 문화가 확산되었다.
셋째. 베트남에서는 강수량이 풍부하고, 날씨가 따뜻하여 벼농사 중심의 농경 생활이 이루어지고 있다.
넷째. 동아시아 지역은 계절에 따라 방향이 바뀌는 계절풍의 영향을 강하게 받는 곳이다. 서안 해양성 기후는 중위도의 대륙 서쪽 지역에 주로 나타난다.
"""
output = kss.split_sentences(text)
print(output)
# ['첫째.', '베트남 지역에서는 일찍부터 반랑국, 어우락 왕국, 남비엣(남월) 등이 건국되어 발전하였다.', '그러나 한 무제의 공격으로 중국의 지배를 받기 시작하면서 중국 문화의 영향을 받게 되었다.', '특히 당의 지배를 받으면서 당 문화의 영향을 많이 받았다.', '둘째.', '베트남에서도 중국 문화의 영향 속에서 유교 문화가 발달하였다.', '특히 베트남의 리 왕조 때에는 문묘가 설치되고, 과거제가 시행되기도 하였다.', '한편 레(후기) 왕조 때에는 성리학을 바탕으로 한 유교 문화가 확산되었다.', '셋째.', '베트남에서는 강수량이 풍부하고, 날씨가 따뜻하여 벼농사 중심의 농경 생활이 이루어지고 있다.', '넷째.', '동아시아 지역은 계절에 따라 방향이 바뀌는 계절풍의 영향을 강하게 받는 곳이다.', '서안 해양성 기후는 중위도의 대륙 서쪽 지역에 주로 나타난다.']
output = kss.split_sentences(text, ignores=["첫째.", "둘째.", "셋째.", "넷째."])
print(output)
# ['첫째. 베트남 지역에서는 일찍부터 반랑국, 어우락 왕국, 남비엣(남월) 등이 건국되어 발전하였다.', '그러나 한 무제의 공격으로 중국의 지배를 받기 시작하면서 중국 문화의 영향을 받게 되었다.', '특히 당의 지배를 받으면서 당 문화의 영향을 많이 받았다.', '둘째. 베트남에서도 중국 문화의 영향 속에서 유교 문화가 발달하였다.', '특히 베트남의 리 왕조 때에는 문묘가 설치되고, 과거제가 시행되기도 하였다.', '한편 레(후기) 왕조 때에는 성리학을 바탕으로 한 유교 문화가 확산되었다.', '셋째. 베트남에서는 강수량이 풍부하고, 날씨가 따뜻하여 벼농사 중심의 농경 생활이 이루어지고 있다.', '넷째. 동아시아 지역은 계절에 따라 방향이 바뀌는 계절풍의 영향을 강하게 받는 곳이다.', '서안 해양성 기후는 중위도의 대륙 서쪽 지역에 주로 나타난다.']
Kss considers circle characters like ①, ②, ③ and bracket characters like ⑴, ⑵, ⑶ from version 4.5.0.
import kss
text = """
③ 구석기 시대에는 사냥, 채집, 물고기잡이로 생계를 유지하였다.
④ 신석기 시대에 이르러 조, 피 등을 재배하는 농경이 시작되었다.
⑤ 청동기 시대 이후 청동이나 철기 등의 금속을 이용하여 무기를 만들어 사용하였다.
"""
output = kss.split_sentences(text)
print(output)
# before:
# ['③ 구석기 시대에는 사냥, 채집, 물고기잡이로 생계를 유지하였다.\n④', 신석기 시대에 이르러 조, 피 등을 재배하는 농경이 시작되었다.\n⑤', 청동기 시대 이후 청동이나 철기 등의 금속을 이용하여 무기를 만들어 사용하였다.']
# after
# ['③ 구석기 시대에는 사냥, 채집, 물고기잡이로 생계를 유지하였다.', '④ 신석기 시대에 이르러 조, 피 등을 재배하는 농경이 시작되었다.', '⑤ 청동기 시대 이후 청동이나 철기 등의 금속을 이용하여 무기를 만들어 사용하였다.']
strip
and ignores
parameters in summarize_sentences
You can use strip
and ignores
parameters in summarize_sentences
similar with split_sentences
.
kss.summarize_sentences(text, ignores=["첫째.", "둘째.", "셋째.", "넷째."], strip=False)
Published by hyunwoongko almost 2 years ago
punct
backend. This could be helpful for well-structed documents or english documents
nltk.sent_tokenize
in English.
import nltk
import kss
text = "Thanks Mr. Kim. I love your suggestion.😁 We can choose one of them. 1. going to Korea, 2. going to Japan. I prefer Korea. because there are many foods. e.g. Kimchi, Bibimpap, and so on.🧡 (And I lived in Korean when I was young. I have some great experience) Please let me know your opinion!"
nltk.sent_tokenize(text)
['Thanks Mr. Kim.', 'I love your suggestion.😁 We can choose one of them.', '1. going to Korea, 2. going to Japan.', 'I prefer Korea.', 'because there are many foods.', 'e.g.', 'Kimchi, Bibimpap, and so on.🧡 (And I lived in Korean when I was young.', 'I have some great experience) Please let me know your opinion!']
kss.split_sentences(text, backend="punct")
['Thanks Mr. Kim.', 'I love your suggestion.😁', 'We can choose one of them. 1. going to Korea, 2. going to Japan.', 'I prefer Korea.', 'because there are many foods. e.g. Kimchi, Bibimpap, and so on.🧡', '(And I lived in Korean when I was young. I have some great experience)', 'Please let me know your opinion!']
e.g.
, i.e.
, Mr.
, Dr.
, Def.
, Prof.
, ...Published by hyunwoongko almost 2 years ago
Published by hyunwoongko almost 2 years ago
Published by hyunwoongko almost 2 years ago
summarize_sentences
functionThere's textrankr
, a text summarization module for Korean. So someone might ask me like "Why are you adding summarization feature into Kss?". The reason of adding this feature is sentence segmentation performance is very important in text summarization domain.
Before summarize text into sentences, we must split text into sentences. but textrankr
has been split sentences using very naive regex based method, and this makes text summarization performance poorly. In addition, user must input tokenizer into the TextRank
class, but this is a little bit bothering. So I fixed the two problems of textrankr
, and added the codebase into Kss.
Kss has one of the best sentence segmentation module in all of the Korean language processing libraries, and this can improve text summarization performance without modifying any summarization related algorithms in textrankr
.
Let's see the following example.
text = """어느화창한날 출근전에 너무일찍일어나 버렸음 (출근시간 19시)
할꺼도없고해서 카페를 찾아 시내로 나갔음
새로생긴곳에 사장님이 커피선수인지 커피박사라고 해서 갔음
오픈한지 얼마안되서 그런지 손님이 얼마없었음
조용하고 좋다며 좋아하는걸시켜서 테라스에 앉음"""
Output of textrankr
is:
import textrankr
import mecab
tokenizer = mecab.MeCab().morphs
textrankr_class = textrankr.TextRank(tokenizer=tokenizer)
textrankr_output = textrankr_class.summarize(text, verbose=False)
print(textrankr_output)
output:
['어느화창한날 출근전에 너무일찍일어나 버렸음 (출근시간 19시) 할꺼도없고해서 카페를 찾아 시내로 나갔음 새로생긴곳에 사장님이 커피선수인지 커피박사라고 해서 갔음 오픈한지 얼마안되서 그런지 손님이 얼마없었음 조용하고 좋다며 좋아하는걸시켜서 테라스에 앉음 근데 조용하던 카페가 산만해짐 소리의 출처는 카운터였음(테라스가 카운터 바로옆)']
Output of kss
is:
import kss
kss.sumarize_sentences(text)
output:
['할꺼도없고해서 카페를 찾아 시내로 나갔음', '새로생긴곳에 사장님이 커피선수인지 커피박사라고 해서 갔음', '조용하고 좋다며 좋아하는걸시켜서 테라스에 앉음']
You can see textrankr
failed summarizing text because it couldn't split input text into sentences. but Kss summarized text very well. And usage of kss
is also much easier than textrankr
! That's why I am adding this feature into Kss.
For more details, please check our README document. Thanks !
Published by hyunwoongko almost 2 years ago
Add new benchmark dataset: wikipedia.txt
Modify single quote backup
Modify logic for heavy backup dict
Add some backup strings
Add postprocessing rules for symbol only sentences
Published by hyunwoongko almost 2 years ago
["무슨일이였을까", "용 바로 이것이죠"]
["무슨일이였을까용", "바로 이것이죠"]
["무슨일이였게용 바로 이것이죠"]
["무슨일이였게용", "바로 이것이죠"]
Published by hyunwoongko almost 2 years ago
Published by hyunwoongko almost 2 years ago
drop_space
for split_morphemes
strip
for split_sentences
텍스트 렌더링에 가까운 수준의 정확도와 디테일을 제공합니다.
from kss import split_sentences
data = """메시는 조별라운드 1차전인 나이지리아와의 경기에 선발 출전했으나 상대 골키퍼인 빈센트 에니에아마의 선방들에 막혀 골을 기록하지는 못했다.[12] 조별라운드 2차전인 대한민국과의 경기에서도 선발 출장했으며 아르헨티나의 모든 골(4골 가운데 3골은 곤살로 이과인이 기록한 득점(해트트릭)이었으며 나머지 1골은 대한민국의 박주영이 기록한 자책골이었다.)에 기여를 했다.[13] 또한 조별리그 3차전인 그리스와의 경기에서 메시는 경고누적을 우려하여 결장한 하비에르 마스체라노를 대신하여 주장 완장을 착용한 채 경기에 임했고, 좋은 경기력으로 상대를 위협하면서 무득점에도 맨 오브 더 매치에 선정되었다. "메시는 최고의 선수였다. 선수들이 경기 끝나고 '축구 하기 싫어졌다'고 할 정도였다. 워낙 훌륭한 선수라 막아낼 힘이 나지 않았다. 뭐 저런 선수가 있나 싶었다. 수비하려고 우르르 달려들면 옆으로 툭 패스하고 빠져들어가고… 참 영리한 선수였다." - 조용형, 월드컵 조별 리그에서 아르헨티나에 1 – 4로 패한 후. 16강전에 진출하자 4년 만에 다시 만난 상대인 멕시코를 상대로도 좋은 경기력을 보여줬으며 카를로스 테베스에게 어시스트를 기록하면서 테베스가 골을 넣을 수 있도록 도와줬다. 하지만 이 경기는 당시 오심 논란으로 화제가 되기도 했다. 테베스는 경기 직후 인터뷰에서 득점을 한 이후 주심을 쳐다봤고 주심이 오프사이드 판정을 내릴것이라 생각했지만 자신의 생각과 다르게 오프사이드 판정이 내려지지않아 그때서야 기뻐할 수 있었다고 한다. 실제로 정지된 화면으로 보면 메시에게서 공이 연결되는 순간 테베스는 완벽한 오프사이드 위치에 있었다."""
for sent in split_sentences(data):
print(sent)
메시는 조별라운드 1차전인 나이지리아와의 경기에 선발 출전했으나 상대 골키퍼인 빈센트 에니에아마의 선방들에 막혀 골을 기록하지는 못했다.[12]
조별라운드 2차전인 대한민국과의 경기에서도 선발 출장했으며 아르헨티나의 모든 골(4골 가운데 3골은 곤살로 이과인이 기록한 득점(해트트릭)이었으며 나머지 1골은 대한민국의 박주영이 기록한 자책골이었다.)에 기여를 했다.[13]
또한 조별리그 3차전인 그리스와의 경기에서 메시는 경고누적을 우려하여 결장한 하비에르 마스체라노를 대신하여 주장 완장을 착용한 채 경기에 임했고, 좋은 경기력으로 상대를 위협하면서 무득점에도 맨 오브 더 매치에 선정되었다.
"메시는 최고의 선수였다. 선수들이 경기 끝나고 '축구 하기 싫어졌다'고 할 정도였다. 워낙 훌륭한 선수라 막아낼 힘이 나지 않았다. 뭐 저런 선수가 있나 싶었다. 수비하려고 우르르 달려들면 옆으로 툭 패스하고 빠져들어가고… 참 영리한 선수였다."
- 조용형, 월드컵 조별 리그에서 아르헨티나에 1 – 4로 패한 후.
16강전에 진출하자 4년 만에 다시 만난 상대인 멕시코를 상대로도 좋은 경기력을 보여줬으며 카를로스 테베스에게 어시스트를 기록하면서 테베스가 골을 넣을 수 있도록 도와줬다.
하지만 이 경기는 당시 오심 논란으로 화제가 되기도 했다.
테베스는 경기 직후 인터뷰에서 득점을 한 이후 주심을 쳐다봤고 주심이 오프사이드 판정을 내릴것이라 생각했지만 자신의 생각과 다르게 오프사이드 판정이 내려지지않아 그때서야 기뻐할 수 있었다고 한다.
실제로 정지된 화면으로 보면 메시에게서 공이 연결되는 순간 테베스는 완벽한 오프사이드 위치에 있었다.
from kss import split_sentences
data = """¶ 나무위키는 2015년 4월 17일에 설립된, 이용자의 자유와 권리를 평등하게 보장하고 지식과 정보의 공유에 힘쓰기 위해 개설된 위키이다.위키 사이트로서 나무위키는 특정 영역에 편중되지 않은, 학문·서브컬처 등 다양한 분야를 포용하여 진흥시키는 것을 목표로 하며, 경직되고 건조한 서술이 아닌 어느 정도 재미도 갖춘 서술을 지향한다.나무위키는 토론을 통해 중립적이고 사실적인 서술과 특정한 관점·세력에 종속되지 않는 서술을 지향하며, 보편적인 인권과 윤리에 어긋나는 사상과 집단을 배격한다. ¶ 나무위키는 문서를 작성하고 편집하기 위한 특별한 자격 증명을 두지 않는다. 다만, 나무위키의 편집자들이 모두 일관된 생각을 하고 있는 것은 아니기에, 분쟁이 발생할 시 이용자 간의 정당하고 자유로운 토론을 통하여 합의점을 도출함을 원칙으로 한다. 이러한 원칙이 지켜질 때 나무위키는 이용자의 자유로운 문서 서술과 토론을 보장한다. 그러나 타인의 의견을 무시하는 행위, 차별과 비하를 조장하는 행위는 용인되지 않으며, 이러한 행위를 할 시 제재될 수 있다. ¶ 나무위키의 이용자에 의한 자율운영, 분쟁 해결 시 최소한의 가이드라인의 정립을 통해 선량한 이용자들의 자유로운 위키 활동을 보장하기 위해서 2015년 5월 3일부터 나무위키 이용자들의 지속적인 자유토론을 통하여 본 기본방침을 작성하였고, 2015년 9월 5일 규정토론에 참여한 토론자 전원을 포함한 이용자의 합의에 따라 본 기본방침을 공표한다."""
for sent in split_sentences(data):
print(sent)
¶ 나무위키는 2015년 4월 17일에 설립된, 이용자의 자유와 권리를 평등하게 보장하고 지식과 정보의 공유에 힘쓰기 위해 개설된 위키이다.
위키 사이트로서 나무위키는 특정 영역에 편중되지 않은, 학문·서브컬처 등 다양한 분야를 포용하여 진흥시키는 것을 목표로 하며, 경직되고 건조한 서술이 아닌 어느 정도 재미도 갖춘 서술을 지향한다.
나무위키는 토론을 통해 중립적이고 사실적인 서술과 특정한 관점·세력에 종속되지 않는 서술을 지향하며, 보편적인 인권과 윤리에 어긋나는 사상과 집단을 배격한다.
¶ 나무위키는 문서를 작성하고 편집하기 위한 특별한 자격 증명을 두지 않는다.
다만, 나무위키의 편집자들이 모두 일관된 생각을 하고 있는 것은 아니기에, 분쟁이 발생할 시 이용자 간의 정당하고 자유로운 토론을 통하여 합의점을 도출함을 원칙으로 한다.
이러한 원칙이 지켜질 때 나무위키는 이용자의 자유로운 문서 서술과 토론을 보장한다.
그러나 타인의 의견을 무시하는 행위, 차별과 비하를 조장하는 행위는 용인되지 않으며, 이러한 행위를 할 시 제재될 수 있다.
¶ 나무위키의 이용자에 의한 자율운영, 분쟁 해결 시 최소한의 가이드라인의 정립을 통해 선량한 이용자들의 자유로운 위키 활동을 보장하기 위해서 2015년 5월 3일부터 나무위키 이용자들의 지속적인 자유토론을 통하여 본 기본방침을 작성하였고, 2015년 9월 5일 규정토론에 참여한 토론자 전원을 포함한 이용자의 합의에 따라 본 기본방침을 공표한다.
\n
)가 살아 있어야 이렇게 나타낼 수 있습니다. 단 문장간의 행갈이는 필요 없습니다.from kss import split_sentences
data = """제 4절. 모델링\n그래서 우리는 모델의 레이어는 28개로 정했고*, 보캡사이즈는 50400으로 설정하였다.† 참고로 GPT(Generative Pre-trained Transformers)계열의 모델들은 OpenAI에서 발표하였고, NLG 작업을 수행할 수 있는 모델이다. 자기회귀 언어모델(Autoregressive Language Model)이라고 하는데, 과거의 텍스트를 디코더의 입력으로 받아 현재의 텍스트를 예측하여 출력한다. * 각 레이어는 하나의 피드포워드 블록과 하나의 셀프 어텐션 블록으로 구성된다. † 임베딩 매트릭스의 크기는 50400이지만 GPT-2 토크나이저는 50257 항목만 사용한다."""
for sent in split_sentences(data):
print(sent)
제 4 절. 모델링
그래서 우리는 모델의 레이어는 28개로 정했고*, 보캡사이즈는 50400으로 설정하였다.†
참고로 GPT(Generative Pre-trained Transformers)계열의 모델들은 OpenAI에서 발표하였고, NLG 작업을 수행할 수 있는 모델이다.
자기회귀 언어모델(Autoregressive Language Model)이라고 하는데, 과거의 텍스트를 디코더의 입력으로 받아 현재의 텍스트를 예측하여 출력한다.
* 각 레이어는 하나의 피드포워드 블록과 하나의 셀프 어텐션 블록으로 구성된다.
† 임베딩 매트릭스의 크기는 50400이지만 토크나이저는 50257 항목만 사용한다.
\n
)가 살아 있어야 이렇게 나타낼 수 있습니다. 단 문장간의 행갈이는 필요 없습니다.from kss import split_sentences
data = """1. 서론\n문장이란 생각이나 감정을 말로 표현할 때 완결된 내용을 나타내는 최소의 단위로, 자연어 처리의 주요 작업들에서 문장이 기본적인 처리 단위가 된다. 문장 단위의 작업을 수행하기 위해서는 우선 문장의 경계를 인식하는 것이 필요하다[1]. 최근 다양한 SNS 플랫폼이 등장하고, 이용자의 수가 급증함에 따라 온라인에서 얻을 수 있는 다양한 분야의 정보 활용 가치가 높아지고 있다. 일반적으로 문어체는 비교적 정확한 구두점을 사용하며, 제한된 종결어미를 사용하고 있으므로 비교적 간단하게 문장 경계를 인식할 수 있다. 기존에 공개된 여러 문장 경계 인식기1)는 일 반 문서에 대해 높은 성능을 보인다. 반면 댓글이나 SNS 문서에는 좋은 성능을 보이지 않는다. 그 이유는 SNS 문 서의 다음과 같은 특징을 고려하지 않았기 때문이다. 1) 구두점이 자주 생략된다. 2) 특수기호나 자소를 이용한 다양한 이모티콘이 사용된다. 3) 유행어, 줄임말 등 새로운 형태의 종결어미가 자주 사용된다. 본 논문은 문어체뿐 아니라 SNS에서 사용되는 다양한 문체에서도 잘 적용되는 문장 경계 인식기를 제안한다. 제안된 문장 경계 인식기는 SNS 문서에 잘 적용되도록 다음의 두 가지를 개선한다. 첫째로 학습 말뭉치를 확장 한다. 학습 말뭉치를 일반 문서로만 제한하지 않고, SNS 문서도 함께 학습할 수 있도록 학습 말뭉치에 SNS 문서를 추가한다. 둘째로 자질 집합을 확장한다. 기존의 문장 경계 인식기의 자질을 이용하여 말뭉치의 범위만 늘리는 것으로는 성능을 높이기에 한계가 있어 각종 자소, 특수기호, 이모티콘을 추가하여 다양한 형식으로 문장이 종결되는 SNS 문서에 적합하도록 개선한다. 이와 같은 개선법을 적용하여 CRF로 학습한 제안된 모델은 일반 문서뿐 아니라 SNS 문서에서도 좋은 성능을 보였다. 본 논문의 구성을 다음과 같다. 2장에서 문장 분리에 관련된 연구를 조사하고, 3장에서 SNS 문서에서의 다양한 고려사항을 자세히 기술한다. 4장에서는 각각 제안된 모델을 평가하고 5장에서 결론을 맺고 향후 연구에 대해 기술한다.\n4. 실험 및 분석\n4.1 실험 환경\n훈련 및 평가를 위해 3장에서 기술한 말뭉치 구축 방법에 따라 일반 문서와 SNS 문서에서 문장을 추출하여 전체 말뭉치를 구성하였다. 전체 말뭉치 중에서 훈련 및 평가 말뭉치를 표 3과 같이 분리하였다.\n\n5. 결론 및 향후 연구\n본 논문에서는 기계학습 방법을 이용하여 문어체로 이루어진 일반 문서와 비형식적인 문장으로 구성된 SNS 문서 문장 경계 인식 모델을 제안하였다. 학습 말뭉치의 영역을 일반 문서와 SNS 문서로 확장하고, SNS 문서에서 자주 보이는 형태의 단어 유형을 새로 정의해 이를 자질로 사용하여 효과적으로 문장 경계 인식을 수행하였다. 제안한 모델은 일반 문서의 문장 경계 인식 성능으로 99.1%의 재현율을 보였으며, SNS 문서에서도 88.3%의 높은 재현율을 보였다. 향후 연구로는 후처리 규칙을 이용하여 재현율을 더 높여 다양한 내용의 말뭉치를 사용하여 더 넓은 분야에서 이용 가능한 문장 경계 인식기를 제안하고자 한다.\n참고문헌\n[1] 김주희, 서정연, “비형식적인 문서에 강건한 문장 경계 인식”,한국컴퓨터종합학술대회 논문집, vol. 37, no. 1, pp. 266-270, 2010.\n[2] M. D. Riley, “Some Applications of Tree-based Modeling to Speech and Language”, Proceedings of the DARPA Speech and Natural Language Workshop, pp. 339-352, 1989\n[3] 임희석, 한군희, “메모리 기반의 기계 학습을 이용한 한국어 문장 경계 인식”, 한국콘텐츠학회논문지 vol. 4, no. 4, pp. 133-139, 2004\n[4] 이충희, 장명길, 서영훈, "웹 문서를 위한 개선된 문장경계인식 방법", 정보과학회논문지, 소프트웨어 및 응용, 제37권, 제6호, pp. 455-465, 2010.\n[5] 이주은, 구민서, 김선홍, 신호섭, “블로그 데이터에 대한 문장 경계 인식”, 한국HCI학회 학술대회, pp.1221-1223, 2014"""
for sent in split_sentences(data):
print(sent)
1. 서론
문장이란 생각이나 감정을 말로 표현할 때 완결된 내용을 나타내는 최소의 단위로, 자연어 처리의 주요 작업들에서 문장이 기본적인 처리 단위가 된다.
문장 단위의 작업을 수행하기 위해서는 우선 문장의 경계를 인식하는 것이 필요하다[1].
최근 다양한 SNS 플랫폼이 등장하고, 이용자의 수가 급증함에 따라 온라인에서 얻을 수 있는 다양한 분야의 정보 활용 가치가 높아지고 있다.
일반적으로 문어체는 비교적 정확한 구두점을 사용하며, 제한된 종결어미를 사용하고 있으므로 비교적 간단하게 문장 경계를 인식할 수 있다.
기존에 공개된 여러 문장 경계 인식기1)는 일 반 문서에 대해 높은 성능을 보인다.
반면 댓글이나 SNS 문서에는 좋은 성능을 보이지 않는다.
그 이유는 SNS 문 서의 다음과 같은 특징을 고려하지 않았기 때문이다.
1) 구두점이 자주 생략된다.
2) 특수기호나 자소를 이용한 다양한 이모티콘이 사용된다.
3) 유행어, 줄임말 등 새로운 형태의 종결어미가 자주 사용된다.
본 논문은 문어체뿐 아니라 SNS에서 사용되는 다양한 문체에서도 잘 적용되는 문장 경계 인식기를 제안한다.
제안된 문장 경계 인식기는 SNS 문서에 잘 적용되도록 다음의 두 가지를 개선한다.
첫째로 학습 말뭉치를 확장 한다.
학습 말뭉치를 일반 문서로만 제한하지 않고, SNS 문서도 함께 학습할 수 있도록 학습 말뭉치에 SNS 문서를 추가한다.
둘째로 자질 집합을 확장한다.
기존의 문장 경계 인식기의 자질을 이용하여 말뭉치의 범위만 늘리는 것으로는 성능을 높이기에 한계가 있어 각종 자소, 특수기호, 이모티콘을 추가하여 다양한 형식으로 문장이 종결되는 SNS 문서에 적합하도록 개선한다.
이와 같은 개선법을 적용하여 CRF로 학습한 제안된 모델은 일반 문서뿐 아니라 SNS 문서에서도 좋은 성능을 보였다.
본 논문의 구성을 다음과 같다.
2장에서 문장 분리에 관련된 연구를 조사하고, 3장에서 SNS 문서에서의 다양한 고려사항을 자세히 기술한다.
4장에서는 각각 제안된 모델을 평가하고 5장에서 결론을 맺고 향후 연구에 대해 기술한다.
4. 실험 및 분석
4.1 실험 환경
훈련 및 평가를 위해 3장에서 기술한 말뭉치 구축 방법에 따라 일반 문서와 SNS 문서에서 문장을 추출하여 전체 말뭉치를 구성하였다.
전체 말뭉치 중에서 훈련 및 평가 말뭉치를 표 3과 같이 분리하였다.
5. 결론 및 향후 연구
본 논문에서는 기계학습 방법을 이용하여 문어체로 이루어진 일반 문서와 비형식적인 문장으로 구성된 SNS 문서 문장 경계 인식 모델을 제안하였다.
학습 말뭉치의 영역을 일반 문서와 SNS 문서로 확장하고, SNS 문서에서 자주 보이는 형태의 단어 유형을 새로 정의해 이를 자질로 사용하여 효과적으로 문장 경계 인식을 수행하였다.
제안한 모델은 일반 문서의 문장 경계 인식 성능으로 99.1%의 재현율을 보였으며, SNS 문서에서도 88.3%의 높은 재현율을 보였다.
향후 연구로는 후처리 규칙을 이용하여 재현율을 더 높여 다양한 내용의 말뭉치를 사용하여 더 넓은 분야에서 이용 가능한 문장 경계 인식기를 제안하고자 한다.
참고문헌
[1] 김주희, 서정연, “비형식적인 문서에 강건한 문장 경계 인식”,한국컴퓨터종합학술대회 논문집, vol. 37, no. 1, pp. 266-270, 2010.
[2] M. D. Riley, “Some Applications of Tree-based Modeling to Speech and Language”, Proceedings of the DARPA Speech and Natural Language Workshop, pp. 339-352, 1989
[3] 임희석, 한군희, “메모리 기반의 기계 학습을 이용한 한국어 문장 경계 인식”, 한국콘텐츠학회논문지 vol. 4, no. 4, pp. 133-139, 2004
[4] 이충희, 장명길, 서영훈, "웹 문서를 위한 개선된 문장경계인식 방법", 정보과학회논문지, 소프트웨어 및 응용, 제37권, 제6호, pp. 455-465, 2010.
[5] 이주은, 구민서, 김선홍, 신호섭, “블로그 데이터에 대한 문장 경계 인식”, 한국HCI학회 학술대회, pp.1221-1223, 2014
Published by hyunwoongko almost 2 years ago
Add footnote processing