[PYTHON] [Apprentissage automatique] Extraire des mots similaires mécaniquement en utilisant WordNet

Aperçu du traitement du langage naturel

Avant d'aborder WordNet, abordons brièvement le traitement du langage naturel. Pour que les machines comprennent des phrases dans le traitement du langage naturel, les tâches suivantes, étape par étape, d'analyse morphologique, d'analyse syntaxique, d'analyse sémantique et d'analyse de contexte sont principalement nécessaires.

Analyse morphologique

C'est une tâche de diviser et de discriminer des données textuelles en langage naturel sans notes d'information en colonnes d'éléments morphologiques (unité minimale qui a un sens dans la langue) sur la base d'informations telles que la grammaire de la langue cible et les paroles des mots appelés dictionnaires.

Par exemple, l'analyse morphologique de «En attente de vous» est la suivante. morph.png

Référence: wikipedia

MeCab est un outil d'analyse morphologique typique.

Analyse

S'il s'agit d'un langage naturel, c'est une procédure à clarifier en le divisant en éléments morphologiques et en traçant la relation.

Par exemple, lorsqu'il y a une phrase "Beautiful Water Wheelhouse Maiden", les deux syntaxes suivantes peuvent être prises en compte.

b1.png

b2.png

Référence: wikipedia

Nous analyserons le type de connexion en fonction des informations de la morphologie environnante. Cabocha est un outil d'analyse typique.

Analyse sémantique

C'est une procédure pour donner des connaissances à la machine. Par exemple, si vous avez la phrase suivante:

"Le mont Fuji et la mer sont magnifiques"

C'est cher pour les humains, mais il est facile de voir de quel mot cela dépend. Même s'il y a un «mont Fuji élevé», on peut intuitivement juger qu'il n'y a pas de «haute mer». Cependant, la machine n'ayant aucune connaissance, on ne peut pas juger que la "haute mer" est étrange.

Qu'est-ce que WordNet

Un type de cissolus. Un dictionnaire de synonymes qui classe et organise les mots en fonction de leurs relations supérieures / inférieures, des relations partielles / totales, des synonymes et des synonymes. Il s'agit d'une systématisation de la façon dont chaque mot est lié, et est utilisé dans l'analyse sémantique mentionnée ci-dessus.

wordnet.png

Par exemple, dans le cas du «vélo de route», les concepts de niveau supérieur qui incluent «vélo de route» sont «moto» et «véhicule», et les concepts de niveau inférieur sont «nu» et «américain». Notez que "scouter" et "off-road bike", qui sont écrits en parallèle avec "bike", peuvent être considérés comme des termes similaires.

Utilisation

Ceux-ci sont déjà organisés pour une utilisation programmatique et peuvent être téléchargés ci-dessous. Il est publié sur sqlite et peut être lu en utilisant sql.

