Vikisözlük kelime içeriği nasıl alınır?


90

Vikisözlük API'si bir kelimenin var olup olmadığını belirlemek için nasıl kullanılabilir?


Belgeleri okuyan herkes, API'nin "Vikisözlük kelime içeriğini almak" için yeterince işlevselliğe yakın olmadığını görecektir. Tahmin ediyorum ki, yolun yaklaşık% 1'ini alırsınız. Ham wiki sözdizimini veya ayrıştırılmış HTML'yi alabilir ve buradan her şeyi kendiniz yapmanız gerekir. Sadece İngilizce Vikisözlük'te çalışan çok yeni bir deneysel API olabileceğini söylemiştim.
hippietrail

3
Burada bireysel JSON dosyalarındaki tüm Vikisözlük makaleleri alın: github.com/dan1wang/jsonbook-builder
Daniel

Yanıtlar:


69

Vikisözlük API bir kelime var olsun veya olmasın sorguya kullanılabilir.

Var olan ve olmayan sayfalara örnekler:

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

İlk bağlantı, ayrıştırılması daha kolay olabilecek diğer biçim türleri hakkında örnekler sağlar.

Kelimenin verilerini küçük bir XHTML formatında almak için (var olandan daha fazlası gerekli olmalıdır) sayfanın yazdırılabilir versiyonunu isteyin:

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

Bunlar daha sonra herhangi bir standart XML ayrıştırıcıyla ayrıştırılabilir.


4
Teşekkürler; API'nin kendisi umduğum şey değil ama sağladığınız bağlantı aradığım şeydi.
Armentage

1
Şimdi, xml çıktısı dışındaki ek biçim parametresini şu şekilde kabul ediyor: en.wiktionary.org/w/…
eenagy


2
Bu API'de yalnızca İngilizce kelimeler için nasıl filtreleme yapılır?
Nadav B

1
Bu örnekle HTTPS kullanın. Mevcut http sürümü sonuç
vermiyor

28

Sadece Vikisözlük'ün aradığınız ada sahip bir sayfaya sahip olup olmadığını kontrol ederken birkaç uyarı var:

Uyarı 1 : İngilizce Vikisözlük de dahil olmak üzere tüm Vikisözlükler aslında her kelimeyi her dilde dahil etme amacına sahiptir, bu nedenle sadece yukarıdaki API çağrısını kullanırsanız, sorduğunuz kelimenin en az bir dilde bir kelime olduğunu bileceksiniz, ancak mutlaka İngilizce değil: http://en.wiktionary.org/w/api.php?action=query&titles=dicare

Uyarı # 2 : Belki bir kelimeden diğerine bir yönlendirme vardır. Alternatif bir yazımdan olabilir, ancak bir tür hatadan kaynaklanıyor olabilir. Yukarıdaki API çağrısı, yeniden yönlendirme ile makale arasında ayrım yapmayacaktır: http://en.wiktionary.org/w/api.php?action=query&titles=profilemetry

Uyarı 3 : İngilizce Vikisözlük de dahil olmak üzere bazı Vikisözlükler "yaygın yazım hataları" içerir: http://en.wiktionary.org/w/api.php?action=query&titles=fourty

Uyarı 4 : Bazı Vikisözlükler, terim hakkında çok az bilgi içeren veya hiç bilgi içermeyen saplama girişlerine izin verir. Bu, birkaç Vikisözlük'te yaygındı, ancak İngilizce Vikisözlük'te değil. Ama şimdi İngilizce Vikisözlük'e de yayılmış gibi görünüyor: https://en.wiktionary.org/wiki/%E6%99%B6%E7%90%83 (hala görebilmeniz için koçan doldurulduğunda kalıcı bağlantı bir saplama nasıl görünür: https://en.wiktionary.org/w/index.php?title=%E6%99%B6%E7%90%83&oldid=39757161 )

Bunlar istediğiniz şeye dahil değilse, wikitext'in kendisini yüklemeniz ve ayrıştırmanız gerekir ki bu önemsiz bir görev değildir.


2
Gerçekten yapmak istediğim şey, İngilizce olmayan Wikitionary sitelerindeki verilerin tam bir dökümünü almak ve ardından içeriği yerel olarak kullanabileceğim bir şeye dönüştürmekti. Şimdi aptalca görünüyor, ancak tüm kelimelerin listesini isteyebileceğimi umuyordum ve daha sonra gerektiğinde bunların ifadelerini / çevirilerini teker teker indirebilirim.
Armentage

