如何检索 Wiktionary 单词内容?

如何使用 Wiktionary 的 API 来确定一个单词是否存在?

66121 次浏览

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 调用,你就会知道你所询问的单词至少是一种语言中的单词,但不一定是英语中的单词。 < a href = “ http://en.Wiktionary.org/w/API.php? action = query & amp; title = dicare”rel = “ noReferrer”> http://en.Wiktionary.org/w/API.php?action=query&titles=dicare

Caveat #2: Perhaps a redirect exists from one word to another word. It might be from an alternative spelling, but it might be from an error of some kind. The API call above will not differentiate between a redirect and an article: http://en.wiktionary.org/w/api.php?action=query&titles=profilemetry

警告 # 3 : 包括英语维基词典在内的一些维基词典包括“常见拼写错误”: < a href = “ http://en.Wiktionary.org/w/api.php? action = query & amp; title = four”rel = “ noReferrer”> 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)

如果您想要的内容中没有包含这些内容,那么您将不得不加载和解析 wikitext 本身,这不是一个简单的任务。

You might want to try JWKTL out. I just found out about it ;)

You can download a dump of 维基数据. There's more information in the 常见问题. For your purposes, the 定义丢弃 is probably a better choice than the XML dump.

为了简单起见,从转储中提取单词如下:

bzcat pages-articles.xml.bz2 | grep '<title>[^[:space:][:punct:]]*</title>' | sed 's:.*<title>\(.*\)</title>.*:\1:' > words

如果您正在使用 Python,则可以使用 SuyashBehera 的 WiktionaryParser

You can install it by

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')

下面是解析词源和发音数据的开始:

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() // The 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}}
}

这里 是一个更加充实的要点。

正如前面提到的,这种方法的问题在于 维基词典提供了所有语言的所有单词的信息。因此,使用 Wikipedia API 检查页面是否存在的方法不会起作用,因为存在大量非英语单词的页面。为了克服这一点,你需要分析每一页,以确定是否有一个部分描述英语单词。解析 wikitext 并不是一项琐碎的任务,尽管在您的情况下它并没有那么糟糕。要覆盖几乎所有的情况下,您只需要检查 wikitext 是否包含 English标题。根据您使用的编程语言,您可以找到一些工具来从 wikitext 构建 AST。这将涵盖大多数情况,但不是所有情况,因为维基词典包括一些常见的拼写错误。

作为替代方案,您可以尝试使用 林瓜机器人或类似的东西。LingaRobot 解析 Wiktionary 内容并将其作为 休息API 提供。非空响应表示该单词存在。请注意,与 Wiktionary 不同的是,API 本身不包括任何拼写错误(至少在写这个答案的时候)。还请注意,维基词典不仅包含单词,而且包含多个单词表达式。