韩语句子分割器
使用启发式算法分割韩语文本为句子。
示例
1. 安装
dependencies:
...
kss_dart:
2. splitSentences 的用法
List<String> splitSentences(
String text,
{boolean useHeuristic = true,
boolean useQuotesBracketsProcessing = true,
int maxRecoverStep = 5,
int maxRecoverLength = 20000,
int recoverStep = 0}
)
2.1. 使用启发式算法分割句子。
splitSentences是 Kss 的关键方法。- 您可以使用此方法将文本分段为句子。
import 'package:kss_dart/kss_dart.dart';
Kss kss = Kss();
String text = "회사 동료 분들과 다녀왔는데 분위기도 좋고 음식도 맛있었어요 다만, 강남 토끼정이 강남 쉑쉑버거 골목길로 쭉 올라가야 하는데 다들 쉑쉑버거의 유혹에 넘어갈 뻔 했답니다 강남역 맛집 토끼정의 외부 모습.";
kss.splitSentences(text);
["회사 동료 분들과 다녀왔는데 분위기도 좋고 음식도 맛있었어요,"
"다만, 강남 토끼정이 강남 쉑쉑버거 골목길로 쭉 올라가야 하는데 다들 쉑쉑버거의 유혹에 넘어갈 뻔 했답니다,"
"강남역 맛집 토끼정의 외부 모습."]
2.2. 不使用启发式算法分割句子。
- 如果您的文章在标点符号规则方面遵循得相对较好,我们建议您将
useHeuristic = false。 (默认为true) - 在这种情况下,Kss 仅根据标点符号分割文本,您可以更安全地分割文本。
- 正式文章 (维基、新闻、散文等):建议
useHeuristic = false - 非正式文章 (SNS、博客、消息等):建议
useHeuristic = true
- 正式文章 (维基、新闻、散文等):建议
import 'package:kss_dart/kss_dart.dart';
Kss kss = Kss();
String text = "미리 예약을 할 수 있는 시스템으로 합리적인 가격에 여러 종류의 생선, 그리고 다양한 부위를 즐길 수 있기 때문이다. 계절에 따라 모둠회의 종류는 조금씩 달라지지만 자주 올려주는 참돔 마스까와는 특히 맛이 매우 좋다. 일반 모둠회도 좋지만 좀 더 특별한 맛을 즐기고 싶다면 특수 부위 모둠회를 추천한다 제철 생선 5~6가지 구성에 평소 접하지 못했던 부위까지 색다르게 즐길 수 있다.";
kss.splitSentences(text, useHeuristic : false);
["미리 예약을 할 수 있는 시스템으로 합리적인 가격에 여러 종류의 생선, 그리고 다양한 부위를 즐길 수 있기 때문이다.",
"계절에 따라 모둠회의 종류는 조금씩 달라지지만 자주 올려주는 참돔 마스까와는 특히 맛이 매우 좋다.",
"제철 생선 5~6가지 구성에 평소 접하지 못했던 부위까지 색다르게 즐길 수 있다."]
2.3. 括号和引号处理
- Kss 提供了一种技术,可以防止分割括在括号 (괄호) 或引号 (따옴표) 中的句子。
import 'package:kss_dart/kss_dart.dart';
Kss kss = Kss();
String text = "그가 말했다. '거기는 가지 마세요. 위험하니까요. 알겠죠?' 그러자 그가 말했다. 알겠어요.";
kss.splitSentences(text)
["그가 말했다.","'거기는 가지 마세요. 위험하니까요. 알겠죠?' 그러자 그가 말했다.","알겠어요."]
2.3.1. 优化递归的几个选项
- 然而,当括号和引号不对齐时,这可能会导致问题,这是 Kss 1.x (C++ 版本) 的一个长期存在的问题。
- 从 Kss 2.xx 开始,我们提供了引号和括号校准功能来解决这个问题,但它使用递归且时间复杂度非常差,为 O(2^n)。
- 因此,我们还提供了几个选项来优化递归。您可以使用这些选项来节省宝贵的时间。
- 可以通过参数
maxRecoverStep修改递归深度。(默认为 5) - 您可以使用
maxRecoverLength参数关闭校准。(默认为 20,000)
- 可以通过参数
import 'package:kss_dart/kss_dart.dart';
Kss kss = Kss();
Kss kss = new Kss();
String text = "VERY_LONG_TEXT";
splitSentences(text, useHeuristic : true, useQuotesBracketProcessing : true, maxRecoverStep : 5);
// you can adjust recursion depth using `maxRecoverStep` (default is 5)
splitSentences(text, useHeuristic : true, useQuotesBracketProcessing: true, maxRecoverStep : 5, maxRecoverLength : 20000);
// you can turn it off when you input very long text using `maxRecoverLength` (default is 20000)
2.3.2. 关闭括号和引号处理
- 如果您愿意,也可以关闭括号和引号处理。
- 将
useQuotesBracketsProcessing = false来关闭它。
import 'package:kss_dart/kss_dart.dart';
Kss kss = Kss();
String text = "그가 말했다. (거기는 가지 마세요. 위험하니까요. 알겠죠?) 그러자 그가 말했다. 알겠어요.";
kss.splitSentences(text);
['그가 말했다.','(거기는 가지 마세요. 위험하니까요. 알겠죠?) 그러자 그가 말했다.','알겠어요.']
kss.splitSentences(text, overlap : true, useHeuristic : false);
['그가 말했다.','(거기는 가지 마세요.','위험하니까요.','알겠죠?',') 그러자 그가 말했다.','알겠어요.']
3. splitChunks 的用法
List<ChunkWithIndex> splitChunks(
String text,
int maxLength ,
{boolean overlap = false,
boolean useHeuristic = true,
boolean useQuotesBracketsProcessing = true,
int maxRecoverStep = 5,
int maxRecoverLength = 20000 }
)
3.1. 通过 maxLength 设置块的最大长度
splitChunks将句子组合成长度不超过maxLength的块。- 您可以使用
maxLength设置一个块的最大长度。
import 'package:kss_dart/kss_dart.dart';
Kss kss = 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의 부분집합 정도를 제공한다.")]
3.2. 跨块重叠句子
- 如果
overlap为true,文本将类似于滑动窗口进行分块。 - 如果启用此功能,每个块都允许重复句子。
import 'package:kss_dart/kss_dart.dart';
Kss kss = 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, overlap : false, useHeuristic : 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의 부분집합 정도를 제공한다.")]
3.3. 使用 splitSentences 中使用的所有选项
- 您可以使用
splitSentences中使用的所有选项。 - 例如,如果您想关闭关于引号的处理,您可以将
useQuotesBracketsProcessing设置为与 split_sentences 相同。
import 'package:kss_dart/kss_dart.dart';
Kss kss = 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, overlap : false, useHeuristic : true, useQuotesBracketsProcessing : false); // text maxLength, overlap, useHeuristic, useQuotesBracketsProcessing,
4. 参考资料
Kss 可用于多种编程语言。
-
Flutter 版本 (v2.10.4),Dart 版本 (v2.16.2) 基于 Kss 2.6.0,未来将更新至 3.xx。
-
Java 版本 (此仓库,v2.6.1) 基于 Kss 2.6.0,未来将更新至 3.xx。
-
Python 版本 包含 Kss 的最新更改。
-
C++ 版本 (v1.3.1) 是 Kss 的原始实现,但现已弃用。
