如何从泰语句子中分词?英语我们可以按空格分割。
示例:I go to school
,split = ['I', 'go', 'to' ,'school']
通过仅查看空格进行拆分。
但是泰语没有空间,所以我不知道该怎么办。 示例spitฉันจะไปโรงเรียน从txt文件到['นัน''จะ''ไป''โรง''เรียน'] =输出另一个txt文件。
是否有任何程序或库可识别泰语单词边界并分割?
答案 0 :(得分:8)
2006年,有人为Apache Lucene项目贡献了代码,以实现这一目标。
他们的方法(用Java编写)是使用BreakIterator类,调用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;
}
答案 1 :(得分:3)
有多种方法可以进行'泰语单词标记化'。一种方法是使用基于字典或基于模式。在这种情况下,算法将通过字符,如果它出现在字典中,我们将计为一个单词。
此外,最近还有一些图书馆可以对泰语文字进行标记,并在其中培训深度学习,以便在BEST corpus rkcosmos/deepcut上标记泰语单词,包括pucktada/cutkum,JSfiddle Example等。
deepcut
的使用示例:
import deepcut
deepcut.tokenize('ฉันจะไปโรงเรียน')
# output as ['ฉัน', 'จะ', 'ไป', 'โรง', 'เรียน']
答案 2 :(得分:1)
中文和日文最简单的分段是使用基于贪婪字典的方案。对于泰语来说,这应该也一样 - 获取泰语单词的字典,并在当前字符中匹配字典中存在的该字符的最长字符串。这会让你成为一个相当不错的分区,至少在中文和日文中。
答案 3 :(得分:1)
以下是使用Kotlin和ICU4J将泰文分割成单词的方法。比起Lucene的版本(最新更新为6/2011),ICU4J是更好的选择,因为ICU4J会不断更新并具有其他相关工具。在mvnrepository.com搜索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()
}