pos_def ('pos', lang', def')
link_def ('link', lang','def')
synset_def ('synset', 'lang', 'def', sid')
synset_ex ('synset', 'lang', 'def', 'sid')
synset ('synset', 'pos', 'name', 'src')
synlink ('synset1', synset2', 'link', 'src')
ancestor ('synset1', 'synset2', 'hops')
sense ('synset' ,'wordid','lang', 'rank', 'lexid','freq','src')
word ('wordid','lang', 'lemma', 'pron', 'pos')
variant ('varid','wordid','lang', 'lemma','vartype')
xlink ('synset', 'resource','xref', 'misc', 'confidence')

column.png

programme

Confirmation 1: Confirmer les colonnes de chaque tableau

import sqlite3
conn = sqlite3.connect("wnjpn.db")

def chk_table():
    print("")
    print("###word table info")
    cur = conn.execute("select count(*) from word")
    for row in cur:
        print("word num:" +str(row[0]))

    cur = conn.execute("select name from sqlite_master where type='table'")
    for row in cur:
        print("=======================================")
        print(row[0])
        cur = conn.execute("PRAGMA TABLE_INFO("+row[0]+")")
        for row in cur:
            print(row)

if __name__=="__main__":
    chk_table()

--Résultat 1

###word table info
word num:249121
=======================================
pos_def
(0, 'pos', 'text', 0, None, 0)
(1, 'lang', 'text', 0, None, 0)
(2, 'def', 'text', 0, None, 0)
=======================================
link_def
(0, 'link', 'text', 0, None, 0)
(1, 'lang', 'text', 0, None, 0)
(2, 'def', 'text', 0, None, 0)
=======================================
synset_def
(0, 'synset', 'text', 0, None, 0)
(1, 'lang', 'text', 0, None, 0)
(2, 'def', 'text', 0, None, 0)
(3, 'sid', 'text', 0, None, 0)
=======================================
synset_ex
(0, 'synset', 'text', 0, None, 0)
(1, 'lang', 'text', 0, None, 0)
(2, 'def', 'text', 0, None, 0)
(3, 'sid', 'text', 0, None, 0)
=======================================
synset
(0, 'synset', 'text', 0, None, 0)
(1, 'pos', 'text', 0, None, 0)
(2, 'name', 'text', 0, None, 0)
(3, 'src', 'text', 0, None, 0)
=======================================
synlink
(0, 'synset1', 'text', 0, None, 0)
(1, 'synset2', 'text', 0, None, 0)
(2, 'link', 'text', 0, None, 0)
(3, 'src', 'text', 0, None, 0)
=======================================
ancestor
(0, 'synset1', 'text', 0, None, 0)
(1, 'synset2', 'text', 0, None, 0)
(2, 'hops', 'int', 0, None, 0)
=======================================
sense
(0, 'synset', 'text', 0, None, 0)
(1, 'wordid', 'integer', 0, None, 0)
(2, 'lang', 'text', 0, None, 0)
(3, 'rank', 'text', 0, None, 0)
(4, 'lexid', 'integer', 0, None, 0)
(5, 'freq', 'integer', 0, None, 0)
(6, 'src', 'text', 0, None, 0)
=======================================
word
(0, 'wordid', 'integer', 0, None, 1)
(1, 'lang', 'text', 0, None, 0)
(2, 'lemma', 'text', 0, None, 0)
(3, 'pron', 'text', 0, None, 0)
(4, 'pos', 'text', 0, None, 0)
=======================================
variant
(0, 'varid', 'integer', 0, None, 1)
(1, 'wordid', 'integer', 0, None, 0)
(2, 'lang', 'text', 0, None, 0)
(3, 'lemma', 'text', 0, None, 0)
(4, 'vartype', 'text', 0, None, 0)
=======================================
xlink
(0, 'synset', 'text', 0, None, 0)
(1, 'resource', 'text', 0, None, 0)
(2, 'xref', 'text', 0, None, 0)
(3, 'misc', 'text', 0, None, 0)
(4, 'confidence', 'text', 0, None, 0)

Confirmation 2: Confirmer le mot enregistré (japonais)

import sqlite3
conn = sqlite3.connect("wnjpn.db")


def chk_word():
    #cur = conn.execute("select * from word limit 240000")
    cur = conn.execute("select * from word  where lang='jpn' limit 240000")
    for row in cur:
        print(row)

if __name__=="__main__":
    chk_word()

--Résultat 2 Afficher seulement une partie

(249100, 'jpn', 'Assiette creuse', None, 'n')
(249101, 'jpn', 'Étendue', None, 'v')
(249102, 'jpn', 'Astringent', None, 'n')
(249103, 'jpn', 'Affirmation', None, 'n')
(249104, 'jpn', 'Allborg', None, 'n')
(249105, 'jpn', 'Derrière le côté', None, 'n')
(249106, 'jpn', 'réparation', None, 'n')
(249107, 'jpn', 'Commodité', None, 'n')
(249108, 'jpn', 'Commodité', None, 'a')
(249109, 'jpn', 'Vilas', None, 'n')
(249110, 'jpn', 'Démodé', None, 'a')
(249111, 'jpn', 'Couper', None, 'n')
(249112, 'jpn', 'Couper', None, 'a')
(249113, 'jpn', 'Super texte', None, 'n')
(249114, 'jpn', 'Maladie sexuelle', None, 'n')
(249115, 'jpn', 'Encre Mayu', None, 'n')
(249116, 'jpn', 'ourlet', None, 'n')
(249117, 'jpn', 'Non intime', None, 'a')
(249118, 'jpn', 'Matériel scientifique', None, 'n')
(249119, 'jpn', 'Retour en arrière', None, 'v')
(249120, 'jpn', 'Répéter', None, 'v')
(249121, 'jpn', 'volonté', None, 'n')

Confirmation 3: Extraire les synonymes

import sqlite3
conn = sqlite3.connect("wnjpn.db")


def main(word):
    print("")
    print("")
    print("##contribution: 【",word,"】")
    print("")


    #Vérifiez si le mot existe dans Wordnet
    cur = conn.execute("select wordid from word where lemma='%s'" % word)
    word_id = 99999999
    for row in cur:
        word_id = row[0]
    if word_id==99999999:
        print("「%s」is not exist" % word)
        return

    #Obtenez le concept
    cur = conn.execute("select synset from sense where wordid='%s'" % word_id)
    synsets = []
    for row in cur:
        synsets.append(row[0])
    print(synsets)

    #Affichage des mots contenus dans le concept
    for synset in synsets:
        cur1 = conn.execute("select name from synset where synset='%s'" % synset)
        for row1 in cur1:
            print("##concept: %s" %(row1[0]))
        cur2 = conn.execute("select def from synset_def where (synset='%s' and lang='jpn')" % synset)
        for row2 in cur2:
            print("##sens: %s" %(row2[0]))

        cur3 = conn.execute("select wordid from sense where (synset='%s' and wordid!=%s)" % (synset,word_id))
        for i,row3 in enumerate(cur3):
            target_word_id = row3[0]
            cur3_1 = conn.execute("select lemma from word where wordid=%s" % target_word_id)
            for row3_1 in cur3_1:
                print("Synonymes"+str(i+1)+": %s" % (row3_1[0]))

        print()

if __name__=="__main__":
    word="Voiture"
    main(word)

--Résultat 3

##contribution:【 Voiture 】

['03791235-n', '02958343-n']
##concept: motor_vehicle
##sens:Véhicules à roues automotrices qui ne roulent pas sur des rails
Synonymes 1: motor_vehicle
Synonymes 2: automotive_vehicle
Synonymes 3:Véhicule à moteur

##concept: auto
##sens:Voiture à 4 roues
##sens:Habituellement propulsé par un moteur à combustion interne
Synonymes 1: auto
Synonymes 2: motorcar
Synonymes 3: machine
Synonymes 4: car
Synonymes 5: automobile
Synonymes 6:Quatre roues
Synonymes 7:Voiture
Synonymes 8:voiture
Synonymes 9:Voiture de voyageurs
Synonymes 10:Voiture
Synonymes 11:Voiture

Si vous entrez "automobile" comme flux d'extraction de mots similaires, suivez d'abord les concepts supérieurs d'automobiles "motor_vehicle" et "auto", et extrayez les mots en dessous pour extraire les mots qui sont en parallèle avec "automobile". Je le retire.

Recommended Posts

[Apprentissage automatique] Extraire des mots similaires mécaniquement en utilisant WordNet
Développement d'applications à l'aide d'Azure Machine Learning
Prévision du cours des actions à l'aide de l'apprentissage automatique (scikit-learn)
[Apprentissage automatique] Prédiction FX à l'aide de l'arbre de décision
Apprentissage automatique
[Apprentissage automatique] Apprentissage supervisé utilisant l'estimation de la densité du noyau
Prévision du cours des actions à l'aide de l'apprentissage automatique (édition de retour)
[Apprentissage automatique] Analyse de régression à l'aide de scicit learn
Une histoire sur l'apprentissage automatique simple avec TensorFlow
[Apprentissage automatique] Apprentissage supervisé utilisant l'estimation de la densité du noyau Partie 2
[Apprentissage automatique] Apprentissage supervisé utilisant l'estimation de la densité du noyau Partie 3
Essayez d'utiliser le bloc-notes Jupyter à partir d'Azure Machine Learning
Raisonnement causal utilisant l'apprentissage automatique (organisation des méthodes de raisonnement causal)
Classification de l'apprentissage automatique
Exemple d'apprentissage automatique
Ce que j'ai appris sur l'IA / l'apprentissage automatique avec Python (1)
Créez des projets d'apprentissage automatique à une vitesse explosive à l'aide de modèles
Ce que j'ai appris sur l'IA / l'apprentissage automatique avec Python (3)
Apprentissage automatique avec des images de catégorie Caffe -1 à l'aide du modèle de référence
Tech-Circle Commençons le développement d'applications à l'aide de l'apprentissage automatique (auto-apprentissage)
Essayez d'extraire des mots à haute fréquence en utilisant NLTK (python)
[Apprentissage automatique] Essayez de détecter des objets à l'aide de la recherche sélective
[Apprentissage automatique] Classification de texte à l'aide du modèle Transformer (classificateur basé sur l'attention)
Mémo de construction d'environnement d'apprentissage automatique par Python
Ce que j'ai appris sur l'IA / l'apprentissage automatique avec Python (2)
J'ai essayé de compresser l'image en utilisant l'apprentissage automatique