Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nlp 查找两个查询之间相关性的最简单方法_Nlp_Ontology_Graph Databases - Fatal编程技术网

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.见

  • ,

您要查找的是图形中两个节点之间的最短路径。如果您的图表未加权,这将归结为a

我假设你的相关性边是加权的,所以你需要。由于您很可能对全对最短路径问题感兴趣,因为您可能希望稍后查询任意两个节点之间的最短路径,因此您可以使用。这将创建一个矩阵,其中包含所有节点对之间的所有最短路径值

如果将图形导入到,可以使用,请注意此算法的实现在顶点数上是立方的。因此,这实际上取决于您的用例选择上述哪种算法

我随附了一些示例代码(在neo4j 1.4中),显示了它是多么容易:

        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)