在C#中存储关键字和同义词的数据结构?

时间:2016-12-20 20:15:48

标签: c# data-structures

我正在使用C#开发一个项目,我需要存储10到15个关键字及其同义词。

我想要存储这些的第一种方法是使用像List>这样的二维列表。所以它看起来像:

keyword1 synonym1 synonym2

keyword2 synonym1

keyword3 synonym1 synonym2 等

我开始考虑的是,如果我得到一个输入字符串并将其拆分为搜索每个单词,以查看它的关键字或列表中某个关键字的同义词是否为2d列表就可以了或者会搜索它太慢?

希望我的问题有道理我可以澄清任何事情,如果它不清楚只是问。谢谢!

2 个答案:

答案 0 :(得分:4)

  

搜索[列表]会太慢吗?

当你谈论10..15个关键词时,很难想出一个效率低下的算法,足以让最终用户注意到它的缓慢。没有足够的数据来减缓现代CPU的速度。

一种方法是构建一个Dictionary<string,string>,将每个同义词映射到其“规范”关键字。这将包括规范版本本身:

var keywords = new Dictionary<string,string> {
    ["keyword1"] = "keyword1"
,   ["synonym1"] = "keyword1"
,   ["synonym2"] = "keyword1"
,   ["keyword2"] = "keyword2"
,   ["synonym3"] = "keyword2"
,   ["keyword3"] = "keyword3"
};

请注意关键字和同义词如何显示为键,而只有关键字显示为值。这使您可以查找关键字或同义词,并获得有保证的关键字。

答案 1 :(得分:1)

我可能会使用词典。密钥是你的同义词,值是你的关键词。因此,您可以在词典中查找任何单词并获取所需的实际关键词。例如:

private Dictionary<string, string> synonymKeywordDict = new Dictionary<string, string>();

public SearchResult Search(IEnumerable<string> searchTerms)
{
  var keywords = searchTerms.Select(x => synonymKeywordDict[x]).Distinct().ToList();
  //keywords now contains your key words after being translated from any synonyms
}

以防万一我不够清楚,词汇会像这样加载。

private void LoadDictionary()
{
  //So our lookup doesn't fail on the key word itself.
  synonymKeywordDict.Add("computer", "computer");
  //Then all our synonyms
  synonymKeywordDict.Add("desktop", "computer");
  synonymKeywordDict.Add("PC", "computer");
}