Nlp 查找两个查询之间相关性的最简单方法
我需要找出给定的两个查询之间在距离方面的相关性,例如:Nlp 查找两个查询之间相关性的最简单方法,nlp,ontology,graph-databases,Nlp,Ontology,Graph Databases,我需要找出给定的两个查询之间在距离方面的相关性,例如: Q1(Query1) = Computing Q2(Query2) = RAM 让我们假设相关路径是这样的: 计算->个人计算机->计算机硬件->计算机组件->随机存取存储器->RAM 结果应为5 现在的问题是,像FreeBase这样的大多数图形数据库都不支持该功能。唯一的方法是递归地将一个查询与另一个查询进行比较 问题:是否有一种简单快捷的方法来实现此功能,或者是否有任何图形数据库支持此功能 请注意:这不是一个算法问题,我知道理论上使
Q1(Query1) = Computing
Q2(Query2) = RAM
让我们假设相关路径是这样的:
计算->个人计算机->计算机硬件->计算机组件->随机存取存储器->RAM
结果应为5
现在的问题是,像FreeBase
这样的大多数图形数据库都不支持该功能。唯一的方法是递归地将一个查询与另一个查询进行比较
问题:是否有一种简单快捷的方法来实现此功能,或者是否有任何图形数据库支持此功能
请注意:这不是一个算法问题,我知道理论上使用
DFS
或BFS
可以很容易地实现这一点,但现实中可能有一个节点(条目)有1000条边,我不想遍历所有节点。首先,要找到图之间的距离,只需计算从一个节点到另一个节点的边数,然后制定某种量化方法来计算距离。可以将freebase实体放入图形中,然后计算两个节点之间的边数
让我们从一个更简单的资源开始,WordNet。为了简单起见,让我们使用NLTK的WordNet API()。您可以简单地量化路径相似性(),如下所示:
请注意,使用Wordnet可能会导致比解决问题更多的问题;P.见
- ,
- 及
CostEvaluator<Double> costEvaluator = new CostEvaluator<Double>() {
public Double getCost(Relationship relationship, Direction direction) {
return -Math.log((Double) relationship.getProperty(Messages
.getString("RelProperty.Cost")));
}
};
CostAccumulator<Double> costAccumulator = new CostAccumulator<Double>() {
public Double addCosts(Double c1, Double c2) {
// TODO Auto-generated method stub
return c1 + c2;
}
};
Comparator<Double> costComparator = new Comparator<Double>() {
public int compare(Double o1, Double o2) {
// TODO Auto-generated method stub
return o1.compareTo(o2);
}
};
FloydWarshall<Double> fw = new FloydWarshall<Double>(1.0,
Double.MIN_VALUE, Direction.OUTGOING, costEvaluator,
costAccumulator, costComparator, this.currencySet,
this.tradeSet);
fw.reset();
fw.calculate();
顺便说一句,通过使用traverser框架或一个简单的你现在有什么样的图?@alvas我没有,这就是为什么我要问的原因。谢谢你,但我不是要高效的算法来做这件事。我想知道我可以使用什么样的词法分析工具来满足我的需求。我看了一下freebase,首先是我没有足够的容量和处理能力来使用他们的整个数据库(大约250GB)。使用他们的API也不是一个好主意,因为有些条目甚至可能有1000个传出条目。因此,如果我假设所有这些条目都至少有100个传出条目,那么对于深度为3的树,我需要处理1000*100=100000个条目。我知道WordNet,但我更喜欢使用API来为我进行计算。
CostEvaluator<Double> costEvaluator = new CostEvaluator<Double>() {
public Double getCost(Relationship relationship, Direction direction) {
return -Math.log((Double) relationship.getProperty(Messages
.getString("RelProperty.Cost")));
}
};
CostAccumulator<Double> costAccumulator = new CostAccumulator<Double>() {
public Double addCosts(Double c1, Double c2) {
// TODO Auto-generated method stub
return c1 + c2;
}
};
Comparator<Double> costComparator = new Comparator<Double>() {
public int compare(Double o1, Double o2) {
// TODO Auto-generated method stub
return o1.compareTo(o2);
}
};
FloydWarshall<Double> fw = new FloydWarshall<Double>(1.0,
Double.MIN_VALUE, Direction.OUTGOING, costEvaluator,
costAccumulator, costComparator, this.currencySet,
this.tradeSet);
fw.reset();
fw.calculate();
fw.getCost(node1, node2)