以文化中立的方式将字符串拆分为单词

时间:2011-04-16 15:00:55

标签: c# full-text-search

我想出了下面的方法,该方法旨在将可变长度的文本拆分为一个单词数组,以进行进一步的全文索引处理(停止单词删除,然后是词干分析器)。结果似乎还可以,但我想听听这种实施对不同语言文本的可靠性。你会建议使用正则表达式吗?请注意,我选择不使用String.Split(),因为这需要我传递所有已知分隔符的列表,这正是我在编写函数时试图避免的内容

P.S:我不能使用像Lucene.Net那样的全文搜索引擎,原因有多种(Silverlight,Overkill for project scope等)。

public string[] SplitWords(string Text)
{
    bool inWord = !Char.IsSeparator(Text[0]) && !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) && !Char.IsControl(c))
        {
            if (!inWord)
            {
                sbWord = new StringBuilder();
                inWord = true;
            }

            if (!Char.IsPunctuation(c) && !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 个答案:

答案 0 :(得分:3)

既然你用文化中立的方式说,我真的怀疑正则表达式(单词边界:\ b)是否会这样做。我用Google搜索了一下,发现this。希望它会有用。
我很惊讶没有内置的Java BreakIterator等效...