[PYTHON] Traitement du langage naturel 2 similitude de mots

Aidemy 2020/10/29

introduction

Bonjour, c'est Yope! Je suis une école littéraire croustillante, mais j'étais intéressé par les possibilités de l'IA, alors je suis allé à l'école spécialisée en IA "Aidemy" pour étudier. Je voudrais partager les connaissances acquises ici avec vous, et je les ai résumées dans Qiita. Je suis très heureux que de nombreuses personnes aient lu l'article de synthèse précédent. Merci! Cette fois, ce sera un post. Ravi de vous rencontrer.

Quoi apprendre cette fois ・ À propos de la similitude des mots ・ Connaître les caractéristiques de la parole

Similitude des mots

Analyse morphologique du contenu des données vocales

・ Cette fois, nous apprendrons __ "caractéristiques de la parole" à partir de __ "similarité des mots" pour les données vocales du corpus. Pour ce faire, nous devons d'abord obtenir __ "similarité des mots" __. -Dans cette section, nous effectuerons un prétraitement pour acquérir la «similitude des mots». Plus précisément, l'indicateur est "O", c'est-à-dire que parmi les données d'énoncés, seuls __ les énoncés naturels sont analysés morphologiquement __.

·procédure (1) Parmi les "df_label_text" créés dans "Traitement du langage naturel 1 Extraction des données d'analyse", seuls ceux avec l'indicateur __ "O" sont extraits __. (df_label_text_O) (2) Convertissez le df_label_text_O (tableau NumPy) extrait en une liste Python avec ".tolist ()", et supprimez les nombres et les alphabets ligne par ligne avec __re.sub () __. (Reg_row) ③ analyse morphologique de reg_row avec __Janome __. Parmi ceux-ci, seul le système de surface (mot) est ajouté à la liste appelée "morpO".

