Як отримати вміст слів Вікісловника?


90

Як можна використовувати API Вікісловника, щоб визначити, чи існує слово чи ні?


Той, хто прочитав документацію, побачить, що 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 - це не те, на що я сподівався, але посилання, яке ви надали - це те, що я шукав.
Арментаж

1
Тепер він приймає додатковий параметр формату для виведення, що не являє
собою

4
Може не працювати , як ви очікуєте , хоча en.wiktionary.org/wiki/Category:English_misspellings en.wiktionary.org/wiki/amatuer
ендоліти

Використовуйте:, https://en.wiktionary.org/w/?curid=[page_id]&printable=yesдля переспрямування на сторінку XHTML за допомогою pageid.
mie.ppa

2
Як фільтрувати в цьому API лише англійські слова?
Nadav B,

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

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

@svick: Так, це правда # 2 простіше обійти при використанні API, але ці основні застереження також охоплюють спробу синтаксичного аналізу файлів дампа даних Вікісловника , хоча це питання не задає такого підходу.
hippietrail

17

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


2
Ці файли дампів масивні, і незрозуміло, які завантажувати (усі?). Можливо, не те, що більшість людей шукає, вони просто хочуть програмно шукати кілька слів.
Черін

1
Я пояснюю, який файл завантажувати - тобто дамп визначень (каталог з мого посилання - це просто різні версії одного і того ж файлу), і так, якщо ви програмно хочете шукати слова, це ідеально. Якщо ви можете гарантувати, що програма буде виконуватися лише в Інтернеті, є й інші варіанти, але, тим не менше, я відповідаю на цю частину вихідного запитання: "Або я можу якось витягнути дані словника, які підтримують Вікісловник?"
kybernetikos

18
Дамп посилання на визначення більше не доступний.
live-love

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' ...).
Бенрот,

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 . Насправді це не те, що, як я вважаю, шукає ОП.
djskinner

1

Як зазначалося раніше, проблема такого підходу полягає в тому, що Вікісловник надає інформацію про всі слова всіх мов . Тож підхід до перевірки того, чи існує сторінка за допомогою API Вікіпедії, не спрацює, оскільки є багато сторінок з неанглійськими словами. Щоб подолати це, потрібно проаналізувати кожну сторінку, щоб з’ясувати, чи є розділ, що описує англійське слово . Розбір вікітексту не є тривіальним завданням, хоча у вашому випадку це не так вже й погано. Щоб охопити майже всі випадки, вам потрібно просто перевірити, чи містить вікітекст Englishзаголовок. Залежно від мови програмування, яку ви використовуєте, ви можете знайти деякі інструменти для побудови AST із wikitext. Це охоплюватиме більшість випадків, але не всі з них, оскільки Вікісловник містить деякі загальні орфографічні помилки.

Як альтернативу ви можете спробувати використовувати робот Lingua або щось подібне. 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}}
}

Оновлення : Ось суть його більш докладної.


дякую, спробував запустити його всередині консолі devtools браузера. що це langs?
knb

1
оновлений суттю, langsстановить кілька тисяч рядків, занадто великий для SO.
Ленс Поллард,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.