Làm thế nào để lấy nội dung từ Wiktionary?


89

API của Wiktionary có thể được sử dụng như thế nào để xác định xem một từ có tồn tại hay không?


Bất kỳ ai đã đọc tài liệu sẽ thấy rằng API không có đủ chức năng để "truy xuất nội dung từ Wiktionary". Tôi ước tính nó giúp bạn đi được khoảng 1% chặng đường. Bạn có thể truy xuất cú pháp wiki thô hoặc HTML được phân tích cú pháp và từ đó bạn phải tự làm mọi thứ. Đã nói rằng có thể có một API thử nghiệm rất mới chỉ hoạt động trên Wiktionary tiếng Anh.
hippietrail

3
Nhận tất cả các bài viết Wiktionary tiếng Việt trong các tập tin JSON cá nhân ở đây: github.com/dan1wang/jsonbook-builder
daniel

Câu trả lời:


69

Các Wiktionary tiếng Việt API có thể được sử dụng để truy vấn có hay không một từ tồn tại.

Ví dụ cho các trang hiện có và không tồn tại:

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

Liên kết đầu tiên cung cấp các ví dụ về các loại định dạng khác có thể dễ dàng hơn để phân tích cú pháp.

Để truy xuất dữ liệu của từ ở định dạng XHTML nhỏ (không cần thiết phải tồn tại), hãy yêu cầu phiên bản có thể in của trang:

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

Sau đó, chúng có thể được phân tích cú pháp bằng bất kỳ trình phân tích cú pháp XML chuẩn nào.


4
Cảm ơn; bản thân API không phải là thứ tôi mong đợi nhưng liên kết bạn cung cấp mới là thứ tôi đang tìm kiếm.
Armentage

Bây giờ nó chấp nhận tham số bổ sung định dạng cho khác hơn là đầu ra xml như vậy: en.wiktionary.org/w/...
eenagy

4
Có thể không hoạt động như bạn mong đợi mặc dù en.wiktionary.org/wiki/Category:English_misspellings en.wiktionary.org/wiki/amatuer
endolith

Sử dụng https://en.wiktionary.org/w/?curid=[page_id]&printable=yes:, để chuyển hướng đến trang XHTML bằng cách sử dụng pageid.
mie.ppa

2
Làm cách nào để lọc trong API này chỉ các từ tiếng Anh?
Nadav B

28

Có một số lưu ý khi kiểm tra xem Wiktionary có trang với tên bạn đang tìm kiếm hay không:

Lưu ý # 1 : Tất cả các từ điển Wiktionaries bao gồm cả Wiktionary tiếng Anh thực sự có mục tiêu bao gồm mọi từ trong mọi ngôn ngữ, vì vậy nếu bạn chỉ sử dụng lệnh gọi API ở trên, bạn sẽ biết rằng từ bạn đang hỏi là một từ trong ít nhất một ngôn ngữ, nhưng không nhất thiết phải là tiếng Anh: http://en.wiktionary.org/w/api.php?action=query&titles=dicare

Lưu ý # 2 : Có lẽ một chuyển hướng tồn tại từ một từ này sang một từ khác. Nó có thể là từ một cách viết khác, nhưng nó có thể là một lỗi nào đó. Lệnh gọi API ở trên sẽ không phân biệt giữa chuyển hướng và một bài báo: http://en.wiktionary.org/w/api.php?action=query&titles=profilemetry

Lưu ý # 3 : Một số từ điển Wikti từ bao gồm cả Wiktionary tiếng Anh bao gồm "lỗi chính tả phổ biến": http://en.wiktionary.org/w/api.php?action=query&titles=fourty

Lưu ý # 4 : Một số Wiktionaries cho phép các mục nhập sơ khai có ít hoặc không có thông tin về thuật ngữ. Điều này từng phổ biến trên một số Wiktionaries nhưng không phải là Wiktionary tiếng Anh. Nhưng dường như bây giờ nó cũng đã lan truyền sang Wiktionary tiếng Anh: https://vi.wiktionary.org/wiki/%E6%99%B6%E7%90%83 (liên kết cố định khi phần mở đầu được lấp đầy nên bạn vẫn có thể xem sơ khai trông như thế nào: https://vi.wiktionary.org/w/index.php?title=%E6%99%B6%E7%90%83&oldid=39757161 )

Nếu những thứ này không được bao gồm trong những gì bạn muốn, bạn sẽ phải tải và phân tích cú pháp của chính wikitext, đây không phải là một nhiệm vụ tầm thường.


2
Những gì tôi thực sự muốn làm là lấy toàn bộ dữ liệu trên một trong những trang web Wikitionary không phải tiếng Anh, và sau đó biến nội dung thành thứ mà tôi có thể sử dụng cục bộ. Bây giờ có vẻ ngớ ngẩn, nhưng tôi đã hy vọng rằng tôi có thể yêu cầu danh sách tất cả các từ, và sau đó kéo xuống các định nghĩa / bản dịch của chúng cùng một lúc nếu cần.
Armentage

