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

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

6 ответов

Решение

Викисловарный API можно использовать для запроса, существует ли слово.

Примеры для существующих и несуществующих страниц:

http://en.wiktionary.org/w/api.php?action=query&titles=testhttp://en.wiktionary.org/w/api.php?action=query&titles=testx

Первая ссылка содержит примеры форматов других типов, которые проще проанализировать.

Чтобы получить данные слова в небольшом формате XHTML (если требуется больше, чем просто наличие), запросите версию страницы для печати:

http://en.wiktionary.org/w/index.php?title=test&printable=yeshttp://en.wiktionary.org/w/index.php?title=testx&printable=yes

Затем их можно проанализировать с помощью любого стандартного анализатора XML.

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

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

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

Вы можете скачать дамп вики-данных. Там больше информации в FAQ. Для ваших целей дамп определений, вероятно, является лучшим выбором, чем дамп xml.

Для простоты извлеките слова из дампа так:

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

Если вы используете 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')

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

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

Вы можете попробовать JWKTL. Я только что узнал об этом;)

http://en.wikipedia.org/wiki/Ubiquitous_Knowledge_Processing_Lab

http://www.ukp.tu-darmstadt.de/software/jwktl/

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

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

Обновление: вот его суть более подробно.

Другие вопросы по тегам