我正在尝试递归搜索同义词(我声明为“ synset”)。不幸的是,同义词重复。例如:当我搜索学生一词时,输出将如下所示:

搜索词:学生

同义词集0:瞳孔
  同义词集0:学生
    同义词集0:瞳孔
    。
    。
    。
  同义词1:受教育者
  同义词2:小学生
同义词1:受教育者
同义词2:学者
同义词3:书生


我想将所有输出存储到数据库中,不需要重复的输出,这是我的包含递归函数的代码的一部分。希望任何人都能帮助我..谢谢

public String printSynset(字串)
    {
        //调用wordnet库
        RiWordnet wordnet =新的RiWordnet();
        //调用词干分析器方法
        PorterStemmer s =新的PorterStemmer();

Vector<String> synsetVec = new Vector<String>(); String[] synset = wordnet.getAllSynsets(word, "n"); for (int k=0; k<synset.length; k++) { synsetVec.add(synset[k]); if (!synsetVec.isEmpty()) { for (int j = 0; j < synsetVec.size();) { GUIsynonymTA.append("\n"); GUIsynonymTA.append(" No." + j + ": " + (s.Stem(synsetVec.get(j)))); GUIsynonymTA.append("\n"); return printSynset(synsetVec.get(j)); } } else if (synsetVec.isEmpty()) return word; } return word;}//end printSynset()

最佳答案

您应该维护已经看到的项目的Set。每次碰到一个物品时,首先要检查它是否曾经被看见过;如果是,则停止递归;如果不是,请将其添加到集合中并继续。

结果是经典的深度优先搜索一般图形,您可以在任何算法教科书或Russell & Norvig第3章中找到。伪代码:

Set<Node> printSynset(Node root) {
    HashSet<Node> closed;
    printDFS(root, closed);
}

// recursive graph dfs
void printDFS(Node n, Set<Node> closed) {
    if (!closed.contains(n)) {
        print(n.item);
        closed.add(n);
        for (Node s : n.neighbors())
            printDFS(n, closed);
    }
}


请注意,当printDFS返回到printSynset时,它将用访问过的所有节点填充closed,因此您也可以选择返回该Set<Node>并在printSynset中循环,而不是执行在printDFS中打印。这将为您提供一个通用的,可重复使用的DFS例程。

10-06 05:56