[PYTHON] Structure WordNet et recherche de synonymes

introduction

Il est nécessaire d'obtenir des synonymes avec Programme pour affaiblir le japonais, et à la suite de la recherche, j'ai trouvé que WordNet était nécessaire, j'ai donc recherché WordNet. Je l'ai vu.

Qu'est-ce que WordNet

Japanese WordNet est "un dictionnaire de concepts japonais dans lequel les concepts individuels sont regroupés en unités appelées" synsets ", et ils sont liés sémantiquement à d'autres synsets" (par site fourni). Je pense que l'utilisation principale est la recherche de synonymes. Une enquête est requise pour d'autres utilisations.

Structure de WordNet

WordNet est disponible sur ici, et il semble y en avoir plusieurs types, mais ici, "* Wordnet japonais et WordNet anglais dans Jetez un œil à une base de données sqlite3 * ".

Les 11 tableaux suivants sont inclus dans WordNet.

Parmi ceux-ci, les tables minimales requises pour obtenir les synonymes d'un mot particulier étaient le mot, le synset et le sens. Cependant, comme il n'y a pas de relation entre les informations sémantiques et cela seul, le modèle de données extrait de ces tables après avoir inclus synset_def est le suivant. ER_WordNet_noKeys.png

Le mot mot i </ sub> appartient au concept synset j </ sub> et est une image qui les relie au sens de l'élément. En passant, en utilisant le mot "warm" comme exemple, le résultat de la sortie de synset et synset_def est le suivant.

wordnet.png

Acquisition de synonymes

Maintenant, je vais vous expliquer la procédure et le programme pour obtenir une liste de synonymes en utilisant WordNet. Le flux de traitement est le suivant.

  1. Obtenez l'id du mot cible
  2. Obtenez le sens du synset auquel appartient le wordid
  3. Obtenir des mots appartenant au synset comme synonymes

La vue d'ensemble du code est ci-dessous.

def search_synonyms(lemma, lang="jpn"):
    synonym_list = []
    # 1.Obtenez l'identifiant d'un mot
    wobj = get_word(lemma)
    if wobj:
        word = wobj[0]
        # 2.Comprenez le synset auquel appartient le wordid
        senses = get_senses(word, lang)
        for s in senses:
            # 3.Obtenir des mots appartenant à des synonymes comme synonymes
            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}'Aucun synonyme n'a été trouvé.")
    
    return synonym_list

Ci-après, nous décrirons chacun des processus 1 à 3.

1. Obtenez l'id du mot cible

Le traitement de la fonction `` get_word (lemma) '' pour obtenir le mot-id du mot cible est le suivant. De plus, ici, pas le wordid seul, mais tout l'objet Word est acquis. (Du point de vue de la lisibilité et de l'extensibilité.)

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. Obtenez le sens du synset auquel appartient le wordid

Le traitement de la fonction `` `get_senses (word [, lang]) '' pour obtenir le sens du mot (id) est le suivant.

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]

La limitation de langue (`lang =" jpn "`) peut être juste le traitement suivant, mais je l'ai incluse pour le moment.

3. Obtenir des mots appartenant au synset comme synonymes

Le traitement de la fonction get_words_from_synset (synset, word [, lang]) pour obtenir le mot lui appartenant à partir de synset est le suivant.

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]

Le dernier `` wordid <> {word.wordid} '' est inclus pour exclure le mot cible lui-même. Je pense qu'il y a quelques modèles dans la façon d'écrire SQL.


prime

Vous pouvez obtenir des synonymes avec seulement 1 à 3, mais si vous voulez voir à quel type de concept chaque synonyme est similaire, vous pouvez également obtenir `` synset_def ''.

SynsetDef = namedtuple('SynsetDef', 'synset lang defi sid')
#Comme def ne peut pas être utilisé comme mot réservé, il est défini sur 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]

à la fin

Je suis désolé qu'il n'y ait pas de nouvelles informations, mais j'espère qu'elles seront utiles même un peu. c'est tout.

Recommended Posts

Structure WordNet et recherche de synonymes
[Python] Recherche de priorité de profondeur et recherche de priorité de largeur
Vectoriser les phrases et rechercher des phrases similaires
Recherche de 2 minutes Python et ses dérivés