停用词过滤不完全有效?

时间:2014-11-14 11:25:01

标签: c# string nlp

下午好,

我在C#中运行一个功能,旨在删除某些"停用词"来自一个字符串,如" the,or,it"所以它在自然语言处理中会更有用。但是,该功能由于某种原因不会删除该单词的第一个实例。

例如

输入: 狮子女巫和衣柜

返回: 狮子女巫和衣柜(我没有使用'和'作为禁用词,因为它可能有用)

我的功能如下:

    private void filterStopWords(string textToFilter)
    {
        textToFilter.ToLower();
        StringBuilder builder = new StringBuilder(textToFilter);
        for (int i = 0; i < 27; i++)
        {
            if (textToFilter.Contains(stopWords[i]))
            {
                builder.Replace(stopWords[i], " ");
            }
        }
        filterQueryBox.Text = builder.ToString();
    }

Stopwords []是一个包含我所有停用词的数组。

提前感谢任何可能对我有帮助的回复!

2 个答案:

答案 0 :(得分:1)

你差不多......

  • String.ToLower会返回新的string个实例。您需要将其分配给另一个或相同的字符串引用。
  • StringBuilder.Replace会返回新的StringBuilder个实例。您需要将其分配给另一个或相同的StringBuilder参考。

由于您首次使用ToLower而不是替换"the",因此您的实例中不应包含"the.."部分。因为它与您的stopWords数组项匹配。

static void Main(string[] args)
{
     filterStopWords("The lion the witch and the wardrobe");
}

private static void filterStopWords(string textToFilter)
{
     var stopWords = new [] {"The", "or", "it"};
     textToFilter = textToFilter.ToLower();
     StringBuilder builder = new StringBuilder(textToFilter);
     for (int i = 0; i < 3; i++)
     {
            if (textToFilter.Contains(stopWords[i]))
            {
                builder = builder.Replace(stopWords[i], " ");
            }
     }
     var result = builder.ToString();
     Console.WriteLine(result);
}

结果将是;

  lion   w ch and   wardrobe

答案 1 :(得分:1)

我的猜测是你的禁用词是带有前导和尾随空白的“the”。第一次出现的“the”在它前面没有空白,所以它不匹配。