Разбиение строки на слова культурно-нейтральным способом

#c# #full-text-search

#c# #полнотекстовый поиск

Вопрос:

Я разработал приведенный ниже метод, целью которого является разбиение текста переменной длины на массив слов для дальнейшей обработки полнотекстового индекса (удаление стоп-слова с последующим использованием stemmer). Результаты кажутся приемлемыми, но я хотел бы услышать мнения о том, насколько надежна эта реализация в отношении текстов на разных языках. Вы бы порекомендовали использовать регулярное выражение для этого вместо этого? Пожалуйста, обратите внимание, что я отказался от использования String.Split() потому что это потребовало бы от меня передачи списка всех известных разделителей, чего именно я пытался избежать, когда писал функцию

P.S: Я не могу использовать полноценную полнотекстовую поисковую систему, такую как Lucene.Net по нескольким причинам (Silverlight, излишество для области проекта и т.д.).

 public string[] SplitWords(string Text)
{
    bool inWord = !Char.IsSeparator(Text[0]) amp;amp; !Char.IsControl(Text[0]);
    var result = new List<string>();
    var sbWord = new StringBuilder();

    for (int i = 0; i < Text.Length; i  )
    {
        Char c = Text[i];

        // non separator char?
        if(!Char.IsSeparator(c) amp;amp; !Char.IsControl(c))
        {
            if (!inWord)
            {
                sbWord = new StringBuilder();
                inWord = true;
            }

            if (!Char.IsPunctuation(c) amp;amp; !Char.IsSymbol(c))
                sbWord.Append(c);
        }

        // it is a separator or control char
        else
        {
            if (inWord)
            {
                string word = sbWord.ToString();
                if (word.Length > 0)
                    result.Add(word);

                sbWord.Clear();
                inWord = false;
            }
        }
    }

    return result.ToArray();
}
  

Ответ №1:

Поскольку вы сказали культурно-нейтральным способом, я действительно сомневаюсь, подойдет ли регулярное выражение (граница слова: b). Я немного погуглил и нашел это. Надеюсь, это было бы полезно.
Я довольно удивлен, что в Java нет встроенного эквивалента BreakIterator

Комментарии:

1. Ссылка была весьма полезной. Спасибо!