如何从泰语句子中分割单词? 英语中,我们可以通过空格来分割单词。
示例:I go to school
,分割 = ['I', 'go', 'to' ,'school']
只用空格分割。
但是泰语没有空格,所以我不知道该如何做。例如:将“ฉันจะไปโรงเรียน”从txt文件中拆分为['ฉัน' 'จะ' 'ไป' 'โรง' 'เรียน'],并输出到另一个txt文件。
是否有任何程序或库可识别泰语单词边界并进行分割?
如何从泰语句子中分割单词? 英语中,我们可以通过空格来分割单词。
示例:I go to school
,分割 = ['I', 'go', 'to' ,'school']
只用空格分割。
但是泰语没有空格,所以我不知道该如何做。例如:将“ฉันจะไปโรงเรียน”从txt文件中拆分为['ฉัน' 'จะ' 'ไป' 'โรง' 'เรียน'],并输出到另一个txt文件。
是否有任何程序或库可识别泰语单词边界并进行分割?
getWordInstance()
来获得基于字典的泰语单词迭代器。请注意,还有一个声明依赖于ICU4J项目。下面是他们代码的相关部分: private BreakIterator breaker = null;
private Token thaiToken = null;
public ThaiWordFilter(TokenStream input) {
super(input);
breaker = BreakIterator.getWordInstance(new Locale("th"));
}
public Token next() throws IOException {
if (thaiToken != null) {
String text = thaiToken.termText();
int start = breaker.current();
int end = breaker.next();
if (end != BreakIterator.DONE) {
return new Token(text.substring(start, end),
thaiToken.startOffset()+start,
thaiToken.startOffset()+end, thaiToken.type());
}
thaiToken = null;
}
Token tk = input.next();
if (tk == null) {
return null;
}
String text = tk.termText();
if (UnicodeBlock.of(text.charAt(0)) != UnicodeBlock.THAI) {
return new Token(text.toLowerCase(),
tk.startOffset(),
tk.endOffset(),
tk.type());
}
thaiToken = tk;
breaker.setText(text);
int end = breaker.next();
if (end != BreakIterator.DONE) {
return new Token(text.substring(0, end),
thaiToken.startOffset(),
thaiToken.startOffset()+end,
thaiToken.type());
}
return null;
}
有多种方法可以进行“泰语单词分词”。一种方法是使用基于字典或模式的方法。在这种情况下,算法将通过字符,并且如果它出现在字典中,我们将计算为一个单词。
此外,还有最近的库可用于对泰文进行分词,其中使用深度学习对BEST corpus上的泰语单词进行了训练,包括rkcosmos/deepcut、pucktada/cutkum等。
deepcut
的示例用法:
import deepcut
deepcut.tokenize('ฉันจะไปโรงเรียน')
# output as ['ฉัน', 'จะ', 'ไป', 'โรง', 'เรียน']
对于中文和日文来说,最简单的分词器是使用基于贪心字典的方案。这种方法同样适用于泰语——获取一个泰语单词的字典,在当前字符处,匹配存在于字典中的最长字符串。这将为您提供一个相当不错的分词器,至少在中文和日文中如此。
icu4j
可以查看所有工具。 fun splitIntoWords(s: String): List<String> {
val wordBreaker = BreakIterator.getWordInstance(Locale("th"));
wordBreaker.setText(s)
var startPos = wordBreaker.first()
var endPos = wordBreaker.next()
val words = mutableListOf<String>()
while(endPos != BreakIterator.DONE) {
words.add(s.substring(startPos,endPos))
startPos = endPos
endPos = wordBreaker.next()
}
return words.toMutableList()
}