1
Cách khắc phục đối với Caveat # 2 rất đơn giản: thêm &prop=infovào truy vấn và kiểm tra phản hồi cho redirectthuộc tính.
svick

@svick: Vâng, đúng là # 2 dễ vượt qua hơn khi sử dụng API nhưng những lưu ý cơ bản này cũng bao gồm việc cố gắng phân tích cú pháp các tệp kết xuất dữ liệu Wiktionary , mặc dù câu hỏi này không hỏi về cách tiếp cận đó.
hippietrail,

17

Bạn có thể tải xuống một kết xuất dữ liệu Wikiti Mobile . Có thêm thông tin trong Câu hỏi thường gặp . Đối với mục đích của bạn, kết xuất định nghĩa có lẽ là lựa chọn tốt hơn kết xuất xml.


2
Các tệp kết xuất đó rất lớn và không rõ nên tải xuống tệp nào (tất cả chúng?). Có lẽ không phải thứ mà hầu hết mọi người đang tìm kiếm mà họ chỉ muốn lập trình tra cứu một số từ.
Cerin

1
Tôi giải thích tệp nào cần tải xuống - tức là kết xuất định nghĩa (thư mục từ liên kết của tôi chỉ là các phiên bản khác nhau của cùng một tệp), và vâng, nếu bạn muốn tra cứu các từ theo chương trình thì đây là lý tưởng. Nếu bạn có thể đảm bảo chương trình sẽ chỉ được thực thi trực tuyến, vẫn có các tùy chọn khác, nhưng tuy nhiên, tôi đang trả lời phần này của câu hỏi ban đầu: "Ngoài ra, có cách nào tôi có thể lấy dữ liệu từ điển hỗ trợ Wiktionary không?"
kybernetikos

18
Liên kết kết xuất định nghĩa không còn nữa.
live-love

8

Để giữ cho nó thực sự đơn giản, hãy trích xuất các từ từ bãi chứa như thế:

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

làm cách nào để lấy một bản sao của trang-article.xml.bz2?
Armentage

Đó chỉ là một cái tên chung chung mà tôi dùng để mô tả các bãi chứa của biểu mẫu LANGwiktionary-DATE-pages-articles.xml.bz2. Đi đến liên kết , sau đó nhấp vào LANGwiktionary(LANG, ví dụ: 'en', 'de' ...).
benroth

4

Nếu bạn đang sử dụng Python, bạn có thể sử dụng WiktionaryParser của Suyash Behera.

Bạn có thể cài đặt nó bằng cách

sudo pip install wiktionaryparser

Ví dụ sử dụng:

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


1

Như đã đề cập trước đó, vấn đề với cách tiếp cận này là Wiktionary cung cấp thông tin về tất cả các từ của tất cả các ngôn ngữ . Vì vậy, cách tiếp cận để kiểm tra xem một trang có tồn tại hay không bằng cách sử dụng API Wikipedia sẽ không hoạt động vì có rất nhiều trang cho các từ không phải tiếng Anh. Để khắc phục điều này, bạn cần phải phân tích cú pháp từng trang để tìm xem có phần mô tả từ tiếng Anh hay không . Phân tích cú pháp wikitext không phải là một nhiệm vụ tầm thường, mặc dù trong trường hợp của bạn, nó không tệ lắm. Để bao gồm hầu hết các trường hợp, bạn chỉ cần kiểm tra xem wikitext có chứa Englishtiêu đề hay không. Tùy thuộc vào ngôn ngữ lập trình bạn sử dụng, bạn có thể tìm thấy một số công cụ để xây dựng AST từ wikitext. Điều này sẽ bao gồm hầu hết các trường hợp, nhưng không phải tất cả chúng vì Wiktionary bao gồm một số lỗi chính tả phổ biến.

Thay vào đó, bạn có thể thử sử dụng Lingua Robot hoặc thứ gì đó tương tự. Lingua Robot phân tích cú pháp nội dung Wiktionary và cung cấp nó dưới dạng API REST. Phản hồi không trống có nghĩa là từ đó tồn tại. Xin lưu ý rằng, trái ngược với Wiktionary, bản thân API không bao gồm bất kỳ lỗi chính tả nào (ít nhất là tại thời điểm viết câu trả lời này). Cũng xin lưu ý rằng Wiktionary không chỉ chứa các từ, mà còn chứa các biểu thức đa từ.


0

Đây là phần bắt đầu phân tích dữ liệu từ nguyên và phát âm:

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

Cập nhật : Đây là ý chính với nó chi tiết hơn.


cảm ơn, đã cố gắng chạy nó bên trong bảng điều khiển devtools của trình duyệt. là langsgì?
knb

1
được cập nhật với một ý chính, langslà vài nghìn dòng, quá lớn đối với SO.
Lance Pollard

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.