Bagaimana cara mendapatkan kembali konten kata Wiktionary?

90

Bagaimana API Wiktionary digunakan untuk menentukan ada atau tidaknya sebuah kata?

Armentage
sumber
Siapapun yang telah membaca dokumentasi akan melihat bahwa API tidak memiliki cukup fungsionalitas untuk "mengambil konten kata Wiktionary". Saya memperkirakan itu membuat Anda kira-kira 1%. Anda dapat mengambil sintaks wiki mentah atau HTML yang telah diurai dan dari sana Anda harus melakukan semuanya sendiri. Karena itu mungkin ada API eksperimental yang sangat baru yang hanya berfungsi di Wiktionary bahasa Inggris.
hippietrail
3
Dapatkan semua artikel Wiktionary dalam file JSON individu di sini: github.com/dan1wang/jsonbook-builder
daniel

Jawaban:

69

The Wiktionary API dapat digunakan untuk permintaan apakah atau tidak kata ada.

Contoh untuk halaman yang ada dan yang tidak ada:

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

Tautan pertama memberikan contoh tentang jenis format lain yang mungkin lebih mudah diurai.

Untuk mengambil data kata dalam format XHTML kecil (harus lebih dari yang dibutuhkan), minta versi halaman yang dapat dicetak:

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

Ini kemudian dapat diurai dengan parser XML standar apa pun.

Michael Mrozek
sumber
4
Terima kasih; API itu sendiri bukanlah yang saya harapkan, tetapi tautan yang Anda berikan adalah yang saya cari.
Armentage
1
Sekarang menerima parameter format tambahan selain output xml seperti: en.wiktionary.org/w/…
eenagy
4
Mungkin tidak berfungsi seperti yang Anda harapkan meskipun en.wiktionary.org/wiki/Category:English_misspellings en.wiktionary.org/wiki/amatuer
endolith
Gunakan https://en.wiktionary.org/w/?curid=[page_id]&printable=yes:, untuk mengalihkan ke halaman XHTML menggunakan pageid.
mie.ppa
2
Bagaimana cara memfilter dalam API ini hanya untuk kata-kata bahasa Inggris?
Nadav B
28

Ada beberapa peringatan jika hanya memeriksa bahwa Wiktionary memiliki halaman dengan nama yang Anda cari:

Peringatan # 1 : Semua Wiktionary termasuk Wiktionary Inggris sebenarnya memiliki tujuan untuk memasukkan setiap kata dalam setiap bahasa, jadi jika Anda hanya menggunakan panggilan API di atas, Anda akan tahu bahwa kata yang Anda tanyakan adalah sebuah kata dalam setidaknya satu bahasa, tetapi belum tentu bahasa Inggris: http://en.wiktionary.org/w/api.php?action=query&titles=dicare

Peringatan # 2 : Mungkin ada pengalihan dari satu kata ke kata lain. Mungkin dari ejaan alternatif, tapi mungkin dari beberapa jenis kesalahan. Panggilan API di atas tidak akan membedakan antara pengalihan dan artikel: http://en.wiktionary.org/w/api.php?action=query&titles=profilemetry

Peringatan # 3 : Beberapa Wiktionary termasuk Wiktionary bahasa Inggris menyertakan "kesalahan eja yang umum": http://en.wiktionary.org/w/api.php?action=query&titles=fourty

Peringatan # 4 : Beberapa Wiktionary mengizinkan entri rintisan yang memiliki sedikit atau tidak ada informasi tentang istilah tersebut. Ini dulunya umum di beberapa Wiktionary tetapi tidak di Wiktionary bahasa Inggris. Tetapi tampaknya sekarang telah menyebar juga ke Wiktionary bahasa Inggris: https://en.wiktionary.org/wiki/%E6%99%B6%E7%90%83 (tautan permanen untuk saat rintisan diisi sehingga Anda masih dapat melihat seperti apa bentuk rintisan: https://en.wiktionary.org/w/index.php?title=%E6%99%B6%E7%90%83&oldid=39757161 )

Jika ini tidak termasuk dalam apa yang Anda inginkan, Anda harus memuat dan mengurai teks wiki itu sendiri, yang bukan merupakan tugas yang sepele.

