Разбить слова на слоги (символы гуджарати) для гуджарати - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь токенизировать слово Gujarati (язык Indian) в символы.

Пример: word - слово, тогда я хочу список символов, таких как [વા, ન, ર]

Я пробовал java.text.BreakIterator с Gujarati locale, но это не сработало.Хотя он отлично работает для Hindi.

Вот код:

import java.text.*;
import java.util.*;

public class Language{
    public static void main(String[] args) {
        String text = "વાનર";
        Locale gujarati = new Locale("gu","IN");
        BreakIterator breaker = BreakIterator.getCharacterInstance(gujarati);
        breaker.setText(text);
        int start = breaker.first();
        for (int end = breaker.next(); end != BreakIterator.DONE; start = end, end = breaker.next()) {
            System.out.println(text.substring(start,end));
        }    
    }
}

Ouput:

વ
ા
ન
ર

Есть ли какая-нибудь библиотека, которая может сделать это правильно?Я в порядке с языками, отличными от Java

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Я написал небольшую функцию Python для преобразования Gujarati слов в список Syllables. Мой код вдохновлен этим репозиторием Github libindic / syllabalizer .

Код:

def syllabify_gu(text):
        signs = [u'\u0abe',
                u'\u0abf',
                u'\u0ac0', 
                u'\u0ac1', 
                u'\u0ac2', 
                u'\u0ac3', 
                u'\u0ac4', 
                u'\u0ac5',
                u'\u0ac7', 
                u'\u0ac8', 
                u'\u0ac9',
                u'\u0acb',
                u'\u0acc',
                u'\u0a81',
                u'\u0a82',
                u'\u0a83',
                u'\u0acd'] 
        limiters = ['\"', '\'', '`', '!', ';', ', ', '?', '.']

        lst_chars = []
        for char in text:
            if char in limiters:
                lst_chars.append(char)
            elif char in signs:
                lst_chars[-1] = lst_chars[-1] + char
            else:
                try:
                    if char == u'\u0ab0' and len(lst_chars) > 0 and lst_chars[-1][-1] == u'\u0acd' and lst_chars[-1][-2] == u'\u0aa4': 
                        lst_chars[-1] = lst_chars[-1] + char
                    else:
                        lst_chars.append(char)
                except IndexError:
                    lst_chars.append(char)

        return lst_chars

syllabify_gu("સંગીત એ એવું પવિત્ર ઝરણું છે, જેનાં વહેતા તરંગોથી અંતરનાં તાર રણઝણી ઉઠે છે.")

Выход:

['સં',
 'ગી',
 'ત',
 ' ',
 'એ',
 ' ',
 'એ',
 'વું',
 ' ',
 'પ',
 'વિ',
 'ત્ર',
 ' ',
 'ઝ',
 'ર',
 'ણું',
 ' ',
 'છે',
 ',',
 ' ',
 'જે',
 'નાં',
 ' ',
 'વ',
 'હે',
 'તા',
 ' ',
 'ત',
 'રં',
 'ગો',
 'થી',
 ' ',
 'અં',
 'ત',
 'ર',
 'નાં',
 ' ',
 'તા',
 'ર',
 ' ',
 'ર',
 'ણ',
 'ઝ',
 'ણી',
 ' ',
 'ઉ',
 'ઠે',
 ' ',
 'છે',
 '.']

Найти Юникод для символов гуджарати здесь .

0 голосов
/ 24 января 2019

Не уверен, что эта библиотека дает точное решение, которое вы хотите, но я написал библиотеку под названием MgntUtils и опубликовал ее как открытый исходный код, доступный как артефакт Maven на Maven central (см. здесь ), а также github Там есть утилита, которая преобразует любую строку в последовательность Unicode и наоборот. Все, что вам нужно сделать, это:

String codes = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence("Hello world");

И он вернет String "\u0048\u0065\u006c\u006c\u006f\u0020\u0057\u006f\u0072\u006c\u0064"

То же самое будет работать для любой строки на любом языке, включая специальные символы. Есть метод, который выполняет декодирование обратно:

decodeUnicodeSequenceToString(String unicodeSequence)

Вот ссылка javadoc . Вы можете легко разбить строку последовательностей юникода на отдельные юникоды и сохранить их таким образом или даже преобразовать их обратно в отдельные строки и получить своих персонажей. Вот ссылка на статью Java-библиотека с открытым исходным кодом с фильтрацией трассировки стека, конвертер Unicode для разбора Silent String и сравнение версий , в котором рассказывается о библиотеке

...