我正在尝试使用 SPARQL 查询维基词典,以获取某种语言(例如德语)的名词的所有术语 并作为输出:
我正在使用 SPARQL-Endpoint:http://wiktionary.dbpedia.org/sparql 我找到了一个示例,但我没有弄清楚 如何调整它以获得我想要的信息。
PREFIX terms:<http://wiktionary.dbpedia.org/terms/>
PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>
PREFIX dc:<http://purl.org/dc/elements/1.1/>
SELECT ?sword ?slang ?spos ?ssense ?twordRes ?tword ?tlang
FROM <http://wiktionary.dbpedia.org>
WHERE {
?swordRes terms:hasTranslation ?twordRes .
?swordRes rdfs:label ?sword .
?swordRes dc:language ?slang .
?swordRes terms:hasPoS ?spos .
OPTIONAL { ?swordRes terms:hasMeaning ?ssense . }
OPTIONAL {
?twordBaseRes terms:hasLangUsage ?twordRes .
?twordBaseRes rdfs:label ?tword .
}
OPTIONAL { ?twordRes dc:language ?tlang . }
}
首先,您要选择所有属于名词的术语含义。正如您在示例查询的查询结果中看到的,此信息是通过
terms:hasPoS
关系捕获的。因此,要专门查询所有名词,我们可以这样做:
PREFIX terms: <http://wiktionary.dbpedia.org/terms/>
SELECT ?term
WHERE {
?term terms:hasPoS terms:Noun .
}
LIMIT 100
接下来你想要的只是某种语言的名词。这似乎被
dc:language
关系所涵盖,因此我们对该关系添加了一个额外的约束。假设我们想要所有英语名词:
PREFIX terms: <http://wiktionary.dbpedia.org/terms/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
SELECT ?term
WHERE {
?term terms:hasPoS terms:Noun ;
dc:language terms:English .
}
LIMIT 100
因此,我们现在正在选择您想要的内容,但我们还没有您想要的格式的输出,因为上面的查询只是返回术语意义的标识符,而不是实际术语的字符串值。正如我们在示例查询的输出中看到的,字符串值由
rdfs:label
属性捕获,因此我们添加:
PREFIX terms: <http://wiktionary.dbpedia.org/terms/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>
SELECT ?term ?termLabel
WHERE {
?term terms:hasPoS terms:Noun ;
dc:language terms:English ;
rdfs:label ?termLabel .
}
LIMIT 100
如果您现在查看此查询的结果,您会发现语言发生了一些奇怪的情况:尽管我们认为我们选择了英语,但我们也得到了具有不同语言标签的标签(例如“@”茹')。要删除这些结果,我们可以进一步限制我们的查询,并说我们只需要英文后标签:
PREFIX terms: <http://wiktionary.dbpedia.org/terms/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>
SELECT ?term ?termLabel
WHERE {
?term terms:hasPoS terms:Noun ;
dc:language terms:English ;
rdfs:label ?termLabel .
FILTER(langMatches(lang(?termLabel), "en"))
}
LIMIT 100
最后是性别/属。在这里我不太确定。查看维基词典数据中的一些示例资源(例如,狗的条目),我想说这些信息实际上并不存在于数据中。
Jeen 的回答作为一个很好的开始。这是获取性别的选项。
英语不能很好地作为示例语言,因为它没有语法性别。我们来学德语吧:
PREFIX terms: <http://wiktionary.dbpedia.org/terms/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>
SELECT ?term ?termLabel
WHERE {
?term terms:hasPoS terms:Noun ;
dc:language terms:German ;
rdfs:label ?termLabel .
FILTER(langMatches(lang(?termLabel), "de"))
}
LIMIT 100
(过滤掉许多精确的重复项会很好。(我不知道如何以及为什么它们在那里。))
采用德语术语“Eierkopf”代替英语“dog”: 现在,我们可以按照术语链接访问 http://wiktionary.dbpedia.org/resource/Eierkopf-German-Noun,我们可以在其中看到德语版维基词典的链接 http://de.wiktionary.org/wiki/Eierkopf (我们也可以猜到该 URL,无需先从 wiktionary.dbpedia.org 获取)。
这里可以从文本中提取属:“Substantiv, m”(m 代表男性)
德语选项有:
<em title="Genus: Maskulinum (grammatikalisches Geschlecht: männlich)">m</em>
<em title="Genus: Femininum (grammatikal. Geschlecht: weiblich)">f</em>
<em title="Genus: Neutrum (grammatikal. Geschlecht: sächlich)">n</em>
如果名词根据地区/方言具有不同的性别,则官方性别位于如上所述的 HTML 中,并且下面会出现注释。示例:
https://de.wiktionary.org/wiki/Butter
所以除了查询SPARQL之外,还需要每个词1-2次网页请求,以及一些HTML内容提取。
我知道维基数据不是维基词典,但您可以通过查询维基数据查询服务来获取维基数据词位命名空间中的所有德语名词。例如,
SELECT
?lexeme ?lemma
WITH {
SELECT
?lexeme
WHERE {
?lexeme wikibase:lexicalCategory wd:Q1084 ;
dct:language wd:Q188 .
}
GROUP BY ?lexeme
} AS %lexemes
WHERE {
INCLUDE %lexemes
?lexeme wikibase:lemma ?lemma
}
此查询当前返回“164624 results in 6767 ms”