Como recuperar o conteúdo da palavra do Wikcionário?


89

Como a API do Wikcionário pode ser usada para determinar se uma palavra existe ou não?


Qualquer pessoa que leu a documentação verá que a API não contém nenhuma funcionalidade suficiente para "recuperar o conteúdo de palavras do Wikcionário". Eu estimaria que você alcançaria cerca de 1% do caminho. Você pode recuperar a sintaxe wiki bruta ou HTML analisado e, a partir daí, você deve fazer tudo sozinho. Dito isto, pode haver uma API experimental muito nova que funcione apenas no Wikcionário em inglês.
hippietrail

3
Obtenha todos os artigos do Wikcionário em arquivos JSON individuais aqui: github.com/dan1wang/jsonbook-builder
daniel

Respostas:


69

A API do Wikcionário pode ser usada para consultar se uma palavra existe ou não.

Exemplos para páginas existentes e não existentes:

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

O primeiro link fornece exemplos de outros tipos de formatos que podem ser mais fáceis de analisar.

Para recuperar os dados da palavra em um formato XHTML pequeno (caso seja necessário mais do que a existência), solicite a versão para impressão da página:

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

Eles podem então ser analisados ​​com qualquer analisador XML padrão.


4
Obrigado; a API em si não é o que eu esperava, mas o link que você forneceu é o que eu estava procurando.
Armentage

Agora, ele aceita parâmetros de formato adicionais para outros que não a saída xml, como: en.wiktionary.org/w/…
eenagy


Use https://en.wiktionary.org/w/?curid=[page_id]&printable=yes:, para redirecionar para a página XHTML usando pageid.
mie.ppa

2
Como filtrar nesta API apenas palavras em inglês?
Nadav B

28

Existem algumas ressalvas em apenas verificar se o Wikcionário tem uma página com o nome que você está procurando:

Advertência # 1 : Todos os Wikcionários, incluindo o Wikcionário em Inglês, na verdade têm o objetivo de incluir todas as palavras em todos os idiomas, então se você simplesmente usar a chamada de API acima, você saberá que a palavra que está perguntando é uma palavra em pelo menos um idioma, mas não necessariamente em inglês: http://en.wiktionary.org/w/api.php?action=query&titles=dicare

Advertência # 2 : talvez exista um redirecionamento de uma palavra para outra. Pode ser de uma grafia alternativa, mas pode ser de algum tipo de erro. A chamada API acima não diferencia entre um redirecionamento e um artigo: http://en.wiktionary.org/w/api.php?action=query&titles=profilemetry

Advertência nº 3 : Alguns Wikcionários, incluindo o Inglês, incluem "erros ortográficos comuns": http://en.wiktionary.org/w/api.php?action=query&titles=fourty

Advertência # 4 : Alguns Wikcionários permitem entradas de stub com pouca ou nenhuma informação sobre o termo. Isso costumava ser comum em vários Wikcionários, mas não no Wikcionário Inglês. Mas parece que agora se espalhou também para o Wikcionário em inglês: https://en.wiktionary.org/wiki/%E6%99%B6%E7%90%83 ( link permanente para quando o esboço estiver preenchido para que você ainda possa ver como é um esboço: https://en.wiktionary.org/w/index.php?title=%E6%99%B6%E7%90%83&oldid=39757161 )

Se eles não estiverem incluídos no que você deseja, você terá que carregar e analisar o próprio wikitexto, o que não é uma tarefa trivial.


2
O que eu realmente queria fazer era despejar todos os dados em um dos sites do Wikcionário que não sejam em inglês e, em seguida, transformar o conteúdo em algo que eu pudesse usar localmente. Parece bobo agora, mas eu esperava poder solicitar a lista de todas as palavras e, em seguida, puxar para baixo suas definições / traduções, uma de cada vez, conforme necessário.
Armentage

1
A correção para a advertência # 2 é simples: adicione &prop=infoà consulta e verifique a resposta para o redirectatributo.
svick

@svick: Sim, é verdade # 2 é mais fácil de contornar ao usar a API, mas essas advertências básicas também cobrem a tentativa de analisar os arquivos de despejo de dados do Wikcionário , embora esta pergunta não pergunte sobre essa abordagem.
hippietrail

17

Você pode baixar um dump de dados do Wikcionário . Há mais informações no FAQ . Para seus propósitos, o despejo de definições é provavelmente uma escolha melhor do que o despejo xml.


2
Esses arquivos de despejo são enormes e não está claro quais baixar (todos eles?). Provavelmente não é o que a maioria das pessoas está procurando, elas apenas desejam pesquisar programaticamente um punhado de palavras.
Cerin de

1
Eu explico qual arquivo baixar - ou seja, o despejo de definições (o diretório do meu link é apenas versões diferentes do mesmo arquivo) e, sim, se você deseja pesquisar palavras de maneira programática, isso é o ideal. Se você pode garantir que o programa será executado apenas online, existem outras opções, mas mesmo assim estou respondendo a esta parte da pergunta original: "Como alternativa, há alguma maneira de obter os dados do dicionário que sustentam um Wikcionário?"
kybernetikos

18
O link de despejo de definições não está mais disponível.
live-love

8

Para mantê-lo realmente simples, extraia as palavras do dump assim:

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

como faço para obter uma cópia de pages-articles.xml.bz2?
Armentage de

É apenas um nome genérico que usei para descrever os dumps do formulário LANGwiktionary-DATE-pages-articles.xml.bz2. Acesse o link e clique em LANGwiktionary(LANG, por exemplo, 'en', 'de' ...).
Benroth

4

Se estiver usando Python, você pode usar o WiktionaryParser de Suyash Behera.

Você pode instalá-lo por

sudo pip install wiktionaryparser

Exemplo de uso:

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


1

Como mencionado anteriormente, o problema com essa abordagem é que o Wikcionário fornece informações sobre todas as palavras de todas as línguas . Portanto, a abordagem para verificar se existe uma página usando a API da Wikipedia não funcionará porque há muitas páginas para palavras que não estão em inglês. Para superar isso, você precisa analisar cada página para descobrir se há uma seção que descreve a palavra em inglês . Analisar o wikitexto não é uma tarefa trivial, embora no seu caso não seja tão ruim. Para cobrir quase todos os casos, você precisa apenas verificar se o wikitexto contém Englishtítulo. Dependendo da linguagem de programação que você usa, você pode encontrar algumas ferramentas para construir AST a partir do wikitexto. Isso cobrirá a maioria dos casos, mas não todos, porque o Wikcionário inclui alguns erros de ortografia comuns.

Como alternativa, você pode tentar usar o Lingua Robot ou algo semelhante. Lingua Robot analisa o conteúdo do Wikcionário e o fornece como uma API REST. A resposta não vazia significa que a palavra existe. Observe que, ao contrário do Wikcionário, a API em si não inclui erros de ortografia (pelo menos no momento em que escrevo esta resposta). Observe também que o Wikcionário contém não apenas as palavras, mas também expressões com várias palavras.


0

Aqui está um começo para analisar dados de etimologia e pronúncia:

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

Atualização : Aqui está uma essência com mais detalhes.


obrigado, tentei executá-lo dentro do console do navegador devtools. o que é langs?
knb de

1
atualizado com a essência, langstem alguns milhares de linhas, grande demais para SO.
Lance Pollard

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.