我正在阅读一些文字,一行一行,我想对单词进行标记并创建1克和2克,但我认为我的索引存在问题,因为我得到索引错误或者它会说我试图在我的字典中修改的项目不存在,这是完全奇怪的,因为我编写的代码首先使字典项目,如果它已经存在,增加一个计数器。 基本上,我的词典形式为(n-gram string,frequency int)
System.IO.StreamReader lines = new System.IO.StreamReader("myfile");
while (true)
{
string line = lines.ReadLine().ToLower();
if (line == null) break;
if (line.Trim().Length == 0) continue;
string[] tokens = Regex.Split(line, "[^\\w']+");
for (int i = 0; i < tokens.Count()-1; i++)
{
try
{
one_gram.Add(tokens[i], 1);
two_gram.Add(tokens[i] + " " + tokens[i + 1], 1);
}
catch
{
one_gram[tokens[i]]++;
two_gram[tokens[i] + " "+tokens[i + 1]]++;
}
}
}
任何人都可以查看我的代码并告诉我哪里出错了吗?问题似乎发生在第一行的for循环结束时,但如果我这样做
for(int i=0;i<tokens.Count()-3;i++)
然后错误发生在第二行...但我不确定究竟是什么导致它。
编辑:根据建议,我尝试使用ContainsKey方法,但是在第一行结尾附近我仍然收到错误,说我正在添加一个已存在的密钥,即使if语句应该捕获是什么?!for (int i = 0; i < tokens.Count()-1; i++)
{
if (one_gram.ContainsKey(tokens[i]))
{
one_gram[tokens[i]]++;
}
if (two_gram.ContainsKey(tokens[i] + " " + tokens[i + 1]))
{
two_gram[tokens[i] + " " + tokens[i + 1]]++;
}
one_gram.Add(tokens[i], 1);
two_gram.Add(tokens[i] + " " + tokens[i + 1], 1);
}
答案 0 :(得分:1)
您需要使用else
(或break
):
for (int i = 0; i < tokens.Count() - 1; i++)
{
// Save yourself typing errors by creating variables to hold
// the key values and then you can just use the variable name
var oneGramKey = tokens[i];
var twoGramKey = string.Format("{0} {1}", tokens[i], tokens[i + 1]);
if (one_gram.ContainsKey(oneGramKey))
{
one_gram[oneGramKey]++;
}
else
{
one_gram.Add(oneGramKey, 1);
}
if (two_gram.ContainsKey(twoGramKey))
{
two_gram[twoGramKey]++;
}
else
{
two_gram.Add(twoGramKey, 1);
}
}