Как получить содержание слова из Викисловаря?
Как можно использовать API Викисловаря, чтобы определить, существует ли слово?
6 ответов
Викисловарный API можно использовать для запроса, существует ли слово.
Примеры для существующих и несуществующих страниц:
http://en.wiktionary.org/w/api.php?action=query&titles=test
http://en.wiktionary.org/w/api.php?action=query&titles=testx
Первая ссылка содержит примеры форматов других типов, которые проще проанализировать.
Чтобы получить данные слова в небольшом формате XHTML (если требуется больше, чем просто наличие), запросите версию страницы для печати:
http://en.wiktionary.org/w/index.php?title=test&printable=yes
http://en.wiktionary.org/w/index.php?title=testx&printable=yes
Затем их можно проанализировать с помощью любого стандартного анализатора XML.
Есть несколько предостережений при проверке того, что в Викисловарь есть страница с именем, которое вы ищете:
Предостережение № 1: Все Викисловари, включая английский Викисловарь, на самом деле имеют целью включение каждого слова в каждый язык, поэтому, если вы просто используете вышеупомянутый вызов API, вы будете знать, что слово, о котором вы спрашиваете, является словом по крайней мере на одном языке, но не обязательно английский: http://en.wiktionary.org/w/api.php?action=query&titles=dicare
Предостережение № 2: Возможно, существует перенаправление с одного слова на другое. Это может быть из альтернативного правописания, но это может быть из-за какой-то ошибки. Вызов API выше не будет различать редирект и статью: http://en.wiktionary.org/w/api.php?action=query&titles=profilemetry
Предостережение № 3: Некоторые Викисловари, в том числе Викисловарь на английском языке, включают "общие орфографические ошибки": http://en.wiktionary.org/w/api.php?action=query&titles=fourty
Предостережение № 4: Некоторые Викисловарии допускают записи-заглушки, в которых мало или вообще нет информации о данном термине. Раньше это встречалось в нескольких викисловарях, но не в английском. Но, похоже, теперь оно распространилось и на английский Викисловарь: https://en.wiktionary.org/wiki/%E6%99%B6%E7%90%83 (постоянная ссылка, когда заглушка заполнена, так что вы все еще можете видеть как выглядит заглушка: https://en.wiktionary.org/w/index.php?title=%E6%99%B6%E7%90%83&oldid=39757161)
Если они не включены в то, что вы хотите, вам придется загрузить и проанализировать сам викитекст, что не является тривиальной задачей.
Вы можете скачать дамп вики-данных. Там больше информации в FAQ. Для ваших целей дамп определений, вероятно, является лучшим выбором, чем дамп xml.
Для простоты извлеките слова из дампа так:
bzcat pages-articles.xml.bz2 | grep '<title>[^[:space:][:punct:]]*</title>' | sed 's:.*<title>\(.*\)</title>.*:\1:' > words
Если вы используете Python, вы можете использовать WiktionaryParser от Suyash Behera.
Вы можете установить его по
sudo pip install wiktionaryparser
Пример использования:
>>> from wiktionaryparser import WiktionaryParser
>>> parser = WiktionaryParser()
>>> word = parser.fetch('test')
>>> another_word = parser.fetch('test', 'french')
>>> parser.set_default_language('french')
Вы можете использовать Revisions API:
или API Parse:
https://en.wiktionary.org/w/api.php?action=parse&page=test&prop=wikitext&formatversion=2
Дополнительные примеры приведены в документации.
Как упоминалось ранее, проблема этого подхода заключается в том, что Викисловарь предоставляет информацию обо всех словах всех языков. Таким образом, подход к проверке существования страницы с использованием Wikipedia API не сработает, потому что существует много страниц для неанглийских слов. Чтобы преодолеть это, вам нужно проанализировать каждую страницу, чтобы выяснить, есть ли раздел, описывающий английское слово. Разбор викитекста - нетривиальная задача, хотя в вашем случае это не так уж и плохо. Чтобы охватить почти все случаи, вам нужно просто проверить, содержит ли вики-текстEnglish
заголовок. В зависимости от языка программирования, который вы используете, вы можете найти некоторые инструменты для создания AST из викитекста. Это будет охватывать большинство случаев, но не все из них, потому что Викисловарь содержит некоторые распространенные орфографические ошибки.
В качестве альтернативы вы можете попробовать использовать Lingua Robot или что-то подобное. Lingua Robot анализирует содержимое Викисловаря и предоставляет его как REST API. Непустой ответ означает, что слово существует. Обратите внимание, что, в отличие от Викисловаря, сам API не содержит орфографических ошибок (по крайней мере, на момент написания этого ответа). Также обратите внимание, что Викисловарь содержит не только слова, но и многословные выражения.
Вы можете попробовать JWKTL. Я только что узнал об этом;)
http://en.wikipedia.org/wiki/Ubiquitous_Knowledge_Processing_Lab
Вот начало анализа этимологии и данных произношения:
function parsePronunciationLine(line) {
let val
let type
line.replace(/\{\{\s*a\s*\|UK\s*\}\}\s*\{\{IPA\|\/?([^\/\|]+)\/?\|lang=en\}\}/, (_, $1) => {
val = $1
type = 'uk'
})
line.replace(/\{\{\s*a\s*\|US\s*\}\}\s*\{\{IPA\|\/?([^\/\|]+)\/?\|lang=en\}\}/, (_, $1) => {
val = $1
type = 'us'
})
line.replace(/\{\{enPR|[^\}]+\}\},?\s*\{\{IPA\|\/?([^\/\|]+)\/?\|lang=en}}/, (_, $1) => {
val = $1
type = 'us'
})
line.replace(/\{\{a|GA\}\},?\s*\{\{IPA\|\/?([^\/\|]+)\/?\|lang=en}}/, (_, $1) => {
val = $1
type = 'ga'
})
line.replace(/\{\{a|GA\}\},?.+\{\{IPA\|\/?([^\/\|]+)\/?\|lang=en}}/, (_, $1) => {
val = $1
type = 'ga'
})
// {{a|GA}} {{IPA|/ˈhæpi/|lang=en}}
// * {{a|RP}} {{IPA|/pliːz/|lang=en}}
// * {{a|GA}} {{enPR|plēz}}, {{IPA|/pliz/|[pʰliz]|lang=en}}
if (!val) return
return { val, type }
}
function parseEtymologyPiece(piece) {
let parts = piece.split('|')
parts.shift() // first one is ignored.
let ls = []
if (langs[parts[0]]) {
ls.push(parts.shift())
}
if (langs[parts[0]]) {
ls.push(parts.shift())
}
let l = ls.pop()
let t = parts.shift()
return [ l, t ]
// {{inh|en|enm|poisoun}}
// {{m|enm|poyson}}
// {{der|en|la|pōtio|pōtio, pōtiōnis|t=drink, a draught, a poisonous draught, a potion}}
// {{m|la|pōtō|t=I drink}}
// {{der|en|enm|happy||fortunate, happy}}
// {{cog|is|heppinn||lucky}}
}
Обновление: вот его суть более подробно.