从字典中排除单词
Excluding words from dictionary
我正在阅读文档,并拆分单词以获取字典中的每个单词,但我如何排除某些单词(如 "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());
是否要过滤掉 停用词?
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,一些数字将是 不正确.
我会这样做:
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。
我正在阅读文档,并拆分单词以获取字典中的每个单词,但我如何排除某些单词(如 "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());
是否要过滤掉 停用词?
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,一些数字将是 不正确.
我会这样做:
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。