【问题标题】:SPARQL: how to find similar strings?SPARQL:如何找到相似的字符串?
【发布时间】:2012-04-12 16:03:41
【问题描述】:

我正在使用 Jena 来查询存储在本体中的数据。一些对象由字符串标识,但有时完全相同的字符串不可用,因为我正在处理扫描的文档,因此可能存在 OCR 错误。因此,我想找到最相似的字符串。有没有办法为此目的使用 SPARQL?我可以在 SPARQL 中以某种方式计算 levenshtein 距离吗?

如果这是不可能的,我仍然可以在 java 中计算 levenshtein 距离。然而,一个有效的算法仍然需要使用 SPARQL 过滤掉不相关的字符串。

【问题讨论】:

    标签: java sparql jena levenshtein-distance similarity


    【解决方案1】:

    SPARQL 不能直接执行此操作,但您可以在 java 中实现 levenshtein distance 函数,并在 SPARQL FILTER 子句中使用它。 Extensions in ARQ 有关于使用扩展函数的详细信息。

    【讨论】:

    • 芝麻有类似的解决方案吗?
    【解决方案2】:

    如果有人感兴趣,这就是我的实现方式:

    public class LevenshteinFilter extends FunctionBase2 
    {  
         public NodeValue exec(NodeValue value1, NodeValue value2){
             int i = StringUtils.getLevenshteinDistance(value1.asString(), value2.asString()); 
             return NodeValue.makeInteger(i); 
         }
    }
    

    用法:

     String functionUri = "http://www.example.org/LevenshteinFunction"; 
     FunctionRegistry.get().put(functionUri , LevenshteinFilter.class); 
     String s = "...";
     String sparql = "SELECT ?x WHERE { ?x a Something . " +
                                       "?x hasString ?str . " + 
                                       "FILTER(<"+functionUri +">(?str, \"" + s + "\") < 5) }";
     QueryExecution qexec = QueryExecutionFactory.create(sparql, model); 
     ResultSet rs = qexec.execSelect(); 
     while(rs.hasNext()){
         ...
     }
    

    【讨论】:

      【解决方案3】:

      芝麻有fr/sparna/rdf/sesame/toolkit/functions/LevenshteinDistanceFunction,但找不到来源。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-15
        • 1970-01-01
        • 2023-01-13
        • 1970-01-01
        相关资源
        最近更新 更多