1
Uyarı 2'nin düzeltmesi basittir: &prop=infosorguya ekleyin ve redirectöznitelik için yanıtı kontrol edin .
svick

@svick: Evet, doğru # 2'nin API'yi kullanırken atlatılması daha kolay ancak bu temel uyarılar ayrıca Vikisözlük veri dökümü dosyalarını ayrıştırmaya çalışmayı da kapsıyor , bu soru bu yaklaşım hakkında soru sormasa da .
hippietrail

17

Wikitionary verilerinin bir dökümünü indirebilirsiniz . SSS bölümünde daha fazla bilgi var . Sizin amaçlarınız için, tanım dökümü xml dökümünden muhtemelen daha iyi bir seçimdir.


2
Bu döküm dosyaları çok büyük ve hangilerinin indirileceği belli değil (tümü?). Muhtemelen çoğu insanın aradığı şey değil, sadece bir avuç kelimeyi programlı olarak aramak istiyorlar.
Cerin

1
Hangi dosyanın indirileceğini açıklarım - yani tanımların dökümü (bağlantımdaki dizin aynı dosyanın sadece farklı sürümleridir) ve evet, eğer programlı olarak kelimeleri aramak istiyorsanız bu idealdir. Programın yalnızca çevrimiçi olarak yürütüleceğini garanti edebiliyorsanız, başka seçenekler de var, ancak yine de asıl sorunun bu bölümünü yanıtlıyorum: "Alternatif olarak, bir Vikisözlük'ü destekleyen sözlük verilerini indirebilmemin bir yolu var mı?"
kybernetikos

18
Tanım dökümü bağlantısı artık kullanılamıyor.
live-love

8

Gerçekten basit tutmak için, kelimeleri çöplükten şu şekilde çıkarın:

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

pages-article.xml.bz2'nin bir kopyasını nasıl edinebilirim?
Armentage

Bu sadece formun dökümlerini tanımlamak için kullandığım genel bir isim LANGwiktionary-DATE-pages-articles.xml.bz2. Bağlantıya gidin , ardından LANGwiktionary(DİL örn. 'En', 'de' ...) öğesine tıklayın .
benroth

5

Python kullanıyorsanız, WiktionaryParser by Suyash Behera'yı kullanabilirsiniz .

Yükleyebilirsiniz

sudo pip install wiktionaryparser

Örnek kullanım:

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


1

Daha önce de belirtildiği gibi, bu yaklaşımla ilgili sorun, Vikisözlük'ün tüm dillerin tüm kelimeleri hakkında bilgi sağlamasıdır . Bu yüzden Wikipedia API kullanarak bir sayfanın var olup olmadığını kontrol etme yaklaşımı işe yaramayacak çünkü İngilizce olmayan kelimeler için çok sayıda sayfa var. Bunun üstesinden gelmek için, İngilizce kelimeyi açıklayan bir bölüm olup olmadığını anlamak için her sayfayı ayrıştırmanız gerekir . Wikitext'i ayrıştırmak önemsiz bir iş değildir, ancak sizin durumunuzda o kadar da kötü değil. Neredeyse tüm durumları kapsamak için, sadece wikitext'in Englishbaşlık içerip içermediğini kontrol etmeniz yeterlidir . Kullandığınız programlama diline bağlı olarak, wikitext'den AST oluşturmak için bazı araçlar bulabilirsiniz . Bu, vakaların çoğunu kapsayacak, ancak hepsini değil çünkü Vikisözlük bazı yaygın yazım hatalarını içeriyor.

Alternatif olarak, Lingua Robot veya benzeri bir şey kullanmayı deneyebilirsiniz . Lingua Robot, Vikisözlük içeriğini ayrıştırır ve bir REST API olarak sağlar. Boş olmayan yanıt, kelimenin var olduğu anlamına gelir. Lütfen, Vikisözlük'ün aksine, API'nin kendisinin herhangi bir yazım hatası içermediğini unutmayın (en azından bu cevabı yazarken). Lütfen Vikisözlük'ün yalnızca kelimeleri değil, aynı zamanda çok kelimeli ifadeleri de içerdiğini unutmayın.



0

İşte etimoloji ve telaffuz verilerini çözümlemeye bir başlangıç:

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

Güncelleme : İşte daha ayrıntılı bir şekilde özetlenen bir özet.


teşekkürler, tarayıcı geliştirici konsolunda çalıştırmayı denedi. nedir langs?
2019

1
özetle güncellenen, langsbirkaç bin satır, SO için çok büyük.
Lance Pollard
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.