・ Code![Capture d'écran 2020-10-18 17.52.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/1ddf364b-1a9b-8b5b- 3d0f-ec0417ab21dd.png)

Matrice de document Word

-__ Matrice de document Word __ est l'une des méthodes de conversion de données de mot en données numériques. ・ Il s'agit d'une valeur numérique de la fréquence des mots apparaissant dans documents. Afin d'exécuter cette matrice de document mot, le document a été divisé en mots par analyse morphologique. -Pour l'exécution, utilisez __CountVectorizer () __ de scicit-learn. -Par défaut, il n'est pas reconnu comme un mot sauf s'il a deux caractères ou plus, mais dans le cas du japonais, il y a des mots qui ont du sens même avec un seul caractère, donc dans un tel cas, "token_pattern = '(? U) \ b" dans l'argument ci-dessus Entrez "\ w + \ b '".

-Pour l'objet CountVectorizer () (CV), le nombre d'occurrences de mots peut être transformé en tableau en faisant __CV.fit_transform ('chaîne de caractères pour créer une matrice de document de mots') __.

-Dans le code ci-dessous, "morpO" dans la section précédente est converti en une matrice de document Word, qui est ensuite convertie en un tableau ndarray et représentée par un DataFrame. image.png

-Code résultat de sortie (seulement une partie) スクリーンショット 2020-10-18 18.39.40.png

Matrice de document Word pondérée

-Dans la matrice de document de mots ci-dessus, la fréquence d'apparition de mots universels tels que __ "I" et "desu" augmente inévitablement. __ À ce rythme, les mots qui n'apparaissent que dans un document spécifique ne sont pas mis en valeur et les «caractéristiques du discours» ne peuvent pas être extraites correctement. ・ Dans un tel cas, utilisez une technique telle que __ "Réduisez le poids des mots universels qui apparaissent dans n'importe quel document et augmentez le poids des mots qui n'apparaissent que dans un document spécifique" __ Des matrices de document sont souvent créées, et cela s'appelle __ "matrice de document mot pondérée" __. -En tant que valeur qui détermine le poids à ce moment, __ "TF-IDF" __, qui est obtenu en multipliant la fréquence d'apparition des mots (TF) par la valeur de IDF, est utilisée. -IDF est calculé par le rapport du nombre total de documents au nombre de documents dans lesquels le mot apparaît, et plus le nombre de __ documents qui apparaissent est petit, plus la valeur IDF est élevée. __ Autrement dit, le poids (TF-IDF) augmente.

-Exécuter la matrice de document Word pondérée comme suit. TfidfVectorizer(use_idf=) -Spécifiez True ou False pour "use_idf" et spécifiez __ "si idf est utilisé pour la pondération" __. -Similaire à CountVectorizer (), si vous voulez traiter ne serait-ce qu'un caractère comme un mot, spécifiez __ "token_pattern" __.

-Après cela, tout comme CountVectorizer (), vous pouvez utiliser __ "fit_transform ()" __ pour créer un tableau d'occurrences de mots.

Calculer la similitude des mots

・ Cette fois, nous allons créer un modèle non supervisé __ avec la similitude de l'apparence de __words en tant que fonctionnalité. -Il existe différentes méthodes pour calculer la similitude des mots, comme la similarité cosinus, qui est la similitude entre les vecteurs, mais cette fois, la similitude est calculée en calculant le __ coefficient de corrélation __ entre chaque colonne. mesure. -Utilisez la méthode __DataFrame.corr () __ pour calculer le coefficient de corrélation. Pour cette raison, le code ci-dessus l'a converti en DataFrame.

Analyser les caractéristiques de la parole

Créer une liste de similarité

-Comme le __ coefficient de corrélation calculé dans la section précédente est la quantité de caractéristiques, nous l'analyserons quantitativement en utilisant cela. ・ Commencez par convertir le coefficient de corrélation du format matriciel au format liste. Pour ce faire, utilisez la méthode __DataFrame.stack () __. (Stack () convertit la colonne en ligne, unstack () convertit la ligne en colonne)

・ La procédure du code suivant (1) _ Créez une matrice de document Word pondérée __, puis créez une matrice qui calcule le __ coefficient de corrélation __ (corr_matrixO) et convertissez-la au format list. (Corr_stackO) (2) Parmi ceux-ci, l'indice (ensemble de mots) et la valeur (coefficient de corrélation) dont le coefficient de corrélation est "0,5 à 1,0" sont extraits afin d'extraire des paires (similaires) corrélées de manière significative. (La valeur de) est extraite, __ concaténée et affichée __. ![Capture d'écran 2020-10-18 21.55.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/328d870b-566e-41ea-e394- 85aa33954369.png)

-Résultat de l'exécution (partie seulement)![Capture d'écran 2020-10-18 21.56.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/ 61bc1c17-d7e3-d7af-8df8-e1c9403dd941.png)

Créer un réseau de similarité

-__ Réseau de similarité__ est, en un mot, un graphique et une visualisation de la relation de similitude. -Lors de la visualisation de la liste de similarité créée dans la section précédente, utilisez __ "graphe non dirigé (réseau non dirigé)" __. -Utilisez une bibliothèque appelée NetworkX pour créer des graphiques non dirigés. Si vous importez ceci avec __ "nx" __ nx.from_pandas_edgelist(df,source,target,edge_attr,create_using) Peut être créé avec. ・ À propos de chaque argument df: DataFrame qui est la source du graphique source: nom de colonne de l'une des corrélations (nœud source) target: nom de colonne de l'autre côté de la corrélation (nœud cible) edge_attr: poids de chaque donnée (bord) create_using: Type de graphe (nx.Graph pour non dirigé)

-Le graphique créé peut être affiché en calculant la position d'affichage optimale avec __pos = nx.spling_layout (graphique) __, en dessinant avec __nx.draw_networkx (graphique, pos) __, puis plt.show ().

-Graphiez le "df_corlistO" créé dans la section précédente. スクリーンショット 2020-10-18 22.55.46.png

·Graphique スクリーンショット 2020-10-19 10.53.46.png

Fonctionnalités du réseau de similarité

-Bien qu'il ait été possible de générer un graphique, il est difficile de saisir les caractéristiques à première vue dans le graphique ci-dessus. ・ Par conséquent, nous établirons un nouvel indice et porterons un jugement quantitatif. ・ Différents indicateurs sont actuellement utilisés, mais ils ne seront pas expliqués en détail ici. Les indicateurs utilisés cette fois sont appelés __ "coefficient de cluster moyen" __ et __ "centralité de la médiation" __. -Le coefficient de cluster indique la densité de connexions entre __words __, et si cette moyenne est élevée, on peut dire que l'ensemble du réseau __ est également dense __. La centralité de la médiation est une valeur __ indiquant combien de «nœuds (une des paires de corrélations)» sont inclus dans le chemin le plus court entre tous les nœuds, et plus la valeur est élevée, plus les informations sont transmises efficacement. On peut dire que c'est un nœud avec une médiation et une centralité élevées.

-Calculez le coefficient de cluster moyen comme suit. __nx.average_clustering (graphique, poids = Aucun) __ -Spécifiez le poids (bord) pour le poids. Si aucun, le poids de chaque arête sera de 1.

・ Le calcul de la centralité de la médiation est effectué comme suit. __nx.betweenness_centrality (graphique, poids = Aucun) __

・ Code![Capture d'écran 2020-10-19 11.21.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698700/261279ff-7db1-c716- 2b08-436df546fbd4.png)

Extraire les sujets du réseau de similarité

-Similarité L'ensemble du réseau est ___ composé de plusieurs réseaux partiels (communautés). -A ce moment, chaque nœud de la communauté est dense __, donc extraire la communauté signifie extraire un réseau avec un haut degré de similitude __. -Pour diviser en réseaux partiels, utilisez un index appelé __ "modularité" __. Les formules de calcul détaillées sont omises. ・ L'extraction communautaire utilisant la modularité est effectuée comme suit. __greedy_modularity_communities (graphe, poids = Aucun) __

スクリーンショット 2020-10-19 12.01.32.png

Sommaire

-En convertissant en une matrice de document Word, les données de mot peuvent être converties en données numériques. Dans de nombreux cas, cela se fait avec du poids. -En convertissant en données numériques, le coefficient de corrélation de chaque donnée peut être obtenu. En conséquence, le degré de similitude entre les mots peut être calculé. -En énumérant cette similitude et en créant un réseau, la visualisation devient possible, et en utilisant un index appelé modularité, les sujets peuvent être extraits et les réseaux avec une forte similitude peuvent être extraits.

Cette fois, c'est fini. Merci d'avoir lu jusqu'à la fin.

Recommended Posts

Traitement du langage naturel 2 similitude de mots
Traitement du langage naturel 3 Continuité des mots
Traitement du langage 100 Knock-87: similitude des mots
Python: traitement du langage naturel
3. Traitement du langage naturel par Python 1-1. Word N-gram
RNN_LSTM2 Traitement du langage naturel
100 traitement du langage Knock-51: découpage de mots
Traitement du langage naturel 1 Analyse morphologique
Étudiez le traitement du langage naturel avec Kikagaku
Traitement du langage naturel pour les personnes occupées
[Traitement du langage naturel] Prétraitement avec le japonais
100 Language Processing Knock-82 (mot de contexte): Extraction de contexte
Logivan du langage artificiel et traitement du langage naturel (traitement du langage artificiel)
Traitement du langage 100 knock-86: affichage vectoriel Word
[Traitement du langage 100 coups 2020] Chapitre 7: Vecteur Word
100 Traitement du langage Knock 2020 Chapitre 7: Vecteur de mots
Se préparer à démarrer le traitement du langage naturel
Résumé de l'installation de l'analyseur de traitement du langage naturel
100 coups de traitement linguistique (2020): 40
100 coups de traitement linguistique (2020): 32
100 coups de traitement linguistique (2020): 35
100 coups de traitement linguistique (2020): 47
100 coups de traitement linguistique (2020): 39
100 coups de traitement linguistique (2020): 22
100 coups de traitement linguistique (2020): 26
100 coups de traitement linguistique (2020): 34
100 coups de traitement linguistique (2020): 42
100 coups de traitement linguistique (2020): 29
100 coups de traitement linguistique (2020): 49
Le traitement de 100 langues frappe 06 ~ 09
100 coups de traitement linguistique (2020): 43
100 coups de traitement linguistique (2020): 24
100 coups de traitement linguistique (2020): 45
3. Traitement du langage naturel par Python 2-1. Réseau de co-occurrence
100 coups de traitement linguistique (2020): 10-19
[WIP] Pré-traitement des notes dans le traitement du langage naturel
100 coups de traitement linguistique (2020): 00-09
100 coups de traitement linguistique (2020): 31
100 coups de traitement linguistique (2020): 38
100 coups de traitement linguistique (2020): 48
100 coups de traitement linguistique (2020): 44
100 coups de traitement linguistique (2020): 41
100 coups de traitement linguistique (2020): 37
100 traitement de la langue frapper 00 ~ 02
100 coups de traitement linguistique (2020): 25
100 coups de traitement linguistique (2020): 23
100 coups de traitement linguistique (2020): 33
J'ai essayé le traitement du langage naturel avec des transformateurs.
100 coups de traitement linguistique (2020): 20
100 coups de traitement linguistique (2020): 27
Étude de cas sur le traitement du langage naturel: Fréquence des mots dans'Anne avec un E '
100 coups de traitement linguistique (2020): 46
100 coups de traitement linguistique (2020): 21
Mémo de produits pratique autour du traitement du langage naturel
Traitement du langage 100 knocks-88: 10 mots à haute similitude
100 coups de traitement linguistique (2020): 36
3. Traitement du langage naturel par Python 2-2. Réseau de co-occurrence [mecab-ipadic-NEologd]
[Python] J'ai joué avec le traitement du langage naturel ~ transformers ~
Profitons du traitement du langage naturel à l'aide de l'API COTOHA
Insoutenable manque d'attention dans le traitement du langage naturel
100 coups de traitement du langage amateur: 41