【问题标题】:Query for best match to a string with SPARQL?使用 SPARQL 查询与字符串的最佳匹配?
【发布时间】:2016-12-04 21:49:25
【问题描述】:

我有一个包含电影标题的列表,并想在 DBpedia 中查找这些电影标题,以获取诸如“导演”之类的元信息。但我很难用 SPARQL 识别正确的电影,因为标题有时不完全匹配。

如何使用 SPARQL 从 DBpedia 获得电影标题的最佳匹配?

一些有问题的例子:

  • 我的清单:“死而复生:复仇”与 DBpedia:“死而复生”
  • 我的清单:“Hachi”与 DBpedia:“Hachi: A Dog's Tale”

我目前的方法是查询所有电影的DBpedia endpoint,然后通过检查单个标记(不带标点符号)进行过滤,按标题排序并返回第一个结果。例如:

SELECT ?resource ?title ?director WHERE {
   ?resource foaf:name ?title .
   ?resource rdf:type schema:Movie .
   ?resource dbo:director ?director .
   FILTER (
      contains(lcase(str(?title)), "die") && 
      contains(lcase(str(?title)),"hard")
   )
}
ORDER BY (?title)
LIMIT 1

这种方法很慢,有时也会失败,例如:

SELECT ?resource ?title ?director WHERE {
   ?resource foaf:name ?title .
   ?resource rdf:type schema:Movie .
   ?resource dbo:director ?director .
   FILTER (
      contains(lcase(str(?title)), "hachi") 
   )
}
ORDER BY (?title)
LIMIT 10

正确的结果排在第二位:

  resource                                          title                        director
  http://dbpedia.org/resource/Chachi_420            "Chachi 420"@en              http://dbpedia.org/resource/Kamal_Haasan
  http://dbpedia.org/resource/Hachi:_A_Dog's_Tale   "Hachi: A Dog's Tale"@en     http://dbpedia.org/resource/Lasse_Hallström    
  http://dbpedia.org/resource/Hachiko_Monogatari    "Hachikō Monogatari"@en      http://dbpedia.org/resource/Seijirō_Kōyama
  http://dbpedia.org/resource/Thachiledathu_Chundan "Thachiledathu Chundan"@en   http://dbpedia.org/resource/Shajoon_Kariyal

任何想法如何解决这个问题?甚至更好:一般如何使用 SPARQL 查询字符串的最佳匹配?

谢谢!

【问题讨论】:

  • SPARQL 端点不是文本搜索引擎,因此,在 SPARQL 标准中对字符串匹配的支持有限。一些三联存储确实有一些扩展支持,具体取决于底层实现。例如。一些三联商店使用 Lucene 进行文本搜索,而其他像 Virtuoso 有一些内置功能。
  • DBpedia 端点使用 Virtuoso,因此您可以查看 docs.openlinksw.com/virtuoso/rdfsparqlrulefulltext 。例如。 bif:contains 在索引文字上比常规 REGEX 快得多。文档中的一个示例是 ?s foaf:Name ?name . ?name bif:contains "'rich*'".,它将匹配所有 foaf:Name 包含单词 Rich 的主题。这将匹配 Richard、Richie 等。
  • @AKSW 感谢 bif:contains 的提示。我会看看那个。
  • 看看stackoverflow.com/questions/24557020/…。如前所述,SPARQL 并不是真正用于字符串处理,但它可以做很多事情,即使它不是超级性能。该链接显示了如何使用 Sparql 计算一些编辑距离。

标签: string search sparql dbpedia


【解决方案1】:

我调整了 regex-approach mentioned in the comments 并提出了一个效果很好的解决方案,比我使用 bif:contains 所能得到的任何东西都要好:

   SELECT ?resource ?title ?match strlen(str(?title)) as ?lenTitle strlen(str(?match)) as ?lenMatch

   WHERE {
      ?resource foaf:name ?title .
      ?resource rdf:type schema:Movie .
      ?resource dbo:director ?director .
      bind( replace(LCASE(CONCAT('x',?title)), "^x(die)*(?:.*?(hard))*(?:.*?(with))*.*$", "$1$2$3") as ?match ) 
   }

   ORDER BY DESC(?lenMatch) ASC(?lenTitle)

   LIMIT 5

它并不完美,所以我仍然愿意接受建议。

【讨论】:

  • 你能解释一下每个部分的作用吗?我希望能够搜索“Die_Hard”,同时忽略 _(下划线)并使其不区分大小写。我用你的代码搜索,它给了我太多的点击!
猜你喜欢
  • 2014-08-02
  • 2019-04-14
  • 2016-07-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
  • 1970-01-01
  • 2020-11-11
  • 2014-06-20
相关资源
最近更新 更多