从字典中排除单词

时间:2015-05-15 07:14:49

标签: c# wpf dictionary tolower

我正在阅读文档,并拆分单词以获取字典中的每个单词,但我怎么能排除一些单词(如“/ a / an”)。

这是我的功能:

private void Splitter(string[] file)
{
    try
    {
        tempDict = file
            .SelectMany(i => File.ReadAllLines(i)
            .SelectMany(line => line.Split(new[] { ' ', ',', '.', '?', '!', }, StringSplitOptions.RemoveEmptyEntries))
            .AsParallel()
            .Distinct())
            .GroupBy(word => word)
            .ToDictionary(g => g.Key, g => g.Count());
    }
    catch (Exception ex)
    {
        Ex(ex);
    }
}

此外,在这种情况下,添加.ToLower()调用的正确位置在哪里,以便以小写形式从文件中生成所有单词?我在(temp = file ..)之前考虑过这样的事情:

file.ToList().ConvertAll(d => d.ToLower());

2 个答案:

答案 0 :(得分:4)

是否要过滤掉停用词

 HashSet<String> StopWords = new HashSet<String> { 
   "a", "an", "the" 
 }; 

 ...

 tempDict = file
   .SelectMany(i => File.ReadAllLines(i)
   .SelectMany(line => line.Split(new[] { ' ', ',', '.', '?', '!', }, StringSplitOptions.RemoveEmptyEntries))
   .AsParallel()
   .Select(word => word.ToLower()) // <- To Lower case 
   .Where(word => !StopWords.Contains(word)) // <- No stop words
   .Distinct()
   .GroupBy(word => word)
   .ToDictionary(g => g.Key, g => g.Count());

但是,此代码是部分解决方案: Berlin 等专有名称将转换为小写: berlin 以及首字母缩略词: KISS (保持简单,愚蠢)只会变成,有些数字会不正确

答案 1 :(得分:1)

我会这样做:

var ignore = new [] { "the", "a", "an" };
tempDict = file
    .SelectMany(i =>
        File
            .ReadAllLines(i)
            .SelectMany(line =>
                line
                    .ToLowerInvariant()
                    .Split(
                        new[] { ' ', ',', '.', '?', '!', },
                        StringSplitOptions.RemoveEmptyEntries))
                    .AsParallel()
                    .Distinct())
    .Where(x => !ignore.Contains(x))
    .GroupBy(word => word)
    .ToDictionary(g => g.Key, g => g.Count());

如果性能成为问题,您可以将ignore更改为HashSet<string>,但由于您使用的是文件IO,因此不太可能。