WordNet의 구조와 동의어 검색

10362 단어 PythonWordNet

개시하다


일본어를 약하게 만드는 프로그램.에서 근의어를 얻는 용도가 있는데 조사 결과 WordNet이 필요하다는 것을 발견하여 WordNet에 대해 조사를 실시했다.

WordNet


일본어 워드넷은'일본어의 개념 사전에서 각 개념을'synset'단위로 총결산한 것으로, 이런 개념들은 의미에서 다른synset과 연결된다'(by 제공 사이트).나는 주요한 용도가 동의어 검색이라고 생각한다.다른 용도에 대해서는 조사가 필요하다.

WordNet의 구조


WordNet여기.은 몇 가지 종류가 있는 것 같습니다. 여기서'Japanese Wordnet and English WordNet in an sqlite3 데이터베이스'를 살펴보겠습니다.
WordNet에 포함된 테이블은 다음과 같은 11개입니다.
  • ancestor
  • link_def
  • pos_def
  • sense
  • synlink
  • synset_def
  • synset_ex
  • synset
  • variant
  • word
  • xlink
  • 그 중에서 특정 단어의 동의어를 얻기 위해 최소한의 표는 워드,synset,sense 세 개다.다만, 단지 이렇다면 의미없는 정보와 연관되어 외로울 뿐이다def도 넣은 후에 이 표들의 데이터 모델은 다음과 같다.

    ※ 참고: http://compling.hss.ntu.edu.sg/wnja/pubs/2009-alr-wn.pdf
    단어 wordi는 개념synsetj에 속하며sense라는 항목으로 그 인상을 연결한다.
    그나저나'따뜻함'이라는 단어를 예로 들면synset과synset출력 def의 결과는 다음과 같습니다.

    동의어를 얻다


    다음은 WordNet을 사용하여 동의어 일람표를 얻는 프로그램과 프로그램에 대한 설명입니다.처리 프로세스는 다음과 같습니다.
  • 목표 단어의 워드 가져오기
  • 이 워드가 속한synset의sense
  • 획득
  • synset에 속하는 단어를 동의어로 얻기
  • 코드의 전체 이미지는 다음과 같습니다.
    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]
    

    최후


    진실한 정보가 없어서 죄송하지만 조금만 참고해주시면.그게 다야.

    좋은 웹페이지 즐겨찾기