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 に答える
1

中国語と日本語の最も単純なセグメンターは、貪欲な辞書ベースのスキームを使用することです。これはタイ語でも同様に機能するはずです。タイ語の辞書を取得し、現在の文字で、辞書に存在するその文字の最長の文字列と一致させます。これにより、少なくとも中国語と日本語で、かなりまともなセグメンターが得られます。

于 2012-12-12T12:02:20.000 に答える
1

Kotlin と ICU4J を使用して、タイ語のテキストを単語に分割する方法を次に示します。ICU4J は常に更新され、関連ツールが追加されているため、Lucene のバージョン (最終更新日は 2011 年 6 月) よりも 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()
}
于 2020-07-15T15:59:31.560 に答える