我试图使用Dictionary来映射一些单词(int并不真正如此相关)。 在将单词插入dic(我检查过)后,我尝试查看整个文档并查找特定单词。
当我这样做时,即使这个词存在于dic中,它也会返回false。
可能是什么问题,我该如何解决?
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
}
for examle:dic包含停用词作为单词""。当我得到一个字""从originalDoc然后想要检查它是否不存在,它仍然进入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文件是一个文件,每行都有一个单词
谢谢
答案 0 :(得分:3)
这只是一个猜测(对于评论来说太长了),但当您在Dictionary
上插入时,您将按\n
分割。
因此,如果您使用的文本文件中的实际拆分器为\r\n
,则您在插入的密钥上会留下\r
,因此无法在ContainsKey
找到它们
所以我先从string[] stopWordsSeperated = stopWordsContent.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.None);
然后修剪
作为旁注,如果您没有使用字典int值,那么您最好使用HashSet<string>
和Contains
代替ContainsKey
答案 1 :(得分:1)
答案 2 :(得分:0)
创建字典时,您需要执行以下操作:
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);
}
答案 3 :(得分:0)
我看到您将1设置为所有条目的值。也许{{3}}更符合您的需求:
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
}