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


89

Wiktionary的API如何用于确定单词是否存在?


任何阅读过该文档的人都将看到,该API所包含的功能远远不足以“检索维基词典中的单词内容”。我估计可以为您带来大约1%的收益。您可以检索原始Wiki语法或已解析的HTML,然后您必须自己做所有事情。话虽这么说,可能会有一个非常新的实验性API,仅适用于英语维基词典。
hippietrail

3
在单个JSON文件中获取所有Wiktionary文章,网址为
daniel

Answers:


69

维基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,2010年

现在,它接受其他比XML输出像这样的附加格式参数:en.wiktionary.org/w/...
eenagy


使用https://en.wiktionary.org/w/?curid=[page_id]&printable=yes,使用重定向到XHTML页面pageid
mie.ppa

2
如何在此API中仅过滤英文单词?
Nadav B

28

仅检查Wiktionary是否具有您要查找的名称的页面时,需要注意以下几点:

警告#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

如果您想要的内容中没有包含这些内容,则必须加载并解析Wikitext本身,这不是一件简单的任务。


2
我真正想做的是将一个非英语Wikitionary网站上的数据完全转储,然后将其内容转换成可以在本地使用的内容。现在看来很傻,但是我希望我可以要求所有单词的列表,然后根据需要一次将它们的定义/翻译拉下来。
Armentage,2010年

1
警告#2的解决方法很简单:添加&prop=info到查询中并检查响应的redirect属性。
svick

@svick:是的,确实如此,使用API​​时更容易规避#2,但是这些基本警告也涵盖了尝试解析Wiktionary数据转储文件的内容,即使此问题并未询问该方法。
hippietrail 2012年

17

您可以下载Wikitionary数据的转储。FAQ中有更多信息。就您的目的而言,定义转储可能比xml转储更好。


2
这些转储文件很大,不清楚要下载哪些文件(全部?)。可能不是大多数人想要的东西,他们只是想以编程方式查找几个单词。
塞林2012年

1
我解释了要下载的文件-即定义转储(我链接中的目录只是同一文件的不同版本),是的,如果您以编程方式想要查找单词,这是理想的选择。如果可以保证程序只能在线执行,那么还有其他选择,但是我正在回答原始问题的这一部分:“或者,我有什么办法可以提取支持Wiktionary的字典数据?”
kybernetikos 2012年

18
定义转储链接不再可用。
现场直播

8

为了保持简单,请像这样从转储中提取单词:

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 2012年

4

如果使用的是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')


1

如前所述,这种方法的问题在于,维基词典提供了有关所有语言的所有单词的信息。因此,使用Wikipedia API来检查页面是否存在的方法将不起作用,因为存在很多非英语单词的页面。为了克服这个问题,您需要分析每个页面以找出是否有描述英语单词的部分。解析Wikitext并不是一件容易的事,尽管对于您而言,这还不是那么糟糕。要涵盖几乎所有情况,您只需要检查Wikitext是否包含English标题即可。根据您使用的编程语言,您可以找到一些从Wikitext 构建AST的工具。这将涵盖大多数情况,但并非全部,因为Wiktionary包含一些常见的拼写错误。

或者,您可以尝试使用Lingua Robot或类似工具。Lingua Robot解析Wiktionary内容,并将其作为REST API提供。非空响应表示该词存在。请注意,与Wiktionary相反,API本身不包含任何拼写错误(至少在编写此答案时)。还请注意,维基词典不仅包含单词,还包含多单词表达。


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}}
}

更新这里有一个要点,更加充实。


谢谢,尝试在浏览器devtools控制台中运行它。是什么langs
knb

1
更新了要点,langs是几千行,对于SO来说太大了。
兰斯·波拉德

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.