如何使用Wiktionary的API来确定一个单词是否存在?
如何使用Wiktionary的API来确定一个单词是否存在?
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解析器进行解析。
在仅检查Wiktionary是否有所要查找的单词这一点上,有一些需要注意的地方:
注意 #1:所有Wiktionary,包括英文Wiktionary,实际目标都是收录每一种语言的每一个单词,因此如果您仅使用上述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:一些Wiktionary,包括英文Wiktionary,包括“常见拼写错误”: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
属性。 - svick您可以下载Wiktionary数据的转储。在FAQ中有更多信息。对于您的目的,定义转储可能比XML转储更好。
为了让它真正简单,可以这样从转储中提取单词:
bzcat pages-articles.xml.bz2 | grep '<title>[^[:space:][:punct:]]*</title>' | sed 's:.*<title>\(.*\)</title>.*:\1:' > words
LANGwiktionary-DATE-pages-articles.xml.bz2
格式的转储文件的通用名称。请前往链接,然后单击 LANGwiktionary
(LANG 例如 'en','de'...)。 - benrothbzcat pages-articles.xml.bz2 | grep '<title>\(.*\)</title>' | sed 's:.*<title>\(.*\)</title>.*:\1:' > words
。 - nico_lrxpip install wiktionaryparser
示例用法:
from pprint import pprint
from wiktionaryparser import WiktionaryParser
parser = WiktionaryParser()
word = parser.fetch('test')
pprint(word)
another_word = parser.fetch('test', 'french')
pprint(another_word)
# features
parser.set_default_language('french')
parser.exclude_part_of_speech('noun')
parser.include_relation('alternative forms')
你可能想要尝试一下 JWKTL。我刚刚发现它的存在 ;)
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}}
}
这里有一个更详细的代码片段。
langs
是什么? - knblangs
有几千行,太大了无法在SO上发布。 - Lance