2015-06-17 1 views
2

Я пытаюсь запросить Wiktionary с SPARQL, чтобы получить все термины, которые существительных определенного языка (например, немецкий) и в качестве выходного :Как получить все существительные в определенном языке из Википедии с помощью SPARQL

  • строка существительного
  • грамматического рода (род): мужской, женский, нейтральный

Я использую SPARQL-Конечн аи точку nt: 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 . } 
} 

ответ

6

Прежде всего, вы хотите выбрать все термины, которые являются существительными. Как видно из результата запроса в примере запроса, эта информация фиксируется отношением 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

Итак, мы теперь выбрать то, что вы хотите, но мы еще не имеют выхода в формате, который вы хотите, в приведенном выше запросе просто возвращает идентификатор смысла термина, а не строковое значение фактического термина. Как мы можем видеть на выходе из примера запроса, строковое значение захватывается 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

Если вы теперь посмотрите на результат, этот запрос в вы посмотрите, что с языком происходит что-то странное: несмотря на то, что мы думали, что мы выбрали английский, мы также возвращаем метки, имеющие другой языковой тег (например, «@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

Наконец, гендерный/род. Здесь я не уверен. Если посмотреть на некоторые примеры ресурсов в данных wiktionary (например, entry for dog), я бы сказал, что эта информация фактически не присутствует в данных.

3

Ответ от Джин отлично подходит для начала. Вот выбор для получения пола.

Английский язык не служит примером языка, поскольку он не имеет грамматического пола.Давайте возьмем немецкий:

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» вместо английской «собаки»: Теперь мы можем перейти к термину link to http://wiktionary.dbpedia.org/resource/Eierkopf-German-Noun, где мы видим ссылку на Викисловарь на немецком языке http://de.wiktionary.org/wiki/Eierkopf (мы также могли бы догадаться, что этот URL-адрес, без получения wiktionary.dbpedia.org первый).

Здесь рода можно извлечь из текста: «Substantiv, м» (м для мужского)

Варианты для немецкого языка является:

<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.