WordNet의 구조와 동의어 검색
개시하다
일본어를 약하게 만드는 프로그램.에서 근의어를 얻는 용도가 있는데 조사 결과 WordNet이 필요하다는 것을 발견하여 WordNet에 대해 조사를 실시했다.
WordNet
일본어 워드넷은'일본어의 개념 사전에서 각 개념을'synset'단위로 총결산한 것으로, 이런 개념들은 의미에서 다른synset과 연결된다'(by 제공 사이트).나는 주요한 용도가 동의어 검색이라고 생각한다.다른 용도에 대해서는 조사가 필요하다.
WordNet의 구조
WordNet여기.은 몇 가지 종류가 있는 것 같습니다. 여기서'Japanese Wordnet and English WordNet in an sqlite3 데이터베이스'를 살펴보겠습니다.
WordNet에 포함된 테이블은 다음과 같은 11개입니다.
일본어 워드넷은'일본어의 개념 사전에서 각 개념을'synset'단위로 총결산한 것으로, 이런 개념들은 의미에서 다른synset과 연결된다'(by 제공 사이트).나는 주요한 용도가 동의어 검색이라고 생각한다.다른 용도에 대해서는 조사가 필요하다.
WordNet의 구조
WordNet여기.은 몇 가지 종류가 있는 것 같습니다. 여기서'Japanese Wordnet and English WordNet in an sqlite3 데이터베이스'를 살펴보겠습니다.
WordNet에 포함된 테이블은 다음과 같은 11개입니다.
※ 참고: http://compling.hss.ntu.edu.sg/wnja/pubs/2009-alr-wn.pdf
단어 wordi는 개념synsetj에 속하며sense라는 항목으로 그 인상을 연결한다.
그나저나'따뜻함'이라는 단어를 예로 들면synset과synset출력 def의 결과는 다음과 같습니다.
동의어를 얻다
다음은 WordNet을 사용하여 동의어 일람표를 얻는 프로그램과 프로그램에 대한 설명입니다.처리 프로세스는 다음과 같습니다.
def search_synonyms(lemma, lang="jpn"):
synonym_list = []
# 1. 単語のwordidを取得する
wobj = get_word(lemma)
if wobj:
word = wobj[0]
# 2. そのwordidが属するsynsetのsenseを取得する
senses = get_senses(word, lang)
for s in senses:
# 3. synsetに属する単語を類義語として取得する
synonyms = get_words_from_synset(s.synset, word, lang)
for syn in synonyms:
if syn.lemma not in synonym_list:
synonym_list.append(syn.lemma)
else:
print(f"'{lemma}'の類義語は見つかりませんでした。")
return synonym_list
● 워드넷에도 영어 단어가 포함돼 있는데 이번에는 일본어만을 대상으로 한다.●동의어는synset대로존재하지만synset의차이는고려하지 않고모두합쳐동의어일람표로얻는다.
이후 1∼3가지 처리에 대해 설명할 예정이다.
1. 대상 단어의 워드 가져오기
목표 단어word의 함수
get_word(lemma)
를 얻는 것은 다음과 같다.또한, 여기는word 단일체가 아니라 전체가Word 대상을 가져옵니다.(가독성, 확장성 관점에서 출발한다.)
Word = namedtuple('Word', 'wordid lang lemma pron pos')
def get_word(lemma):
cur = conn.execute("select * from word where lemma=?", (lemma,))
return [Word(*row) for row in cur]
2. 이 워드가 속한synset의sense 획득
word(id)에서sense를 얻은 함수
get_senses(word[, lang])
의 처리는 다음과 같다.Sense = namedtuple('Sense', 'synset wordid lang rank lexid freq src')
def get_senses(word, lang):
cur = conn.execute("select * from sense where wordid=? and lang=?", (word.wordid, lang))
return [Sense(*row) for row in cur]
언어의 제한lang="jpn"
은 다음 처리만 하면 될 것 같지만 일단 넣었다.3.synset에 속하는 단어를 동의어로 얻기
synset에서 이 단어에 속하는 함수
get_words_from_synset(synset, word[, lang])
를 가져오는 것은 다음과 같습니다.def get_words_from_synset(synset, word):
cur = conn.execute("select * from word where wordid in (select wordid from sense where synset=? and lang=?) and wordid<>?;", (synset, lang, word.wordid))
return [Word(*row) for row in cur]
마지막wordid<>{word.wordid}
은 대상의 단어 자체를 배제하기 위한 것이다.나는 SQL의 작법은 몇 가지 유형이 있다고 생각한다.※ 참조1: 일본어 워드넷의 앞머리를 가지고 놀다
※ 참조2: [자연 언어] Wordnet× 파이톤으로 동의어 추출
덤
1~3만 있으면 근의어를 얻을 수 있고, 각 근의어가 어떤 개념에서 비슷한지 보고 싶다면
synset_def
도 가능하다.SynsetDef = namedtuple('SynsetDef', 'synset lang defi sid')
# defは予約語で使えないのでdefiにしています
def get_synset_def_from_synset(synset, lang):
cur = conn.execute("select * from synset_def where synset=? and lang=?", (synset, lang))
return [SynsetDef(*row) for row in cur]
최후
진실한 정보가 없어서 죄송하지만 조금만 참고해주시면.그게 다야.
Reference
이 문제에 관하여(WordNet의 구조와 동의어 검색), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/rawHam/items/957cca77227f2c5ee0db
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(WordNet의 구조와 동의어 검색), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/rawHam/items/957cca77227f2c5ee0db텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)