如何使用 SPARQL 从维基词典中获取某种语言的所有名词

How to get all nouns in a certain language from Wiktionary using SPARQL

我正在尝试使用 SPARQL 查询 Wiktionary 以获取属于某种语言名词的所有术语(例如德语) 作为输出:

我正在使用 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 . }
}

首先,您想要 select 所有词义都是名词。正如您在示例查询的查询结果中所见,此信息由 terms:hasPoS 关系捕获。因此,要专门查询所有名词,我们可以这样做:

PREFIX terms: <http://wiktionary.dbpedia.org/terms/>
SELECT ?term
WHERE { 
     ?term terms:hasPoS terms:Noun . 
}
LIMIT 100 

Result

接下来你想要的只是某种语言的名词。这似乎包含在 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 

Result

所以,我们现在 selecting 你想要的,但我们还没有你想要的格式的输出,因为上面的查询只是返回了术语 sense 的标识符,而不是实际术语的字符串值。正如我们在示例查询的输出中看到的,字符串值由 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

Result

如果您现在查看此查询的结果,您会发现语言有些奇怪:尽管我们认为我们 select 是英语,但我们也得到了返回的标签具有不同的语言标签(例如“@ru”)。要删除这些结果,我们可以进一步限制我们的查询,并说我们只需要英文的返回标签:

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

Result

最后,gender/genus。在这里我不太确定。查看维基词典数据中的一些示例资源(例如,entry for dog)我会说这些信息实际上并不存在于数据中。

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

Result

(过滤掉许多完全相同的重复项会很好。(我不知道它们是如何存在的,也不知道它们为何存在。))

使用德语术语 "Eierkopf" 而不是英语 "dog": 我们现在可以按照术语 link 到 http://wiktionary.dbpedia.org/resource/Eierkopf-German-Noun where we see the link to Wiktionary in German 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>

如果一个名词根据region/dialect有不同的性别,官方性别如上HTML,下面会出现注释。示例:

https://de.wiktionary.org/wiki/Butter

所以除了查询SPARQL外,还需要每个词1-2次网页请求,还有一些HTML内容提取。