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


90

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


Любой, кто читал документацию, увидит, что API не содержит достаточной функциональности, чтобы «извлекать содержание слов из Викисловаря». Я бы оценил это примерно в 1% пути. Вы можете получить необработанный синтаксис вики или проанализированный HTML, и оттуда вам придется делать все самостоятельно. Сказав, что может быть очень новый экспериментальный API, который работает только в англоязычном викисловаре.
hippietrail

3
Получить все статьи Викисловара в отдельных файлах в формате JSON здесь: github.com/dan1wang/jsonbook-builder
Даниила

Ответы:


69

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

1
Теперь он принимает дополнительный параметр формата для вывода, отличного от xml, например: en.wiktionary.org/w/…
eenagy

4
Может не работать , как вы ожидаете , хотя en.wiktionary.org/wiki/Category:English_misspellings en.wiktionary.org/wiki/amatuer
эндолиты

2
Как фильтровать в этом API только английские слова?
Nadav B

1
В этом примере используйте HTTPS. Текущая версия http не дает результатов
adjwilli

28

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

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

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


2
Что я действительно хотел сделать, так это сделать полный дамп данных с одного из неанглоязычных сайтов Викислова, а затем превратить его содержимое в то, что я мог бы использовать локально. Сейчас это кажется глупым, но я надеялся, что смогу запросить список всех слов, а затем при необходимости поочередно вытащить их определения / переводы.
Armentage 05

1
Исправить предостережение №2 просто: добавьте &prop=infoв запрос и проверьте ответ на redirectатрибут.
svick

@svick: Да, это правда. # 2 легче обойти при использовании API, но эти основные предостережения также касаются попытки синтаксического анализа файлов дампа данных Wiktionary , даже если этот вопрос не касается такого подхода.
hippietrail

17

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


2
Эти файлы дампа огромны, и неясно, какие из них загружать (все?). Вероятно, это не то, что ищут большинство людей, они просто хотят программно найти несколько слов.
Cerin

1
Я объясняю, какой файл загружать, то есть дамп определений (каталог из моей ссылки - это просто разные версии одного и того же файла), и да, если вы хотите программно искать слова, это идеальный вариант. Если вы можете гарантировать, что программа будет выполняться только онлайн, есть и другие варианты, но, тем не менее, я отвечаю на эту часть исходного вопроса: «В качестве альтернативы, могу ли я как-нибудь извлечь данные словаря, поддерживающие викисловарь?»
kybernetikos

18
Ссылка на дамп определений больше не доступна.
живая любовь

8

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

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

как мне получить копию pages-article.xml.bz2?
Armentage

Это просто общее название, которое я использовал для описания дампов формы LANGwiktionary-DATE-pages-articles.xml.bz2. Перейдите по ссылке , затем щелкните LANGwiktionary(LANG, например, «en», «de» ...).
benroth

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

1

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

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

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


1
Цитата, на которую вы ссылаетесь, не работает. Вот ссылка на страницу JWKTL ukp.tu-darmstadt.de/software/jwktl . Хотя я считаю, что это не совсем то, что ищет OP.
djskinner

1

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

В качестве альтернативы вы можете попробовать использовать Lingua Robot или что-то подобное. Lingua Robot анализирует содержимое Викисловаря и предоставляет его как REST API. Непустой ответ означает, что слово существует. Обратите внимание, что, в отличие от Викисловаря, сам 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}}
}

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


спасибо, попытался запустить его в консоли разработчика браузера. что есть langs?
knb

1
обновлено с учетом сути, langsэто несколько тысяч строк, слишком много для SO.
Lance Pollard
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.