Как получить содержимое словаря Викисловаря?

Как использовать API Викисловаря, чтобы определить, существует ли слово?

Ответ 1

Викисловарь 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.

Ответ 2

Есть несколько предостережений при проверке того, что в Викисловарь есть страница с именем, которое вы ищете:

Предостережение # 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)

Если они не включены в то, что вы хотите, вам придется загрузить и проанализировать сам вики-текст, что не является тривиальной задачей.

Ответ 4

Чтобы это было действительно просто, извлеките слова из дампа следующим образом:

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

Ответ 5

Если вы используете Python, вы можете использовать WiktionaryParser от Suyash Behera.

Вы можете установить его по

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')

Ответ 7

Вот начало анализа этимологии и данных произношения:

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

Обновление: вот суть в этом более конкретизирована.

Ответ 8

Как упоминалось ранее, проблема этого подхода заключается в том, что Викисловарь предоставляет информацию обо всех словах всех языков. Таким образом, подход, позволяющий проверить, существует ли страница с использованием API Википедии, не сработает, потому что существует множество страниц для неанглоязычных слов. Чтобы преодолеть это, вам нужно проанализировать каждую страницу, чтобы выяснить, есть ли раздел, описывающий английское слово. Разбор викитекста не является тривиальной задачей, хотя в вашем случае это не так уж и плохо. Чтобы охватить почти все случаи, вам нужно просто проверить, содержит ли викитекст заголовок English. В зависимости от языка программирования, который вы используете, вы можете найти некоторые инструменты для сборки AST из wikitext. Это будет охватывать большинство случаев, но не все из них, потому что Викисловарь включает в себя некоторые общие орфографические ошибки.

В качестве альтернативы вы можете попробовать использовать Lingua Robot или что-то подобное. Lingua Robot анализирует содержимое Викисловаря и предоставляет его в качестве REST API. Непустой ответ означает, что слово существует. Обратите внимание, что, в отличие от Викисловаря, сам API не содержит никаких орфографических ошибок (по крайней мере, на момент написания этого ответа). Также обратите внимание, что Викисловарь содержит не только слова, но и выражения из нескольких слов.