Как можно использовать API Wiktionary, чтобы определить, существует ли слово?
Как можно использовать API Wiktionary, чтобы определить, существует ли слово?
Ответы:
Wiktionary 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 )
Если они не включены в то, что вы хотите, вам придется загрузить и проанализировать сам вики-текст, что является нетривиальной задачей.
&prop=info
в запрос и проверьте ответ на redirect
атрибут.
Вы можете скачать дамп данных Викисловаря . Больше информации можно найти в 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')
Возможно, вы захотите попробовать JWKTL. Я только что узнал об этом;)
http://en.wikipedia.org/wiki/Ubiquitous_Knowledge_Processing_Lab#Wiktionary_API
Как упоминалось ранее, проблема этого подхода заключается в том, что Викисловарь предоставляет информацию обо всех словах всех языков . Таким образом, подход к проверке существования страницы с использованием Wikipedia API не сработает, потому что существует много страниц для неанглийских слов. Чтобы преодолеть это, вам нужно проанализировать каждую страницу, чтобы выяснить, есть ли раздел, описывающий английское слово . Разбор викитекста - нетривиальная задача, хотя в вашем случае это не так уж и плохо. Чтобы охватить почти все случаи, вам нужно просто проверить, содержит ли викитекст English
заголовок. В зависимости от того, какой язык программирования вы используете, вы можете найти некоторые инструменты для создания AST. из викитекста. Это будет охватывать большинство случаев, но не все из них, потому что Викисловарь содержит некоторые распространенные орфографические ошибки.
В качестве альтернативы вы можете попробовать использовать Lingua Robot или что-то подобное. Lingua Robot анализирует содержимое Викисловаря и предоставляет его как REST API. Непустой ответ означает, что слово существует. Обратите внимание, что, в отличие от Викисловаря, сам API не содержит орфографических ошибок (по крайней мере, на момент написания этого ответа). Также обратите внимание, что Викисловарь содержит не только слова, но и многословные выражения.
Вы можете использовать Revisions API:
или API Parse:
https://en.wiktionary.org/w/api.php?action=parse&page=test&prop=wikitext&formatversion=2
Дополнительные примеры приведены в документации .
Вот начало анализа этимологии и данных произношения:
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}}
}
Обновление : вот суть с более конкретным изложением.
langs
?
langs
это несколько тысяч строк, слишком много для SO.