同义词词典实现?

时间:2011-03-17 12:05:34

标签: language-agnostic data-structures dictionary

我该如何处理这个问题?我基本上需要实现一个同义词词典。它需要一些“word / 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 ++编写代码,但我对实现的整体概念感兴趣,所以问题并不完全是语言特定的。

PS:主要思想是拥有一些单词组(同义词)。在上面的示例中,将有两个这样的组:

{“汽车”,“autovehicle”,“车辆”,“汽车”} {“bike”,“vehicle”}

“车辆”属于两者,“自行车”只是第二个,其他只是第一个

2 个答案:

答案 0 :(得分:2)

我会将其作为Graph + hash table / search tree实施
每个关键字都是顶点,两个关键字之间的每个连接都是边缘。
哈希表或搜索树将从每个单词连接到其节点(反之亦然)。
当提交查询时 - 您找到具有您的哈希/树的节点并执行所需深度的BFS / DFS。 (意思是你不能在一定深度后继续)
复杂度:搜索图形的O(E(d)+ V(d))(d =深度)(E(d)=相关深度的边数,V(d)相同)
O(1)用于创建边缘(不包括搜索节点,详细信息在其搜索下方)
用于查找节点的O(logn)/ O(1)(用于树/哈希表)
O(logn)/ O(1)用于向树/哈希表添加关键字,O(1)用于添加顶点
附:如上所述:设计师应该记住,如果他需要一个有向或间接的图表,如问题评论中所述。 希望有帮助...

答案 1 :(得分:1)

通过对问题的评论的澄清,它相对简单,因为你不存储相互同义词的组,而是分别为每个单词定义可接受的同义词。明显的容器是:

std::map<std::string, std::set<std::string> >

或:

std::multi_map<std::string, std::string>

如果您不担心插入重复项,请执行以下操作:

myDic.Add("car", "automobile");
myDic.Add("car", "auto");
myDic.Add("car", "automobile");

对于multi_map,使用equal_range成员函数提取每个单词的同义词,可能是这样的:

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;
    }
};

最后,如果您更喜欢类似哈希表的结构到树状结构,那么{C}实现中可能会提供unordered_multimap,并且基本相同的代码可以正常工作。