위키 셔 너리의 API를 사용하여 단어의 존재 여부를 확인하는 방법은 무엇입니까?
위키 셔 너리의 API를 사용하여 단어의 존재 여부를 확인하는 방법은 무엇입니까?
답변:
위키 낱말 사전 API는 단어가 존재하는지 여부를 질의하는 데 사용할 수 있습니다.
기존 및 존재하지 않는 페이지의 예 :
http://en.wiktionary.org/w/api.php?action=query&titles=test
http://en.wiktionary.org/w/api.php?action=query&titles=testx
첫 번째 링크는 구문 분석이 더 쉬운 다른 형식의 예를 제공합니다.
작은 XHTML 형식 (필요한 것 이상이어야 함)으로 단어의 데이터를 검색하려면 페이지의 인쇄 가능한 버전을 요청하십시오.
http://en.wiktionary.org/w/index.php?title=test&printable=yes
http://en.wiktionary.org/w/index.php?title=testx&printable=yes
그런 다음 표준 XML 파서로 구문 분석 할 수 있습니다.
https://en.wiktionary.org/w/?curid=[page_id]&printable=yes
,를 사용 하여 XHTML 페이지로 리디렉션합니다 pageid
.
위키 셔 너리에 찾고있는 이름의 페이지가 있는지 확인하는 데 몇 가지주의 사항이 있습니다.
주의 사항 # 1 : English Wiktionary를 포함한 모든 Wiktionary는 실제로 모든 언어의 모든 단어를 포함하는 목표를 가지고 있으므로 위의 API 호출을 사용하면 요청하는 단어가 적어도 하나의 언어로 된 단어라는 것을 알 수 있습니다. 반드시 영어는 아님 : http://en.wiktionary.org/w/api.php?action=query&titles=dicare
주의 사항 # 2 : 한 단어에서 다른 단어로 리디렉션이있을 수 있습니다. 대체 철자 일 수도 있지만 어떤 종류의 오류 일 수도 있습니다. 위의 API 호출은 리디렉션과 기사를 구분하지 않습니다. http://en.wiktionary.org/w/api.php?action=query&titles=profilemetry
주의 사항 # 3 : 영어 위키 낱말 사전을 포함한 일부 위키 낱말 사전에는 "일반적인 맞춤법 오류"가 포함됩니다. http://en.wiktionary.org/w/api.php?action=query&titles=fourty
주의 사항 # 4 : 일부 위키 낱말 사전은 용어에 대한 정보가 거의 또는 전혀없는 스텁 항목을 허용합니다. 이것은 영어 위키 낱말 사전이 아닌 여러 위키 낱말 사전에서 흔했습니다. 하지만 이제는 영어 위키 낱말 사전에도 퍼진 것 같습니다 : https://en.wiktionary.org/wiki/%E6%99%B6%E7%90%83 (스텁이 채워 졌을 때 계속 볼 수 있도록 영구 링크 스텁의 모양 : https://en.wiktionary.org/w/index.php?title=%E6%99%B6%E7%90%83&oldid=39757161 )
이것이 원하는 내용에 포함되어 있지 않으면 위키 텍스트 자체를로드하고 구문 분석해야하며 이는 간단한 작업이 아닙니다.
&prop=info
쿼리에 추가 하고 redirect
속성에 대한 응답을 확인 합니다.
Wikitionary 데이터 덤프를 다운로드 할 수 있습니다 . FAQ에 더 많은 정보가 있습니다 . 사용자의 목적을 위해 정의 덤프 가 xml 덤프보다 더 나은 선택 일 것입니다.
정말 간단하게 유지하려면 다음과 같이 덤프에서 단어를 추출하십시오.
bzcat pages-articles.xml.bz2 | grep '<title>[^[:space:][:punct:]]*</title>' | sed 's:.*<title>\(.*\)</title>.*:\1:' > words
Python을 사용 하는 경우 Suyash Behera의 WiktionaryParser 를 사용할 수 있습니다 .
다음 방법으로 설치할 수 있습니다.
sudo pip install wiktionaryparser
사용 예 :
>>> from wiktionaryparser import WiktionaryParser
>>> parser = WiktionaryParser()
>>> word = parser.fetch('test')
>>> another_word = parser.fetch('test', 'french')
>>> parser.set_default_language('french')
JWKTL을 사용해 볼 수도 있습니다. 나는 그것에 대해 방금 알게되었습니다.)
http://en.wikipedia.org/wiki/Ubiquitous_Knowledge_Processing_Lab#Wiktionary_API
앞서 언급했듯이이 접근 방식의 문제점은 Wiktionary가 모든 언어의 모든 단어에 대한 정보를 제공 한다는 것입니다 . 따라서 Wikipedia API를 사용하여 페이지가 있는지 확인하는 방법은 영어가 아닌 단어에 대한 페이지가 많기 때문에 작동하지 않습니다. 이를 극복하려면 각 페이지를 파싱하여 영어 단어를 설명하는 섹션이 있는지 알아 내야합니다 . 위키 텍스트 구문 분석은 사소한 작업이 아니지만 귀하의 경우에는 그렇게 나쁘지 않습니다. 거의 모든 경우를 다루려면 위키 텍스트에 English
제목이 포함되어 있는지 확인하면됩니다 . 사용하는 프로그래밍 언어에 따라 위키 텍스트에서 AST 를 빌드하는 몇 가지 도구를 찾을 수 있습니다 . 이것은 대부분의 경우를 다루지 만 Wiktionary에는 몇 가지 일반적인 맞춤법 오류가 포함되어 있기 때문에 전부는 아닙니다.
대안으로 Lingua Robot 또는 이와 유사한 것을 사용해 볼 수 있습니다. Lingua Robot은 위키 낱말 사전 콘텐츠를 구문 분석하고이를 REST API로 제공합니다. 비어 있지 않은 응답은 단어가 존재 함을 의미합니다. Wiktionary와 달리 API 자체에는 맞춤법 오류가 포함되어 있지 않습니다 (적어도이 답변을 작성하는 순간). 또한 위키 낱말 사전에는 단어뿐만 아니라 여러 단어로 된 표현도 포함되어 있습니다.
Revisions API를 사용할 수 있습니다.
또는 Parse API :
https://en.wiktionary.org/w/api.php?action=parse&page=test&prop=wikitext&formatversion=2
문서 에 더 많은 예제가 제공됩니다 .
어원 및 발음 데이터 구문 분석을 시작합니다.
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}}
}
업데이트 : 여기 에 더 구체화 된 요점이 있습니다.
langs
입니까?
langs
수천 줄이 너무 커서 너무 큽니다.