维基词典的API如何用于确定单词是否存在?
答案 0 :(得分:60)
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 :(得分:24)
有一些警告只是检查维基词典中有一个页面,其中包含您要查找的名称:
警告#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)
如果这些内容未包含在您想要的内容中,则必须加载并解析wiki文本本身,这不是一项简单的任务。
答案 2 :(得分:18)
您可以下载Wikitionary data转储。 FAQ中有更多信息。出于您的目的,definitions dump可能是比xml转储更好的选择。
答案 3 :(得分:8)
为了保持简单,请从转储中提取单词:
bzcat pages-articles.xml.bz2 | grep '<title>[^[:space:][:punct:]]*</title>' | sed 's:.*<title>\(.*\)</title>.*:\1:' > words
答案 4 :(得分:2)
如果您使用的是Python,则可以使用Suyash Behera的WiktionaryParser。
您可以通过
进行安装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')
答案 5 :(得分:1)
你可能想尝试JWKTL。我刚刚发现了它;)
http://en.wikipedia.org/wiki/Ubiquitous_Knowledge_Processing_Lab#Wiktionary_API
答案 6 :(得分:1)
您可以使用Revisions API:
或Parse API:
https://en.wiktionary.org/w/api.php?action=parse&page=test&prop=wikitext&formatversion=2
docs中提供了更多示例。
答案 7 :(得分:0)
这是解析词源和发音数据的开始:
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}}
}
更新:Here的要点是更充实的。
答案 8 :(得分:0)
如前所述,此方法的问题在于维基词典提供有关所有语言的所有单词的信息。因此,使用Wikipedia API检查页面是否存在的方法将不起作用,因为有很多页面都包含非英语单词。为了克服这个问题,您需要分析每个页面以找出是否有描述英语单词的部分。解析Wikitext并不是一项琐碎的任务,尽管对于您而言,这还不是那么糟糕。要涵盖几乎所有情况,您只需要检查Wikitext是否包含English
标题即可。根据您使用的编程语言,您可以找到一些工具来根据Wikitext构建AST。这将涵盖大多数情况,但并非全部,因为Wiktionary包含一些常见的拼写错误。
或者,您可以尝试使用Lingua Robot或类似的方法。 Lingua Robot解析Wiktionary内容,并将其作为REST API提供。非空响应表示该词存在。请注意,与Wiktionary相反,API本身不包含任何拼写错误(至少在编写此答案时)。另请注意,维基词典不仅包含单词,还包含多单词表达。