1

我有以下程序计算每个文档条目的文档频率 (freq)

  foreach (var termIndex in freq.Select(entry => GetTermIndex(entry.Key)))
         {                                                              
            _docFreq[i][termIndex]++;
         }

以及获取术语索引的过程

rivate int GetTermIndex(string term)
    {
        int i;
        if (_wordsIndex.TryGetValue(term, out i))
            return i;
        else
            return 0;
    }

其中,所有术语都在另一个字典 (_wordsIndex) 中编入索引。

根据上述过程,如果freq中的entry.Key不存在,那么GetTermIndex将返回0,这将向上计数_docFreq(_docFreq[i][0]),这就是问题所在。那么,当 entry.Key 不存在时,我怎么能避免计数呢?我试图做类似的事情

rivate int GetTermIndex(string term)
    {
        int i;
        if (_wordsIndex.TryGetValue(term, out i))
            return i;
        else
            return -1;
    }

但当然会出现错误“索引超出数组范围”,因为_docFreq[i][-1] 没有索引。

请问有什么帮助吗??非常感谢

4

4 回答 4

5

termIndex如果是-1 ,就不要计算它:

foreach (var termIndex in freq.Select(entry => GetTermIndex(entry.Key)))
{
    if (termIndex >= 0)
        _docFreq[i][termIndex]++;
}

或使用 LINQ Where

foreach (var termIndex in freq.Select(entry => GetTermIndex(entry.Key)).Where(ti => ti >= 0))
{
    _docFreq[i][termIndex]++;
}
于 2012-12-04T09:56:07.250 回答
1

检查函数返回的值:

foreach (var termIndex in freq.Select(entry => GetTermIndex(entry.Key))) {
  if (termIndex != -1) {
    _docFreq[i][termIndex]++;
  }
}

或者:

foreach (var termIndex in freq.Select(entry => GetTermIndex(entry.Key)).Where(i => i != -1)) {
  _docFreq[i][termIndex]++;
}
于 2012-12-04T09:56:45.130 回答
1

怎么样

  foreach (var termIndex in freq.Select(entry => GetTermIndex(entry.Key)).Where(index=>index>=0))
     {                                                              
        _docFreq[i][termIndex]++;
     }
于 2012-12-04T09:56:58.583 回答
1

确保跳过那些无效值:

foreach (var termIndex in freq.Select(entry => GetTermIndex(entry.Key))).Where(x => x >= 0)
     {                                                              
        _docFreq[i][termIndex]++;
     }
于 2012-12-04T09:57:26.070 回答