C# 字典 - ContainsKey 函数 Return 错误值
C# Dictionary - ContainsKey Function Return Wrong Value
我正在尝试使用 Dictionary of 来映射一些单词(int 并没有那么重要)。
将单词插入 dic 后(我检查过)我尝试遍历整个文档并查找特定单词。
当我这样做时,即使这个词存在于 dic 中,它 return 也是错误的。
可能是什么问题,我该如何解决?
public string RemoveStopWords(string originalDoc){
string updatedDoc = "";
string[] originalDocSeperated = originalDoc.Split(' ');
foreach (string word in originalDocSeperated)
{
if (!stopWordsDic.ContainsKey(word))
{
updatedDoc += word;
updatedDoc += " ";
}
}
return updatedDoc.Substring(0, updatedDoc.Length - 1); //Remove Last Space
}
例如:dic 包含停用词 "the"。当我从 originalDoc 中得到一个单词 "the" 然后想检查它是否不存在时,它仍然输入 IF 语句并且他们都写相同!不区分大小写
Dictionary<string, int> stopWordsDic = new Dictionary<string, int>();
string stopWordsContent = System.IO.File.ReadAllText(stopWordsPath);
string[] stopWordsSeperated = stopWordsContent.Split('\n');
foreach (string stopWord in stopWordsSeperated)
{
stopWordsDic.Add(stopWord, 1);
}
stopWords文件是每行有一个词的文件
快照:
谢谢
你有一个! (not) 运算符在您的 if 语句中。您正在检查字典是否不包含键。删除条件开头的感叹号。
创建字典时,您需要执行以下操作:
var stopWords= new Dictionary<string, int>(
StringComparer.InvariantCultureIgnoreCase);
最重要的部分是 InvariantCultureIgnoreCase。
public string RemoveStopWords(string originalDoc){
return String.Join(" ",
originalDoc.Split(' ')
.Where(x => !stopWordsDic.ContainsKey(x))
);
}
此外,您应该更改填充字典的方式(这会在创建字典时从字典中删除所有非单词符号):
// Regex to find the first word inside a string regardless of the
// preleading symbols. Cuts away all nonword symbols afterwards
Regex validWords = New Regex(@"\b([0-9a-zA-Z]+?)\b");
string stopWordsContent = System.IO.File.ReadAllText(stopWordsPath);
string[] stopWordsSeperated = stopWordsContent.Split('\n');
foreach (string stopWord in stopWordsSeperated)
{
stopWordsDic.Add(validWords.Match(stopWord).Value, 1);
}
这只是一个猜测(对于评论来说太长了),但是当您在 Dictionary
上插入时,您将按 \n
.
拆分
因此,如果您使用的文本文件中的实际拆分器是 \r\n
,您将在插入的键上留下 \r
,因此在 [=14 上找不到它们=].
所以我会从 string[] stopWordsSeperated = stopWordsContent.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);
开始,然后是 trim
附带说明一下,如果您不对任何内容使用字典 int 值,最好使用 HashSet<string>
和 Contains
而不是 ContainsKey
我看到您将所有条目的值设置为 1。也许 List 更符合您的需求:
List<string> stopWordsDic = new List<string>();
string stopWordsContent = System.IO.File.ReadAllText(stopWordsPath);
string[] stopWordsSeperated = stopWordsContent.Split(Environment.NewLine);
foreach (string stopWord in stopWordsSeperated)
{
stopWordsDic.Add(stopWord);
}
然后用 Contains()
检查元素
public string RemoveStopWords(string originalDoc){
string updatedDoc = "";
string[] originalDocSeperated = originalDoc.Split(' ');
foreach (string word in originalDocSeperated)
{
if (!stopWordsDic.Contains(word))
{
string.Format("{0}{1}", word, string.Empty);
//updatedDoc += word;
//updatedDoc += " ";
}
}
return updatedDoc.Substring(0, updatedDoc.Length - 1); //Remove Last Space
}
我正在尝试使用 Dictionary of 来映射一些单词(int 并没有那么重要)。 将单词插入 dic 后(我检查过)我尝试遍历整个文档并查找特定单词。
当我这样做时,即使这个词存在于 dic 中,它 return 也是错误的。
可能是什么问题,我该如何解决?
public string RemoveStopWords(string originalDoc){
string updatedDoc = "";
string[] originalDocSeperated = originalDoc.Split(' ');
foreach (string word in originalDocSeperated)
{
if (!stopWordsDic.ContainsKey(word))
{
updatedDoc += word;
updatedDoc += " ";
}
}
return updatedDoc.Substring(0, updatedDoc.Length - 1); //Remove Last Space
}
例如:dic 包含停用词 "the"。当我从 originalDoc 中得到一个单词 "the" 然后想检查它是否不存在时,它仍然输入 IF 语句并且他们都写相同!不区分大小写
Dictionary<string, int> stopWordsDic = new Dictionary<string, int>();
string stopWordsContent = System.IO.File.ReadAllText(stopWordsPath);
string[] stopWordsSeperated = stopWordsContent.Split('\n');
foreach (string stopWord in stopWordsSeperated)
{
stopWordsDic.Add(stopWord, 1);
}
stopWords文件是每行有一个词的文件
快照:
谢谢
你有一个! (not) 运算符在您的 if 语句中。您正在检查字典是否不包含键。删除条件开头的感叹号。
创建字典时,您需要执行以下操作:
var stopWords= new Dictionary<string, int>(
StringComparer.InvariantCultureIgnoreCase);
最重要的部分是 InvariantCultureIgnoreCase。
public string RemoveStopWords(string originalDoc){
return String.Join(" ",
originalDoc.Split(' ')
.Where(x => !stopWordsDic.ContainsKey(x))
);
}
此外,您应该更改填充字典的方式(这会在创建字典时从字典中删除所有非单词符号):
// Regex to find the first word inside a string regardless of the
// preleading symbols. Cuts away all nonword symbols afterwards
Regex validWords = New Regex(@"\b([0-9a-zA-Z]+?)\b");
string stopWordsContent = System.IO.File.ReadAllText(stopWordsPath);
string[] stopWordsSeperated = stopWordsContent.Split('\n');
foreach (string stopWord in stopWordsSeperated)
{
stopWordsDic.Add(validWords.Match(stopWord).Value, 1);
}
这只是一个猜测(对于评论来说太长了),但是当您在 Dictionary
上插入时,您将按 \n
.
因此,如果您使用的文本文件中的实际拆分器是 \r\n
,您将在插入的键上留下 \r
,因此在 [=14 上找不到它们=].
所以我会从 string[] stopWordsSeperated = stopWordsContent.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);
开始,然后是 trim
附带说明一下,如果您不对任何内容使用字典 int 值,最好使用 HashSet<string>
和 Contains
而不是 ContainsKey
我看到您将所有条目的值设置为 1。也许 List 更符合您的需求:
List<string> stopWordsDic = new List<string>();
string stopWordsContent = System.IO.File.ReadAllText(stopWordsPath);
string[] stopWordsSeperated = stopWordsContent.Split(Environment.NewLine);
foreach (string stopWord in stopWordsSeperated)
{
stopWordsDic.Add(stopWord);
}
然后用 Contains()
public string RemoveStopWords(string originalDoc){
string updatedDoc = "";
string[] originalDocSeperated = originalDoc.Split(' ');
foreach (string word in originalDocSeperated)
{
if (!stopWordsDic.Contains(word))
{
string.Format("{0}{1}", word, string.Empty);
//updatedDoc += word;
//updatedDoc += " ";
}
}
return updatedDoc.Substring(0, updatedDoc.Length - 1); //Remove Last Space
}