2016-07-30 5 views
1

У меня есть список с названиями фильмов и хочу посмотреть их в DBpedia для метаинформации типа «режиссер». Но мне сложно определить правильный фильм с помощью SPARQL, потому что названия иногда точно не совпадают.Запрос для лучшего соответствия строке с SPARQL?

Как я могу получить наилучший матч для названия фильма из DBpedia с использованием SPARQL?

Некоторые проблемные примеры:

  • Мой список: "Die Hard: с удвоенной силой" против DBpedia: "Die Hard с удвоенной силой"
  • Мой список: "Hachi" против DBpedia: «Hachi: Рассказ собаки»

Мой текущий подход для запроса 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 в целом?

Спасибо!

+0

Конечные точки SPARQL не являются текстовыми поисковыми системами, поэтому существует ограниченная поддержка соответствия строк в стандартах SPARQL. Некоторые тройные магазины имеют некоторую расширенную поддержку, в зависимости от базовой реализации. Например. некоторые трёхместные магазины используют Lucene для текстового поиска, в то время как другие, такие как Virtuoso, имеют встроенные функции. – AKSW

+0

Конечная точка DBpedia использует Virtuoso, поэтому вы можете посмотреть http://docs.openlinksw.com/virtuoso/rdfsparqlrulefulltext/. Например. 'bif: contains' намного быстрее индексированных литералов, чем обычный REGEX. Примером из документов является '? S foaf: Name? Name. ? name bif: содержит "'rich *'". ', который будет соответствовать всем тем, чьи' foaf: Name' содержат слово Rich. Это будет соответствовать Ричарду, Ричи и т. Д. – AKSW

+0

@AKSW Спасибо за подсказку с bif: contains. Я посмотрю на это. – dynobo

ответ

2

Я приспособил регулярки-подход mentioned in the comments и придумал решение, которое работает довольно хорошо, лучше, чем я мог бы получить с БИФАМИ: содержит:

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 

Это не идеально, поэтому я до сих пор открыт для предложений.

 Смежные вопросы

  • Нет связанных вопросов^_^