我该如何检索维基词典的单词内容?

124

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


1
任何阅读过文档的人都会发现,API 包含的功能远远不足以“检索维基词典单词内容”。我估计它只能让你完成大约 1% 的工作。你可以检索原始的维基语法或解析后的 HTML,然后你必须自己完成所有工作。话虽如此,可能有一个非常新的实验性 API,仅适用于英语维基词典。 - hippietrail
6
在这里获取所有Wiktionary词条的单独JSON文件:https://github.com/dan1wang/jsonbook-builder - daniel
2
这里有一个更好的解析JSON版本:https://kaikki.org/ - Pux
9个回答

87

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解析器进行解析。


4
谢谢;API本身并不是我所希望的,但你提供的链接正是我所寻找的。 - Armentage
2
现在它接受额外的格式参数,用于除 XML 以外的其他输出,例如:https://en.wiktionary.org/w/api.php?action=query&titles=test&format=json - eenagy
4
可能不符合您的预期,但这里有一些链接可供参考:https://en.wiktionary.org/wiki/Category:English_misspellings 和 https://en.wiktionary.org/wiki/amatuer。 - endolith
5
如何在这个API中仅过滤出英文单词? - Nathan B
1
可悲的是,可打印的XHTML似乎得到了很差的支持。它显示了一个“不再受支持”的警告。此外,我发现它给了我无效的XHTML,特别是一个未关闭的<input>标签。这是我使用的URL:https://en.wiktionary.org/w/?curid=103410&printable=yes,或者:https://en.wiktionary.org/w/index.php?title=test&printable=yes。 - Max Barraclough
显示剩余4条评论

38

在仅检查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)。

如果这些内容不符合您的要求,则必须加载和解析维基文本本身,这不是一个简单的任务。


3
我真正想做的是将非英语维基词典网站上的全部数据完整地复制下来,然后把内容转化成我可以在本地使用的东西。现在看起来有点傻,但我希望能请求所有单词的列表,然后根据需要逐个获取它们的定义/翻译。 - Armentage
1
修复第二个注意事项很简单:在查询中添加&prop=info,并检查响应中的redirect属性。 - svick
@svick:是的,使用API绕过#2更容易,但这些基本警告也适用于尝试解析Wiktionary数据转储文件,即使这个问题没有询问那种方法。 - hippietrail

24

3
这些转储文件非常庞大,而且不清楚应该下载哪些文件(是全部吗?)。如果只是想编程查询少量单词,这可能不是大多数人所寻找的。 - Cerin
1
我会解释应该下载哪个文件,即定义转储文件(我的链接目录只是同一文件的不同版本),如果您想以编程方式查找单词,则这是理想的选择。如果您可以保证程序仅在线执行,那么还有其他选项,但无论如何,我都会回答原始问题的这部分:“或者,是否有任何方法可以获取支持Wiktionary的字典数据?” - kybernetikos
22
定义转储链接不再可用。 - live-love

13

为了让它真正简单,可以这样从转储中提取单词:

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

我该如何获取pages-articles.xml.bz2的副本? - Armentage
这只是我用来描述 LANGwiktionary-DATE-pages-articles.xml.bz2 格式的转储文件的通用名称。请前往链接,然后单击 LANGwiktionary(LANG 例如 'en','de'...)。 - benroth
太好了,谢谢!如果你想要获取带有破折号或空格的单词,你应该使用以下命令:bzcat pages-articles.xml.bz2 | grep '<title>\(.*\)</title>' | sed 's:.*<title>\(.*\)</title>.*:\1:' > words - nico_lrx

11
如果你正在使用Python,你可以使用Suyash Behera的WiktionaryParser
你可以通过以下方式安装它:
pip 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')

4

您还可以在URL中添加“&format=json”以获得格式化的响应。 - remborg

2
如前所述,这种方法的问题在于Wiktionary提供了所有语言的所有单词的信息。因此,使用Wikipedia API检查页面是否存在的方法行不通,因为有很多非英语单词的页面。为了克服这个问题,您需要解析每个页面,以确定是否有描述英语单词的部分。尽管解析wikitext并不是一项轻松的任务,但在您的情况下并不那么糟糕。为了覆盖几乎所有情况,您只需要检查wikitext是否包含“English”标题即可。根据您使用的编程语言,您可以找到一些工具从wikitext构建AST。这将涵盖大多数情况,但并非所有情况,因为Wiktionary包括一些常见的拼写错误。
作为替代方案,您可以尝试使用Lingua Robot或类似的工具。Lingua Robot解析维基词典内容并提供REST API。非空响应表示该单词存在。请注意,与维基词典不同,API本身不包含任何拼写错误(至少在撰写本答案时是这样)。还请注意,维基词典不仅包含单词,还包括多个单词组成的表达方式。

2

1
你所引用的引文已经失效了。这里有一个链接到JWKTL页面的地址:http://www.ukp.tu-darmstadt.de/software/jwktl/。不过,我并不认为这是原帖作者所寻找的内容。 - djskinner
第二个链接(实际上)已经失效。它重定向到一个遗传页面,*欢迎来到Ubiquitous Knowledge Processing (UKP)实验室!*。 - Peter Mortensen
维基百科的参考资料指向*从维基百科和Wiktionary中提取词汇语义知识“...JWKTL(基于Java的WiKTionary库)...”*。 - Peter Mortensen

1
这里是解析词源和发音数据的开始:
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是什么? - knb
1
更新了一个Gist,langs有几千行,太大了无法在SO上发布。 - Lance

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接