如何使用 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
接下来你想要的只是某种语言的名词。这似乎包含在 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
所以,我们现在 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
如果您现在查看此查询的结果,您会发现语言有些奇怪:尽管我们认为我们 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
最后,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
(过滤掉许多完全相同的重复项会很好。(我不知道它们是如何存在的,也不知道它们为何存在。))
使用德语术语 "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内容提取。
我正在尝试使用 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
接下来你想要的只是某种语言的名词。这似乎包含在 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
所以,我们现在 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
如果您现在查看此查询的结果,您会发现语言有些奇怪:尽管我们认为我们 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
最后,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
(过滤掉许多完全相同的重复项会很好。(我不知道它们是如何存在的,也不知道它们为何存在。))
使用德语术语 "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内容提取。