Language agnostic 同义词词典的实现?

Language agnostic 同义词词典的实现?,language-agnostic,data-structures,dictionary,Language Agnostic,Data Structures,Dictionary,我应该如何处理这个问题?我基本上需要实现一个同义词词典。它需要一些“word/synonim”对作为输入,我必须能够“查询”一个单词的所有synonim列表 例如: Dictionary myDic; myDic.Add("car", "automobile"); myDic.Add("car", "autovehicle"); myDic.Add("car", "vehicle"); myDic.Add("bike", "vehicle"); myDic.ListOSyns("car")

我应该如何处理这个问题?我基本上需要实现一个同义词词典。它需要一些“word/synonim”对作为输入,我必须能够“查询”一个单词的所有synonim列表

例如:


Dictionary myDic;

myDic.Add("car", "automobile");
myDic.Add("car", "autovehicle");
myDic.Add("car", "vehicle");
myDic.Add("bike", "vehicle");

myDic.ListOSyns("car") // should return {"automobile","autovehicle","vehicle" ± "car"}
                       // but "bike" should NOT be among the words returned

我将用C++来编码,但是我对实现的整体概念感兴趣,所以问题不完全是语言特定的。 附言:主要思想是要有一些词组(同义词)。在上述示例中,将有两个这样的组:

{“汽车”、“汽车”、“汽车”、“汽车”} {“自行车”、“车辆”}


“vehicle”属于两者,“bike”只属于第二个,“bike”只属于第一个

我将它实现为一个
+
哈希表
/
搜索树

每个关键字都是一个顶点,两个关键字之间的每个连接都是一条边。
哈希表或搜索树将从每个单词连接到其节点(反之亦然)。
当提交查询时,您可以找到具有哈希/树的节点,并执行所需深度的BFS/DFS。(表示在一定深度后不能继续)

复杂度:O(E(d)+V(d))用于搜索图(d=深度)(E(d)=相关深度中的边数,与V(d)相同)
O(1)用于创建边(不包括搜索节点,详细信息如下)
O(logn)/O(1)用于查找节点(用于树/哈希表)
O(logn)/O(1)用于向树/哈希表添加关键字,O(1)用于添加顶点
p、 如前所述:设计师应该记住,如果他需要一个有向图或间接图,正如在对问题的评论中提到的。

希望这有助于……

在对问题的评论中进行澄清,这相对简单,因为您没有存储相互同义词的组,而是分别定义每个单词可接受的同义词。显而易见的容器是:

std::map<std::string, std::set<std::string> >
对于
multi_map
,使用
equal_range
成员函数提取每个单词的同义词,可能如下所示:

myDic.Add("car", "automobile");
myDic.Add("car", "auto");
myDic.Add("car", "automobile");
struct Dictionary {
    vector<string> ListOSyns(const string &key) const {
        typedef multi_map<string, string>::const_iterator constit;
        pair<constit, constit> x = innermap.equal_range(key);
        vector<string> retval(x.first, x.second);
        retval.push_back(key);
        return retval;
    }
};
struct字典{
向量列表同步(常量字符串和键)常量{
typedef multi_map::const_iterator const;
对x=内部映射。相等范围(键);
向量回归(x.first,x.second);
返回。推回(键);
返回返回;
}
};

最后,如果你喜欢一个类似于哈希表的结构,那么你的C++实现中可以使用<代码> unordeD.MultIMAP,基本上相同的代码工作。或者“相关”搜索(在您的示例中,返回“vehicle”?同时-您希望返回多深?如果您还添加(“vehicle”、“motorbike”)将返回“motorbike”也会被退回吗?@skaffman:谢谢你的编辑,这些标签更相关。该死,我写错了;让我来编辑这篇文章吧;我想对这两个问题有一些见解,深度应该是1。我会把文章弄清楚的。如果有人查“vehicle”,想要的回报是什么?@Steve:说得好;为了简单起见,我们把它设为一个空容器。这意味着每个单词都应该连接到一组单独的单词,所以我的函数Add(string,string)实际上就是Add(word,同义词),这意味着Add(“foo”,“foo2”)!=Add(“foo2”,“foo”)是的。而且看起来哈希表是一种更好的方法,因为它有更好的查找时间(即使,据我所知,由于冲突问题,查找/添加关键字到哈希表的复杂度要高一点)。哈希表的问题是,如果字典的大小不是固定的,你会损失一些时间进行重新设置,平均时间会更好,但最大延迟会更长,因此作为一名设计师,这是一个必须选择的权衡。你是对的,但这仅仅是一个大学作业,需要再做一点,所以重新设置会更大字典在这种特殊情况下不会成为问题。Steve Jessop指出,图表应该是有方向的,因此“a是b的同义词”并不意味着“b是a的同义词”,虽然两者都有可能。@cantrem:这当然是一个定义问题。我会编辑我的帖子并提及它——因此,如果将来有人看到这一点,他会记住这一点。

struct Dictionary {
    vector<string> ListOSyns(const string &key) const {
        typedef multi_map<string, string>::const_iterator constit;
        pair<constit, constit> x = innermap.equal_range(key);
        vector<string> retval(x.first, x.second);
        retval.push_back(key);
        return retval;
    }
};