[PYTHON] WordNet-Struktur und Synonym-Suche

Einführung

Es besteht die Notwendigkeit, Synonyme mit Programm zum Schwächen des Japanischen zu erhalten. Als Ergebnis der Suche stellte ich fest, dass WordNet erforderlich ist, und suchte nach WordNet. Ich sah es.

Was ist WordNet?

Das japanische WordNet ist "ein japanisches Konzeptwörterbuch, in dem einzelne Konzepte in Einheiten zusammengefasst werden, die als" Synsets "bezeichnet werden, und die semantisch mit anderen Synsets verknüpft sind" (von der bereitgestellten Site). Ich denke, die Hauptverwendung ist die Synonym-Suche. Für andere Zwecke ist eine Untersuchung erforderlich.

WordNet-Struktur

WordNet wird unter hier bereitgestellt, und es scheint verschiedene Typen zu geben, aber hier "* Japanese Wordnet und English WordNet in". Schauen Sie sich eine sqlite3-Datenbank an * ".

Die folgenden 11 Tabellen sind in WordNet enthalten.

Von diesen waren die Mindesttabellen, die erforderlich sind, um Synonyme für ein bestimmtes Wort zu erhalten, Wort, Synset und Sinn. Da es jedoch einsam ist, dass es keine Beziehung zwischen semantischer Information und dieser allein gibt, lautet das Datenmodell, das nach dem Einschließen von synset_def aus diesen Tabellen extrahiert wurde, wie folgt. ER_WordNet_noKeys.png

Das Wort Wort i </ sub> gehört zum Konzeptsynset j </ sub> und ist ein Bild, das sie mit dem Objektsinn verbindet. Am Beispiel des Wortes "warm" ist das Ergebnis der Ausgabe von synset und synset_def übrigens wie folgt.

wordnet.png

Erwerb von Synonymen

Jetzt werde ich die Vorgehensweise und das Programm erläutern, um mithilfe von WordNet eine Liste von Synonymen zu erhalten. Der Verarbeitungsablauf ist wie folgt.

  1. Holen Sie sich die Wort-ID des Zielworts
  2. Machen Sie sich ein Bild von dem Synset, zu dem die Wort-ID gehört
  3. Holen Sie sich zu synset gehörende Wörter als Synonyme

Das große Bild des Codes ist unten.

def search_synonyms(lemma, lang="jpn"):
    synonym_list = []
    # 1.Holen Sie sich die Wort-ID eines Wortes
    wobj = get_word(lemma)
    if wobj:
        word = wobj[0]
        # 2.Erhalten Sie den Sinn des Synsets, zu dem die Wort-ID gehört
        senses = get_senses(word, lang)
        for s in senses:
            # 3.Holen Sie sich Wörter, die zu Synset gehören, als Synonyme
            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}'Es wurden keine Synonyme für gefunden.")
    
    return synonym_list

Im Folgenden werden wir jeden der Prozesse 1 bis 3 beschreiben.

1. Holen Sie sich die Wort-ID des Zielworts

Die Verarbeitung der Funktion `get_word (lemma)` zum Abrufen der Wort-ID des Zielworts ist wie folgt. Außerdem wird hier nicht nur die Wort-ID, sondern das gesamte Word-Objekt erfasst. (Unter dem Gesichtspunkt der Lesbarkeit und Erweiterbarkeit.)

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. Machen Sie sich ein Bild von dem Synset, zu dem die Wort-ID gehört

Die Verarbeitung der Funktion `get_senses (word [, lang])`, um den Sinn von word (id) zu erhalten, ist wie folgt.

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]

Die Sprachbeschränkung (`lang =" jpn "`) kann nur die folgende Verarbeitung sein, aber ich habe sie vorerst aufgenommen.

3. Holen Sie sich zu synset gehörende Wörter als Synonyme

Die Verarbeitung der Funktion `get_words_from_synset (synset, word [, lang])` zum Abrufen des dazugehörigen Wortes von synset erfolgt wie folgt.

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]

Die letzte `wordid <> {word.wordid}` ist enthalten, um das Zielwort selbst auszuschließen. Ich denke, es gibt einige Muster beim Schreiben von SQL.


Bonus

Sie könnten Synonyme mit nur 1 bis 3 erhalten, aber wenn Sie sehen möchten, welcher Art von Konzept jedes Synonym ähnelt, können Sie auch `` `synset_def``` erhalten.

SynsetDef = namedtuple('SynsetDef', 'synset lang defi sid')
#Da def nicht als reserviertes Wort verwendet werden kann, wird es auf defi gesetzt.

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]

schließlich

Es tut mir leid, dass es keine neuen Informationen gibt, aber ich hoffe, dass sie auch nur ein wenig hilfreich sein werden. das ist alles.

Recommended Posts

WordNet-Struktur und Synonym-Suche
[Python] Suche nach Tiefenpriorität und Suche nach Breitenpriorität
Vektorisieren Sie Sätze und suchen Sie nach ähnlichen Sätzen
Python 2-Minuten-Suche und ihre Ableitungen