14

如何从泰语句子中拆分单词?英语我们可以用空格分割单词。

示例:I go to school, split =['I', 'go', 'to' ,'school'] 通过仅查看空格来拆分。

但是泰语没有空间,所以我不知道该怎么做。示例将 ฉันจะไปโรงเรียน 吐出 txt 文件到 ['ฉัน' 'จะ' 'ไป' 'โรง' 'เรียน'] = 输出另一个 txt 文件。

是否有任何程序或库可以识别泰语单词边界和拆分?

4

4 回答 4

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;
  }
于 2012-12-11T18:49:18.107 回答
4

有多种方法可以进行“泰语单词标记化”。一种方法是使用基于字典或基于模式的。在这种情况下,算法将遍历字符,如果它出现在字典中,我们将算作一个单词。

此外,最近还有一些库来标记泰语文本,它训练深度学习来标记最佳语料库上的泰语单词,包括rkcosmos/deepcutpucktada/cutkum等。

的示例用法deepcut

import deepcut
deepcut.tokenize('ฉันจะไปโรงเรียน')
# output as ['ฉัน', 'จะ', 'ไป', 'โรง', 'เรียน']
于 2017-07-05T22:31:35.190 回答
1

中文和日文最简单的分割器是使用基于贪心字典的方案。这对于泰语应该也适用——获取泰语单词字典,并在当前字符处匹配字典中存在的该字符的最长字符串。这会让你成为一个相当不错的分割器,至少在中文和日文中是这样。

于 2012-12-12T12:02:20.000 回答
1

这是使用 Kotlin 和 ICU4J 将泰语文本拆分为单词的方法。ICU4J 是比 Lucene 的版本(最后更新 6/2011)更好的选择,因为 ICU4J 不断更新并且有额外的相关工具。icu4jmvnrepository.com上搜索以查看所有内容。

 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()
}
于 2020-07-15T15:59:31.560 回答