我正在使用C#开发一个项目,我需要存储10到15个关键字及其同义词。
我想要存储这些的第一种方法是使用像List>这样的二维列表。所以它看起来像:
keyword1 synonym1 synonym2
keyword2 synonym1
keyword3 synonym1 synonym2 等
我开始考虑的是,如果我得到一个输入字符串并将其拆分为搜索每个单词,以查看它的关键字或列表中某个关键字的同义词是否为2d列表就可以了或者会搜索它太慢?
希望我的问题有道理我可以澄清任何事情,如果它不清楚只是问。谢谢!
答案 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");
}