Jak odzyskać zawartość słów z Wikisłownika?

90

W jaki sposób można wykorzystać API Wikisłownika do określenia, czy słowo istnieje, czy nie?

Armentage
źródło
Każdy, kto przeczytał dokumentację, zauważy, że API nie zawiera wystarczającej funkcjonalności, aby „pobrać zawartość słów z Wikisłownika”. Szacuję, że zajmie ci to mniej więcej 1% drogi. Możesz pobrać surową składnię wiki lub sparsowany HTML, a stamtąd musisz zrobić wszystko samodzielnie. Powiedziawszy, że może istnieć bardzo nowe eksperymentalne API, które działa tylko w angielskiej wersji Wikisłownika.
hippietrail
3
Pobierz wszystkie artykuły Wikisłownika w poszczególnych plikach JSON tutaj: github.com/dan1wang/jsonbook-builder
daniel

Odpowiedzi:

69

Wikisłownik API może być użyty do zapytania, czy słowo istnieje.

Przykłady istniejących i nieistniejących stron:

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

Pierwsze łącze zawiera przykłady innych typów formatów, które mogą być łatwiejsze do przeanalizowania.

Aby pobrać dane słowa w małym formacie XHTML (powinno być wymagane więcej niż istnienie), poproś o wersję strony do druku:

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

Można je następnie przeanalizować za pomocą dowolnego standardowego parsera XML.

Michał Mrozek
źródło
4
Dzięki; Samo API nie jest tym, na co liczyłem, ale podany przez ciebie link jest tym, czego szukałem.
Armentage
1
Teraz akceptuje dodatkowy parametr formatu dla danych wyjściowych innych niż XML, na przykład: en.wiktionary.org/w/ ...
eenagy
4
Może nie działać zgodnie z oczekiwaniami, chociaż en.wiktionary.org/wiki/Category:English_misspellings en.wiktionary.org/wiki/amatuer
endolith
Użyj https://en.wiktionary.org/w/?curid=[page_id]&printable=yes:, aby przekierować na stronę XHTML przy użyciu pageid.
mie.ppa
2
Jak filtrować w tym API tylko angielskie słowa?
Nadav B
28

Jest kilka zastrzeżeń, jeśli chodzi o sprawdzenie, czy Wikisłownik ma stronę o nazwie, której szukasz:

Zastrzeżenie # 1 : Wszystkie Wikisłowniki, w tym angielski, mają na celu uwzględnienie każdego słowa w każdym języku, więc jeśli po prostu użyjesz powyższego wywołania API, będziesz wiedział, że słowo, o które pytasz, jest słowem w co najmniej jednym języku, ale niekoniecznie angielski: http://en.wiktionary.org/w/api.php?action=query&titles=dicare

Zastrzeżenie nr 2 : Być może istnieje przekierowanie z jednego słowa do innego. Może pochodzić z alternatywnej pisowni, ale może wynikać z jakiegoś błędu. Powyższe wywołanie API nie rozróżnia przekierowania od artykułu: http://en.wiktionary.org/w/api.php?action=query&titles=profilemetry

Zastrzeżenie # 3 : Niektóre Wikisłowniki, w tym angielski, zawierają „typowe błędy ortograficzne”: http://en.wiktionary.org/w/api.php?action=query&titles=fourty

Ostrzeżenie # 4 : Niektóre Wikisłowniki dopuszczają wpisy pośredniczące, które zawierają niewiele informacji lub nie zawierają ich wcale. To było powszechne w kilku Wikisłownikach, ale nie w angielskim Wikisłowniku. Ale wydaje się, że teraz rozprzestrzenił się również na angielskie Wikisłownik: https://en.wiktionary.org/wiki/%E6%99%B6%E7%90%83 (link stały, gdy kod jest wypełniony, więc nadal możesz zobaczyć jak wygląda stub: https://en.wiktionary.org/w/index.php?title=%E6%99%B6%E7%90%83&oldid=39757161 )

Jeśli nie są one zawarte w tym, czego chcesz, będziesz musiał załadować i przeanalizować sam wikitekst, co nie jest łatwym zadaniem.

hippietrail
źródło
2
Naprawdę chciałem zrobić pełny zrzut danych z jednej z nieanglojęzycznych witryn Wikitionary, a następnie przekształcić zawartość w coś, czego mógłbym używać lokalnie. Wydaje się to teraz głupie, ale miałem nadzieję, że mógłbym poprosić o listę wszystkich słów, a następnie w razie potrzeby po kolei usunąć ich definicje / tłumaczenia.
Armentage
1
Poprawka do zastrzeżenia nr 2 jest prosta: dodaj &prop=infodo zapytania i sprawdź odpowiedź pod kątem redirectatrybutu.
Svick
@svick: Tak, to prawda # 2 jest łatwiejsze do obejścia podczas korzystania z API, ale te podstawowe zastrzeżenia obejmują również próbę przeanalizowania plików zrzutów danych Wiktionary , nawet jeśli to pytanie nie dotyczy tego podejścia.
hippietrail
17

