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

问题描述 投票:0回答:9

如何使用维基词典的 API 来判断某个单词是否存在?

dictionary mediawiki-api wiktionary
9个回答
86
投票

维基词典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 解析器来解析这些内容。


36
投票

在检查维基词典是否有包含您要查找的名称的页面时,有一些注意事项:

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

如果这些不包含在您想要的内容中,您将必须加载并解析维基文本本身,这不是一个简单的任务。


24
投票

您可以下载维基词典数据的转储。 常见问题解答中有更多信息。出于您的目的,定义转储可能是比 XML 转储更好的选择。


13
投票

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

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

11
投票

如果您使用 Python,则可以使用 Suyash Behera 的 WiktionaryParser

您可以通过以下方式安装它

pip install wiktionaryparser

使用示例:

>>> from wiktionaryparser import WiktionaryParser
>>> parser = WiktionaryParser()
>>> word = parser.fetch('test')
>>> another_word = parser.fetch('test', 'french')
>>> parser.set_default_language('french')


2
投票

您可能想尝试 JWKTL。我刚刚才知道;)


2
投票

如前所述,这种方法的问题在于维基词典提供了所有语言的所有单词的信息。因此,使用 Wikipedia API 检查页面是否存在的方法将不起作用,因为有很多页面包含非英语单词。为了克服这个问题,您需要解析每个页面以找出是否有描述英语单词的部分。解析维基文本并不是一件简单的任务,尽管在你的情况下它并没有那么糟糕。要涵盖几乎所有情况,您只需检查维基文本是否包含

English
标题。根据您使用的编程语言,您可以找到一些工具来从 wikitext 构建 AST。这将涵盖大多数情况,但不是全部,因为维基词典包含一些常见的拼写错误。

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


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

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

© www.soinside.com 2019 - 2024. All rights reserved.