hippietrail
sumber
2
Yang benar-benar ingin saya lakukan adalah membuang seluruh data di salah satu situs Wikitionary non-Inggris, dan kemudian mengubah isinya menjadi sesuatu yang dapat saya gunakan secara lokal. Kedengarannya konyol sekarang, tapi saya berharap saya bisa meminta daftar semua kata, dan kemudian menurunkan definisi / terjemahannya satu per satu sesuai kebutuhan.
Armentage
1
Perbaikan untuk Peringatan # 2 sederhana: tambahkan &prop=infoke kueri dan periksa respons untuk redirectatribut.
svick
@svick: Ya, memang benar # 2 lebih mudah untuk dielakkan saat menggunakan API tetapi peringatan dasar ini juga mencakup mencoba mengurai file dump data Wiktionary , meskipun pertanyaan ini tidak menanyakan tentang pendekatan itu.
hippietrail
17

Anda dapat mengunduh tumpukan data Wikitionary . Ada lebih banyak informasi di FAQ . Untuk tujuan Anda, definisi dump mungkin merupakan pilihan yang lebih baik daripada dump xml.

kybernetikos
sumber
2
File dump tersebut sangat besar, dan tidak jelas mana yang harus diunduh (semuanya?). Mungkin bukan yang dicari kebanyakan orang, mereka hanya ingin secara terprogram mencari beberapa kata.
Cerin
1
Saya menjelaskan file mana yang akan diunduh - yaitu definisi dump (direktori dari tautan saya hanyalah versi yang berbeda dari file yang sama), dan ya, jika Anda secara terprogram ingin mencari kata-kata ini sangat ideal. Jika Anda dapat menjamin bahwa program hanya akan dijalankan secara online, ada pilihan lain, tetapi saya menjawab bagian dari pertanyaan awal ini: "Atau, adakah cara saya dapat menarik data kamus yang mendukung Wiktionary?"
kybernetikos
18
Tautan dump definisi tidak lagi tersedia.
cinta hidup
8

Untuk membuatnya sangat sederhana, ekstrak kata-kata dari dump seperti itu:

bzcat pages-articles.xml.bz2 | grep '<title>[^[:space:][:punct:]]*</title>' | sed 's:.*<title>\(.*\)</title>.*:\1:' > words
benroth
sumber
bagaimana cara mendapatkan salinan halaman-artikel.xml.bz2?
Armentage
Itu hanya nama umum yang saya gunakan untuk menggambarkan kesedihan formulir LANGwiktionary-DATE-pages-articles.xml.bz2 . Buka link , lalu klik LANGwiktionary(LANG mis. 'En', 'de' ...).
benroth
5

Jika Anda menggunakan Python, Anda dapat menggunakan WiktionaryParser oleh Suyash Behera.

Anda dapat menginstalnya dengan

sudo pip install wiktionaryparser

Contoh penggunaan:

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

Seperti disebutkan sebelumnya, masalah dengan pendekatan ini adalah Wiktionary menyediakan informasi tentang semua kata dari semua bahasa . Jadi pendekatan untuk memeriksa apakah suatu halaman ada menggunakan API Wikipedia tidak akan berfungsi karena ada banyak halaman untuk kata-kata non-Inggris. Untuk mengatasinya, Anda perlu mengurai setiap halaman untuk mengetahui apakah ada bagian yang menjelaskan kata bahasa Inggris . Parsing wikitext bukanlah tugas yang sepele, meskipun dalam kasus Anda tidak seburuk itu. Untuk mencakup hampir semua kasus, Anda hanya perlu memeriksa apakah teks wiki berisi Englishjudul. Bergantung pada bahasa pemrograman yang Anda gunakan, Anda dapat menemukan beberapa alat untuk membuat AST dari teks wiki. Ini akan mencakup sebagian besar kasus, tetapi tidak semuanya karena Wiktionary menyertakan beberapa kesalahan eja yang umum.

Sebagai alternatif, Anda dapat mencoba menggunakan Robot Lingua atau yang serupa. Lingua Robot mengurai konten Wiktionary dan menyediakannya sebagai REST API. Respons yang tidak kosong berarti kata tersebut ada. Harap dicatat bahwa, berbeda dengan Wiktionary, API itu sendiri tidak menyertakan salah eja (setidaknya pada saat menulis jawaban ini). Perlu diketahui juga bahwa Wiktionary tidak hanya berisi kata-kata, tetapi ekspresi multi-kata.

Roman Kishchenko
sumber
0

Berikut ini permulaan untuk mengurai data etimologi dan pengucapan:

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

Pembaruan : Berikut adalah intinya dengan lebih disempurnakan.

Lance Pollard
sumber
terima kasih, mencoba menjalankannya di dalam konsol devtools browser. apa langs?
knb
1
diperbarui dengan inti, langsadalah beberapa ribu baris, terlalu besar untuk SO.
Lance Pollard