我正在尝试递归搜索同义词(我声明为“ 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例程。