3

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

2 回答 2

8

首先,您要选择所有名词的词义。如您在示例查询的查询结果中所见,此信息由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

结果

如果您现在查看此查询的结果,您会发现该语言存在一些奇怪的地方:尽管我们认为我们选择了英语,但我们也得到了具有不同语言标签的标签(例如 '@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

结果

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

于 2015-06-17T23:43:49.177 回答
3

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 ://wiktionary 的链接://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 内容提取。

于 2015-06-19T18:14:39.250 回答