Możesz pobrać zrzut danych Wikitionary . Więcej informacji znajduje się w FAQ . Dla twoich celów zrzut definicji jest prawdopodobnie lepszym wyborem niż zrzut xml.

kybernetikos
źródło
2
Te pliki zrzutu są ogromne i nie jest jasne, które z nich pobrać (wszystkie?). Prawdopodobnie nie to, czego szuka większość ludzi, chcą tylko programowo wyszukać garść słów.
Cerin
1
Wyjaśniam, który plik pobrać - tj. Zrzut definicji (katalog z mojego linku to tylko różne wersje tego samego pliku) i tak, jeśli chcesz programowo wyszukiwać słowa, jest to idealne. Jeśli możesz zagwarantować, że program zostanie uruchomiony tylko w trybie online, istnieją inne opcje, ale mimo to odpowiadam na tę część pierwotnego pytania: „Alternatywnie, czy jest jakiś sposób, abym mógł ściągnąć dane ze słownika, które wspierają Wikisłownik?”
kybernetikos
18
Link do zrzutu definicji nie jest już dostępny.
miłość na żywo
8

Aby było to naprawdę proste, wyodrębnij słowa ze zrzutu w następujący sposób:

bzcat pages-articles.xml.bz2 | grep '<title>[^[:space:][:punct:]]*</title>' | sed 's:.*<title>\(.*\)</title>.*:\1:' > words
Benroth
źródło
jak uzyskać kopię pages-article.xml.bz2?
Armentage
To tylko ogólna nazwa, której użyłem do opisania zrzutów formularza LANGwiktionary-DATE-pages-articles.xml.bz2. Przejdź do łącza , a następnie kliknij LANGwiktionary(LANG, np. „En”, „de” ...).
benroth
5

Jeśli używasz Pythona, możesz użyć WiktionaryParser autorstwa Suyash Behera.

Możesz go zainstalować przez

sudo pip install wiktionaryparser

Przykładowe użycie:

>>> from wiktionaryparser import WiktionaryParser
>>> parser = WiktionaryParser()
>>> word = parser.fetch('test')
>>> another_word = parser.fetch('test', 'french')
>>> parser.set_default_language('french')
osolmaz
źródło
1

Jak wspomniano wcześniej, problem z tym podejściem polega na tym, że Wikisłownik dostarcza informacji o wszystkich słowach we wszystkich językach . Dlatego metoda sprawdzania, czy strona istnieje przy użyciu interfejsu API Wikipedii, nie zadziała, ponieważ istnieje wiele stron ze słowami innymi niż angielskie. Aby temu zaradzić, musisz przeanalizować każdą stronę, aby dowiedzieć się, czy istnieje sekcja opisująca angielskie słowo . Przetwarzanie wikitekstu nie jest prostym zadaniem, chociaż w twoim przypadku nie jest takie złe. Aby omówić prawie wszystkie przypadki, wystarczy sprawdzić, czy wikitekst zawiera Englishnagłówek. W zależności od używanego języka programowania, możesz znaleźć narzędzia do budowania AST z wikitekstu. Obejmie to większość przypadków, ale nie wszystkie, ponieważ Wikisłownik zawiera kilka typowych błędów ortograficznych.

Alternatywnie możesz spróbować użyć Lingua Robot lub czegoś podobnego. Lingua Robot analizuje zawartość Wikisłowników i dostarcza ją jako REST API. Niepusta odpowiedź oznacza, że ​​słowo istnieje. Zwróć uwagę, że w przeciwieństwie do Wikisłownika, samo API nie zawiera błędów ortograficznych (przynajmniej w momencie pisania tej odpowiedzi). Proszę również zauważyć, że Wikisłownik zawiera nie tylko słowa, ale także wyrażenia wielowyrazowe.

Roman Kishchenko
źródło
0

Oto początek analizy danych dotyczących etymologii i wymowy:

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

Aktualizacja : Oto streszczenie, które jest bardziej rozwinięte.

Lance Pollard
źródło
dzięki, próbowałem uruchomić go w konsoli devtools przeglądarki. co jest langs?
knb
1
zaktualizowany w skrócie, langsjest kilka tysięcy wierszy, za duży dla SO.
Lance Pollard