Split Korean text into sentences using heuristic algorithm.
- Maven
<dependency>
<groupId>io.github.sangdee</groupId>
<artifactId>kss-java</artifactId>
<version>2.6.1</version>
</dependency>- Gradle
repositories {
mavenCentral()
}
dependencies {
implementation 'io.github.sangdee:kss-java:2.6.1'
}ArrayList<String> splitSentences(
String text,
boolean useHeuristic, //default = true
boolean useQuotesBracketsProcessing, //default = true
int maxRecoverStep, //default = 5
int maxRecoverLength, // default = 20000
int recoverStep //default = 0
) splitSentencesis the key method of Kss.- You can segment text to sentences with this method.
import kss.Kss;
Kss kss = new Kss();
String text = "ํ์ฌ ๋๋ฃ ๋ถ๋ค๊ณผ ๋ค๋
์๋๋ฐ ๋ถ์๊ธฐ๋ ์ข๊ณ ์์๋ ๋ง์์์ด์ ๋ค๋ง, ๊ฐ๋จ ํ ๋ผ์ ์ด ๊ฐ๋จ ์์๋ฒ๊ฑฐ ๊ณจ๋ชฉ๊ธธ๋ก ์ญ ์ฌ๋ผ๊ฐ์ผ ํ๋๋ฐ ๋ค๋ค ์์๋ฒ๊ฑฐ์ ์ ํน์ ๋์ด๊ฐ ๋ป ํ๋ต๋๋ค ๊ฐ๋จ์ญ ๋ง์ง ํ ๋ผ์ ์ ์ธ๋ถ ๋ชจ์ต.";
kss.splitSentences(text);["ํ์ฌ ๋๋ฃ ๋ถ๋ค๊ณผ ๋ค๋
์๋๋ฐ ๋ถ์๊ธฐ๋ ์ข๊ณ ์์๋ ๋ง์์์ด์,"
"๋ค๋ง, ๊ฐ๋จ ํ ๋ผ์ ์ด ๊ฐ๋จ ์์๋ฒ๊ฑฐ ๊ณจ๋ชฉ๊ธธ๋ก ์ญ ์ฌ๋ผ๊ฐ์ผ ํ๋๋ฐ ๋ค๋ค ์์๋ฒ๊ฑฐ์ ์ ํน์ ๋์ด๊ฐ ๋ป ํ๋ต๋๋ค,"
"๊ฐ๋จ์ญ ๋ง์ง ํ ๋ผ์ ์ ์ธ๋ถ ๋ชจ์ต."]- If your articles follow the punctuation rules reratively well, we recommend to you set the
useHeuristic = false. (default istrue) - In these cases, Kss segments text depending only on punctuataion and you can segment text much more safely.
- Formal articles (Wiki, News, Essay, ...) : recommend
useHeuristic = false - Informal articles (SNS, Blogs, Messages, ...) : recommend
useHeuristic = true
- Formal articles (Wiki, News, Essay, ...) : recommend
import kss.Kss;
Kss kss = new Kss();
String text = "๋ฏธ๋ฆฌ ์์ฝ์ ํ ์ ์๋ ์์คํ
์ผ๋ก ํฉ๋ฆฌ์ ์ธ ๊ฐ๊ฒฉ์ ์ฌ๋ฌ ์ข
๋ฅ์ ์์ , ๊ทธ๋ฆฌ๊ณ ๋ค์ํ ๋ถ์๋ฅผ ์ฆ๊ธธ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ณ์ ์ ๋ฐ๋ผ ๋ชจ๋ ํ์ ์ข
๋ฅ๋ ์กฐ๊ธ์ฉ ๋ฌ๋ผ์ง์ง๋ง ์์ฃผ ์ฌ๋ ค์ฃผ๋ ์ฐธ๋ ๋ง์ค๊น์๋ ํนํ ๋ง์ด ๋งค์ฐ ์ข๋ค. ์ผ๋ฐ ๋ชจ๋ ํ๋ ์ข์ง๋ง ์ข ๋ ํน๋ณํ ๋ง์ ์ฆ๊ธฐ๊ณ ์ถ๋ค๋ฉด ํน์ ๋ถ์ ๋ชจ๋ ํ๋ฅผ ์ถ์ฒํ๋ค ์ ์ฒ ์์ 5~6๊ฐ์ง ๊ตฌ์ฑ์ ํ์ ์ ํ์ง ๋ชปํ๋ ๋ถ์๊น์ง ์๋ค๋ฅด๊ฒ ์ฆ๊ธธ ์ ์๋ค.";
kss.splitSentences(text, false); ["๋ฏธ๋ฆฌ ์์ฝ์ ํ ์ ์๋ ์์คํ
์ผ๋ก ํฉ๋ฆฌ์ ์ธ ๊ฐ๊ฒฉ์ ์ฌ๋ฌ ์ข
๋ฅ์ ์์ , ๊ทธ๋ฆฌ๊ณ ๋ค์ํ ๋ถ์๋ฅผ ์ฆ๊ธธ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.",
"๊ณ์ ์ ๋ฐ๋ผ ๋ชจ๋ ํ์ ์ข
๋ฅ๋ ์กฐ๊ธ์ฉ ๋ฌ๋ผ์ง์ง๋ง ์์ฃผ ์ฌ๋ ค์ฃผ๋ ์ฐธ๋ ๋ง์ค๊น์๋ ํนํ ๋ง์ด ๋งค์ฐ ์ข๋ค.",
"์ ์ฒ ์์ 5~6๊ฐ์ง ๊ตฌ์ฑ์ ํ์ ์ ํ์ง ๋ชปํ๋ ๋ถ์๊น์ง ์๋ค๋ฅด๊ฒ ์ฆ๊ธธ ์ ์๋ค."]- Kss provides a technique for not segmenting sentences enclosed in brackets (๊ดํธ) or quotation marks (๋ฐ์ดํ).
import kss.Kss;
Kss kss = new Kss();
String text = "๊ทธ๊ฐ ๋งํ๋ค. '๊ฑฐ๊ธฐ๋ ๊ฐ์ง ๋ง์ธ์. ์ํํ๋๊น์. ์๊ฒ ์ฃ ?' ๊ทธ๋ฌ์ ๊ทธ๊ฐ ๋งํ๋ค. ์๊ฒ ์ด์.";
kss.splitSentences(text)
["๊ทธ๊ฐ ๋งํ๋ค.","'๊ฑฐ๊ธฐ๋ ๊ฐ์ง ๋ง์ธ์. ์ํํ๋๊น์. ์๊ฒ ์ฃ ?' ๊ทธ๋ฌ์ ๊ทธ๊ฐ ๋งํ๋ค.","์๊ฒ ์ด์."]- However, this can cause problem when brackets and quotation marks are misaligned, and it was a cronic problem of Kss 1.x (C++ version).
- From Kss 2.xx, we provide quotes and brocket calibration feature to solve this problem, but it uses recursion and has very poor time complexity O(2^n).
- So, we also provide several options to optimize recursion. You can save your precious time with these options.
- The depth of the recursion can be modified through a parameter
maxRecoverStep. (default is 5) - You can turn off calibration using the
maxRecoverLengthparameter. (default is 20,000)
- The depth of the recursion can be modified through a parameter
import kss.Kss;
Kss kss = new Kss();
String text = "VERY_LONG_TEXT";
splitSentences(text, true, true, 5);
// you can adjust recursion depth using `maxRecoverStep` (default is 5)
splitSentences(text, true, true, 5, 20000);
// you can turn it off when you input very long text using `maxRecoverLength` (default is 20000)- You can also turn off brackets and quotation marks processing if you want.
- Set
useQuotesBracketsProcessing = falseto turn it off.
import kss.Kss;
Kss kss = new Kss();
String text = "๊ทธ๊ฐ ๋งํ๋ค. (๊ฑฐ๊ธฐ๋ ๊ฐ์ง ๋ง์ธ์. ์ํํ๋๊น์. ์๊ฒ ์ฃ ?) ๊ทธ๋ฌ์ ๊ทธ๊ฐ ๋งํ๋ค. ์๊ฒ ์ด์.";
kss.splitSentences(text);
['๊ทธ๊ฐ ๋งํ๋ค.','(๊ฑฐ๊ธฐ๋ ๊ฐ์ง ๋ง์ธ์. ์ํํ๋๊น์. ์๊ฒ ์ฃ ?) ๊ทธ๋ฌ์ ๊ทธ๊ฐ ๋งํ๋ค.','์๊ฒ ์ด์.']
kss.splitSentences(text, true, false);
['๊ทธ๊ฐ ๋งํ๋ค.','(๊ฑฐ๊ธฐ๋ ๊ฐ์ง ๋ง์ธ์.','์ํํ๋๊น์.','์๊ฒ ์ฃ ?',') ๊ทธ๋ฌ์ ๊ทธ๊ฐ ๋งํ๋ค.','์๊ฒ ์ด์.'] ArrayList<ChunkWithIndex> splitChunks(
String text,
int maxLength,
boolean overlap, //default = false
boolean useHeuristic, //default = true
boolean useQuotesBracketsProcessing, //default = true
int maxRecoverStep, //default = 5
int maxRecoverLength //default = 20000
) splitChunkscombine sentences into chunks of amaxlengthor less.- You can set the maximum length of one chunk to
maxLength.
import kss.Kss;
Kss kss = new Kss();
String text = "NoSQL์ด๋ผ๊ณ ํ๋ ๋ง์ No 'English'๋ผ๊ณ ํ๋ ๋ง๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ค. ์ธ์์๋ ์์ด ๋ง๊ณ ๋ ์๋ง์ ์ธ์ด๊ฐ ์กด์ฌํ๋ค. MongoDB์์ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ ์ธ์ด์ CouchDB์์ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ ์ธ์ด๋ ์๋ก ์ ํ ๋ค๋ฅด๋ค. ๊ทธ๋ผ์๋ ์ด ๋ ์ฟผ๋ฆฌ ์ธ์ด๋ ๊ฐ์ NoSQL ์นดํ
๊ณ ๋ฆฌ์ ์ํ๋ค. ์ด์จ๊ฑฐ๋ SQL์ด ์๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ํ NoSQL์ด No RDBMS๋ฅผ ์๋ฏธํ์ง๋ ์๋๋ค. BerkleyDB๊ฐ์ ์์ธ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ No RDBMS๊ฐ NoSQL์ธ ๊ฒ๋ ์๋๋ค. SQLํธํ ๋ ์ด์ด๋ฅผ ์ ๊ณตํ๋ KV-store๋ผ๋ ์์ธ๊ฐ ์ญ์ ์กด์ฌํ๋ค. ๋ฌผ๋ก KV-store์ ํน์ง์ range query๋ฅผ where์ ์ ๋ฃ์ ์ ์์ผ๋ฏ๋ก ์์ ํ SQL์ ๋ชป ๋๊ณ SQL์ ๋ถ๋ถ์งํฉ ์ ๋๋ฅผ ์ ๊ณตํ๋ค.";
kss.splitChunks(text, 128);[ChunkWithIndex(start = 0, text = "NoSQL์ด๋ผ๊ณ ํ๋ ๋ง์ No 'English'๋ผ๊ณ ํ๋ ๋ง๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ค. ์ธ์์๋ ์์ด ๋ง๊ณ ๋ ์๋ง์ ์ธ์ด๊ฐ ์กด์ฌํ๋ค. MongoDB์์ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ ์ธ์ด์ CouchDB์์ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ ์ธ์ด๋ ์๋ก ์ ํ ๋ค๋ฅด๋ค."),
ChunkWithIndex(start = 124, text = "๊ทธ๋ผ์๋ ์ด ๋ ์ฟผ๋ฆฌ ์ธ์ด๋ ๊ฐ์ NoSQL ์นดํ
๊ณ ๋ฆฌ์ ์ํ๋ค. ์ด์จ๊ฑฐ๋ SQL์ด ์๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ํ NoSQL์ด No RDBMS๋ฅผ ์๋ฏธํ์ง๋ ์๋๋ค. BerkleyDB๊ฐ์ ์์ธ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค."),
ChunkWithIndex(start = 236, text = "๊ทธ๋ฆฌ๊ณ No RDBMS๊ฐ NoSQL์ธ ๊ฒ๋ ์๋๋ค. SQLํธํ ๋ ์ด์ด๋ฅผ ์ ๊ณตํ๋ KV-store๋ผ๋ ์์ธ๊ฐ ์ญ ์ ์กด์ฌํ๋ค."),
ChunkWithIndex(start = 305, text = "๋ฌผ๋ก KV-store์ ํน์ง์ range query๋ฅผ where์ ์ ๋ฃ์ ์ ์์ผ๋ฏ๋ก ์์ ํ SQL์ ๋ชป ๋๊ณ SQL์ ๋ถ๋ถ์งํฉ ์ ๋๋ฅผ ์ ๊ณตํ๋ค.")]- If
overlapistrue, text will be chunked similar with sliding window. - Each chunk allows for duplicate sentences if you turn this feature on.
import kss.Kss;
Kss kss = new Kss();
String text = "NoSQL์ด๋ผ๊ณ ํ๋ ๋ง์ No 'English'๋ผ๊ณ ํ๋ ๋ง๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ค. ์ธ์์๋ ์์ด ๋ง๊ณ ๋ ์๋ง์ ์ธ์ด๊ฐ ์กด์ฌํ๋ค. MongoDB์์ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ ์ธ์ด์ CouchDB์์ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ ์ธ์ด๋ ์๋ก ์ ํ ๋ค๋ฅด๋ค. ๊ทธ๋ผ์๋ ์ด ๋ ์ฟผ๋ฆฌ ์ธ์ด๋ ๊ฐ์ NoSQL ์นดํ
๊ณ ๋ฆฌ์ ์ํ๋ค. ์ด์จ๊ฑฐ๋ SQL์ด ์๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ํ NoSQL์ด No RDBMS๋ฅผ ์๋ฏธํ์ง๋ ์๋๋ค. BerkleyDB๊ฐ์ ์์ธ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ No RDBMS๊ฐ NoSQL์ธ ๊ฒ๋ ์๋๋ค. SQLํธํ ๋ ์ด์ด๋ฅผ ์ ๊ณตํ๋ KV-store๋ผ๋ ์์ธ๊ฐ ์ญ์ ์กด์ฌํ๋ค. ๋ฌผ๋ก KV-store์ ํน์ง์ range query๋ฅผ where์ ์ ๋ฃ์ ์ ์์ผ๋ฏ๋ก ์์ ํ SQL์ ๋ชป ๋๊ณ SQL์ ๋ถ๋ถ์งํฉ ์ ๋๋ฅผ ์ ๊ณตํ๋ค.";
kss.splitChunks(text, 128, false, true); // text maxLength, overlap, useHeuristic,[ChunkWithIndex(start = 0, text = "NoSQL์ด๋ผ๊ณ ํ๋ ๋ง์ No 'English'๋ผ๊ณ ํ๋ ๋ง๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ค. ์ธ์์๋ ์์ด ๋ง๊ณ ๋ ์๋ง์ ์ธ์ด๊ฐ ์กด์ฌํ๋ค. MongoDB์์ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ ์ธ์ด์ CouchDB์์ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ ์ธ์ด๋ ์๋ก ์ ํ ๋ค๋ฅด๋ค."),
ChunkWithIndex(start = 43, text = "์ธ์์๋ ์์ด ๋ง๊ณ ๋ ์๋ง์ ์ธ์ด๊ฐ ์กด์ฌํ๋ค. MongoDB์์ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ ์ธ์ด์ CouchDB์์ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ ์ธ์ด๋ ์๋ก ์ ํ ๋ค๋ฅด๋ค. ๊ทธ๋ผ์๋ ์ด ๋ ์ฟผ๋ฆฌ ์ธ์ด๋ ๊ฐ์ NoSQL ์นดํ
๊ณ ๋ฆฌ์ ์ํ๋ค."),
ChunkWithIndex(start = 69, text = "MongoDB์์ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ ์ธ์ด์ CouchDB์์ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ ์ธ์ด๋ ์๋ก ์ ํ ๋ค๋ฅด๋ค. ๊ทธ๋ผ ์๋ ์ด ๋ ์ฟผ๋ฆฌ ์ธ์ด๋ ๊ฐ์ NoSQL ์นดํ
๊ณ ๋ฆฌ์ ์ํ๋ค. ์ด์จ๊ฑฐ๋ SQL์ด ์๋๊ธฐ ๋๋ฌธ์ด๋ค."),
ChunkWithIndex(start = 124, text = "๊ทธ๋ผ์๋ ์ด ๋ ์ฟผ๋ฆฌ ์ธ์ด๋ ๊ฐ์ NoSQL ์นดํ
๊ณ ๋ฆฌ์ ์ํ๋ค. ์ด์จ๊ฑฐ๋ SQL์ด ์๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ํ NoSQL์ด No RDBMS๋ฅผ ์๋ฏธํ์ง๋ ์๋๋ค. BerkleyDB๊ฐ์ ์์ธ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค."),
ChunkWithIndex(start = 180, text = "๋ํ NoSQL์ด No RDBMS๋ฅผ ์๋ฏธํ์ง๋ ์๋๋ค. BerkleyDB๊ฐ์ ์์ธ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ No RDBMS๊ฐ NoSQL์ธ ๊ฒ๋ ์๋๋ค. SQLํธํ ๋ ์ด์ด๋ฅผ ์ ๊ณตํ๋ KV-store๋ผ๋ ์์ธ๊ฐ ์ญ์ ์กด์ฌํ๋ค."),
ChunkWithIndex(start = 236, text = "๊ทธ๋ฆฌ๊ณ No RDBMS๊ฐ NoSQL์ธ ๊ฒ๋ ์๋๋ค. SQLํธํ ๋ ์ด์ด๋ฅผ ์ ๊ณตํ๋ KV-store๋ผ๋ ์์ธ๊ฐ ์ญ ์ ์กด์ฌํ๋ค. ๋ฌผ๋ก KV-store์ ํน์ง์ range query๋ฅผ where์ ์ ๋ฃ์ ์ ์์ผ๋ฏ๋ก ์์ ํ SQL์ ๋ชป ๋๊ณ SQL์ ๋ถ๋ถ์งํฉ ์ ๋๋ฅผ ์ ๊ณตํ๋ค.")]- You can use the EVERY options used in
splitSentences. - For example, if you want to turn off the processing about quotation marks, you can set
useQuotesBracketsProcessingthe same as split_sentences.
import kss.Kss;
Kss kss = new Kss();
String text = "NoSQL์ด๋ผ๊ณ ํ๋ ๋ง์ No 'English'๋ผ๊ณ ํ๋ ๋ง๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ค. ์ธ์์๋ ์์ด ๋ง๊ณ ๋ ์๋ง์ ์ธ์ด๊ฐ ์กด์ฌํ๋ค. MongoDB์์ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ ์ธ์ด์ CouchDB์์ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ ์ธ์ด๋ ์๋ก ์ ํ ๋ค๋ฅด๋ค. ๊ทธ๋ผ์๋ ์ด ๋ ์ฟผ๋ฆฌ ์ธ์ด๋ ๊ฐ์ NoSQL ์นดํ
๊ณ ๋ฆฌ์ ์ํ๋ค. ์ด์จ๊ฑฐ๋ SQL์ด ์๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ํ NoSQL์ด No RDBMS๋ฅผ ์๋ฏธํ์ง๋ ์๋๋ค. BerkleyDB๊ฐ์ ์์ธ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ No RDBMS๊ฐ NoSQL์ธ ๊ฒ๋ ์๋๋ค. SQLํธํ ๋ ์ด์ด๋ฅผ ์ ๊ณตํ๋ KV-store๋ผ๋ ์์ธ๊ฐ ์ญ์ ์กด์ฌํ๋ค. ๋ฌผ๋ก KV-store์ ํน์ง์ range query๋ฅผ where์ ์ ๋ฃ์ ์ ์์ผ๋ฏ๋ก ์์ ํ SQL์ ๋ชป ๋๊ณ SQL์ ๋ถ๋ถ์งํฉ ์ ๋๋ฅผ ์ ๊ณตํ๋ค.";
splitChunks(text, 128, false, true, false); // text maxLength, overlap, useHeuristic, useQuotesBracketsProcessing,Kss is available in various programming languages.
- Java version (this repo, ver 2.6.1) is based on Kss 2.6.0 and will be updated to 3.xx in the future.
- Python version contains the most recent changes to Kss.
- C++ version (ver 1.3.1) has the original implementation of Kss but is deprecated now.