Как разделить тайское предложение, которое не использует пробелы, в слова?

Как разделить слово от тайского предложения? На английском мы можем разделить слово на пробел.

Пример: I go to school, split = ['I', 'go', 'to' ,'school'] Разделить, просмотрев только пробел.

Но у тайского языка не было места, поэтому я не знаю, как это сделать. Пример spit ฉัน จะ ไป โรงเรียน от txt файла до ['ฉัน' 'จะ' 'ไป' 'โรง' 'เรียน'] = вывод другого txt файла.

Существуют ли какие-либо программы или библиотеки, которые идентифицируют тайские границы слов и разделяют?

Ответ 1

В 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;
  }

Ответ 2

Простейшим сегментом для китайцев и японцев является использование жадной схемы, основанной на словах. Это должно работать так же хорошо, как и для тайского языка - получите словарь тайских слов, а в текущем символе - самую длинную строку из этого символа, которая существует в словаре. Это дает вам довольно приличный сегмент, по крайней мере, на китайском и японском языках.

Ответ 3

Существует несколько способов сделать "токенизацию тайских слов". Один из способов - использовать словарь или основанную на шаблонах. В этом случае алгоритм будет проходить через символы, и если он появится в словаре, мы будем считать как слово.

Кроме того, есть также недавние библиотеки, чтобы токенизировать тайский текст, где он обучал Глубокое обучение, чтобы символизировать тайское слово на BEST corpus, включая rkcosmos/deepcut, pucktada/cutkum и т.д.

Пример использования deepcut:

import deepcut
deepcut.tokenize('ฉันจะไปโรงเรียน')
# output as ['ฉัน', 'จะ', 'ไป', 'โรง', 'เรียน']