【问题标题】:Excluding words from dictionary从字典中排除单词
【发布时间】:2015-07-27 00:49:21
【问题描述】:

我正在阅读文档,并拆分单词以获取字典中的每个单词,但是我如何排除某些单词(例如“the/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());

【问题讨论】:

  • @Ken'ichiMatsuyama 如果未选择文件,则您的错误是调用此函数。正确的做法是看文件是否被选中,不要往前走,以后再catch异常
  • @Enigmativity 这完全是题外话,但很有用。我个人觉得你应该捕获所有的异常。不用说,您至少应该始终对它做点什么。我一直看到的方式是,您希望您的用户拥有愉快的体验,并且如果由于某种原因出现会导致应用程序失败的错误,那么您不希望用户看到类似 nullObjectException 的内容第 203 行...等等等等...他们希望看到一个错误,告诉他们如何向您报告错误。
  • 我的评论要注意的重要一点是,您应该捕获所有异常,但您应该考虑可能希望以不同方式捕获和处理的特定类型的异常。
  • @Keithin8a 没错。捕获异常(通常是较高级)以进行跟踪并向用户显示漂亮的错误消息和懒惰之间存在差异,例如检查用户是否实际选择了文件或取消了操作。我们不会只调用对象上的方法而不检查它是否为空,也不会捕获异常。是的,这非常过时:/
  • @SamiKuhmonen 是的,我再次阅读了您的评论并意识到我回复了错误的人。离题对话有时在 cmets 中很有用。我们都是来学习的,不是吗?但是,是的,他们不应该太过分。

标签: c# wpf dictionary tolower


【解决方案1】:

您要过滤掉停用词吗?

 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(保持简单,愚蠢)将变成一个 kiss,而某些数字会不正确

【讨论】:

  • 对不起,我不是母语人士,只是检查了停用词是什么,是的,我想过滤它们。我喜欢这个想法,hashset 也应该是高效的。
【解决方案2】:

我会这样做:

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&lt;string&gt;,但不太可能,因为您使用的是文件 IO。

【讨论】:

    猜你喜欢
    • 2020-01-01
    • 2022-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多