#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. Ссылка была весьма полезной. Спасибо!