3. Traitement du langage naturel par Python 2-1. Réseau de co-occurrence

** 1. Préparation des données textuelles **

⑴ Importation de divers modules

import re
import zipfile
import urllib.request
import os.path
import glob

⑵ Obtenir le chemin du fichier

URL = 'https://www.aozora.gr.jp/cards/000148/files/772_ruby_33099.zip'

(3) Acquisition de fichier texte et extraction de texte

def download(URL):

    #Télécharger le fichier zip
    zip_file = re.split(r'/', URL)[-1]
    urllib.request.urlretrieve(URL, zip_file)
    dir = os.path.splitext(zip_file)[0]

    #Décompressez et enregistrez le fichier zip
    with zipfile.ZipFile(zip_file) as zip_object:
        zip_object.extractall(dir)
    os.remove(zip_file)

    #Obtenez le chemin du fichier texte
    path = os.path.join(dir,'*.txt')
    list = glob.glob(path)
    return list[0]
def convert(download_text):

    #Lire le fichier
    data = open(download_text, 'rb').read()
    text = data.decode('shift_jis')

    #Extraction de texte
    text = re.split(r'\-{5,}', text)[2] 
    text = re.split(r'Livre du bas:', text)[0]
    text = re.split(r'[#Nouvelle page]', text)[0]

    #Supprimer les pièces inutiles
    text = re.sub(r'《.+?》', '', text)
    text = re.sub(r'[#.+?]', '', text)
    text = re.sub(r'|', '', text)
    text = re.sub(r'\r\n', '', text)
    text = re.sub(r'\u3000', '', text)
    text = re.sub(r'「', '', text)
    text = re.sub(r'」', '', text)

    return text
#Obtenir le chemin du fichier
download_file = download(URL)

#Extraire uniquement le texte
text = convert(download_file)

#Diviser en une liste basée sur des instructions
sentences = text.split("。")

image.png

** 2. Création de données de cooccurrence **

⑷ Installation de MeCab

!apt install aptitude
!aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y
!pip install mecab-python3==0.7

⑸ Génération de liste de nomenclature pour chaque phrase

import MeCab
mecab = MeCab.Tagger("-Ochasen")

#Générer une liste de nomenclature basée sur des phrases
noun_list = [
             [v.split()[2] for v in mecab.parse(sentence).splitlines()
             if (len(v.split())>=3 and v.split()[3][:2]=='nom')]
             for sentence in sentences
             ]

⑹ Génération de données de cooccurrence

  • Les données de co-occurrence sont un objet de type dictionnaire constitué de paires de mots de co-occurrence et de fréquence d'occurrence.
import itertools
from collections import Counter
  • ʻItertools`: Un module qui rassemble les fonctions d'itérateur pour un traitement efficace des boucles.
  • Counter: Un module pour compter le nombre d'occurrences de chaque élément
#Générer une liste de paires de nomenclatures basée sur des phrases
pair_list = [
             list(itertools.combinations(n, 2))
             for n in noun_list if len(noun_list) >=2
             ]

#Aplatir la liste des paires de nez
all_pairs = []
for u in pair_list:
    all_pairs.extend(u)

#Comptez la fréquence des paires de noms
cnt_pairs = Counter(all_pairs)
  • Extraire séquentiellement deux mots ou plus de la liste de nomenclature basée sur des phrases, générer une combinaison de deux mots avec ʻitertools.combinations () , les lister avec list () , et les stocker dans pair_list`.
  • Cependant, puisque pair_list est une unité de phrase, elle ne peut pas être comptée telle quelle. Par conséquent, aplatissez-le en l'ajoutant séquentiellement à la variable nouvellement préparée ʻall_pairsavec ʻextend ().
  • Passez ceci à Counter () pour générer des ** données de cooccurrence de type dictionnaire ** cnt_pairs.

image.png

** 3. Création de données de dessin **

import pandas as pd
import numpy as np

⑺ Affiner les données de cooccurrence

  • Affinez les éléments pour simplifier l'apparence lors du dessin. Ici, nous allons générer une liste des 50 meilleurs ensembles par fréquence d'apparition.
tops = sorted(
    cnt_pairs.items(), 
    key=lambda x: x[1], reverse=True
    )[:50]
  • Il a une syntaxe qui combine les expressions sorted () et lambda, et trie les objets de type dictionnaire en fonction de l'élément spécifié sous key = lambda.
  • La référence «x [1]» extrait les 50 premières paires du deuxième élément, c'est-à-dire le tri inversé par fréquence «reverse = True».

⑻ Génération de données pondérées

noun_1 = []
noun_2 = []
frequency = []

#Créer un bloc de données
for n,f in tops:
    noun_1.append(n[0])    
    noun_2.append(n[1])
    frequency.append(f)

df = pd.DataFrame({'La nomenclature ci-dessus': noun_1, 'Nomenclature ultérieure': noun_2, 'Fréquence d'apparition': frequency})

#Définition des données pondérées
weighted_edges = np.array(df)
  • Conversion des 50 premiers ensembles de données de cooccurrence en tableau pour créer des weighted_edges (données pondérées).
  • Ci-dessous se trouve la trame de données avant la conversion en tableau.

image.png

** 4. Dessiner un schéma de réseau **

⑼ Import de la bibliothèque de visualisation

import matplotlib.pyplot as plt
import networkx as nx
%matplotlib inline 
  • ** networkX ** est un package pour créer et manipuler des réseaux complexes et des structures de graphes en Python.
  • Dans le diagramme de réseau, les sommets sont appelés ** nœuds ** et les arêtes reliant les sommets sont appelées ** arêtes **
  • Afin d'afficher l'étiquette du nœud en japonais, il est nécessaire d'importer le japanize_matplotlib suivant puis de spécifier la police japonaise.
#Un module qui rend matplotlib compatible avec l'affichage japonais
!pip install japanize-matplotlib
import japanize_matplotlib

⑽ Visualisation par NetworkX

  • La procédure pour dessiner un diagramme de réseau avec networkX est de 3 étapes: ➀ créer un objet avec une structure graphique, ➁ y charger des données et ➂ spécifier des spécifications telles que des nœuds et des arêtes sur matplotlib et dessiner.
  • Cela semble déroutant, mais font_family =" IPAexGothic " est la clé, et en spécifiant ** font_family avec une police japonaise **, l'étiquette de nœud sera rendue compatible avec l'affichage japonais.
#Générer un objet graphique
G = nx.Graph()

#Lecture des données pondérées
G.add_weighted_edges_from(weighted_edges)

#Dessiner un diagramme de réseau
plt.figure(figsize=(10,10))
nx.draw_networkx(G,
                 node_shape = "s",
                 node_color = "c", 
                 node_size = 500,
                 edge_color = "gray", 
                 font_family = "IPAexGothic") #Spécification de la police

plt.show()

image.png


  • Afin de saisir le mécanisme de l'analyse de réseau de cooccurrence comme un grand flux, des détails tels que la définition de mots vides (mots à exclure) et le traitement des mots composés (par exemple, «individualisme» au lieu de «individu» et «principe») J'ai fermé les yeux.
  • De plus, pour plus de commodité, je l'ai divisé en quatre étapes de travail suivantes. Il y a quatre étapes: ➀ préparation des données de texte, ➁ création de données de cooccurrence, ➂ création de données de dessin et ➃ dessin de diagramme de réseau. Cependant, en général, je pense que cela se comprend en trois étapes: ➊ le prétraitement, ➋ l'analyse et ➌ la visualisation.
  • Surtout ➊ Je pense que le prétraitement est le cœur du traitement du langage naturel. En fait, il peut être incorporé dans le cadre de ➋ dans le script, mais en bref, il s'agit de "comment extraire les mots nécessaires des données brutes". Quel type de point de vue analytique et quels critères utiliser pour extraire les mots? Il apparaîtra directement dans les résultats de l'analyse, ce qui affectera l'interprétation. C'est l'unité de travail qui demande le plus de considération et qui prend du temps et de l'énergie.

Recommended Posts

3. Traitement du langage naturel par Python 2-1. Réseau de co-occurrence
3. Traitement du langage naturel par Python 2-2. Réseau de co-occurrence [mecab-ipadic-NEologd]
Python: traitement du langage naturel
3. Traitement du langage naturel par Python 1-1. Word N-gram
100 coups de traitement du langage avec Python 2015
[Python] J'ai joué avec le traitement du langage naturel ~ transformers ~
Créer un environnement pour le traitement du langage naturel avec Python
100 traitements de langage avec Python
100 traitements de langage avec Python (chapitre 3)
100 traitements de langage avec Python (chapitre 2, partie 2)
100 traitements de langage avec Python (chapitre 2, partie 1)
J'ai essayé le traitement du langage naturel avec des transformateurs.
Dockerfile avec les bibliothèques nécessaires pour le traitement du langage naturel avec python
RNN_LSTM2 Traitement du langage naturel
Traitement d'image avec Python
Démarrer avec Python avec 100 coups sur le traitement du langage
Python: apprentissage profond du traitement du langage naturel: principes de base
Profitons du traitement du langage naturel à l'aide de l'API COTOHA
3. Traitement du langage naturel avec Python 1-2. Comment créer un corpus: Aozora Bunko
Traitement d'image avec Python (partie 2)
"Traitement Apple" avec OpenCV3 + Python3
[Analyse de co-occurrence] Analyse de co-occurrence facile avec Python! [Python]
Réseau de neurones avec Python (scikit-learn)
Traitement du signal acoustique avec Python (2)
Traitement du signal acoustique avec Python
[Chapitre 5] Introduction à Python avec 100 coups de traitement du langage
Modèle utilisant un réseau neuronal convolutif dans le traitement du langage naturel
3. Traitement du langage naturel par Python 3-1. Important outil d'extraction de mots Analyse TF-IDF [définition originale]
100 Language Processing Knock Chapitre 1 (Python)
100 Language Processing Knock Chapitre 2 (Python)
Traitement d'image avec Python (partie 1)
Traitement du langage naturel 1 Analyse morphologique
[Chapitre 3] Introduction à Python avec 100 coups de traitement du langage
Traitement du langage naturel 3 Continuité des mots
Traitement d'image avec Python (3)
[Chapitre 2] Introduction à Python avec 100 coups de traitement du langage
Python: représentation vectorielle en langage naturel
Programmation réseau avec Python Scapy
Traitement du langage naturel 2 similitude de mots
[Chapitre 4] Introduction à Python avec 100 coups de traitement du langage
[Python] Traitement d'image avec scicit-image
[Pratique] Créez une application Watson avec Python! # 3 [Classification du langage naturel]
[Python] Essayez de classer les boutiques de ramen par traitement du langage naturel
[Python] Traitement parallèle facile avec Joblib
Réseau neuronal avec OpenCV 3 et Python 3
100 traitements du langage naturel frappent le chapitre 4 Commentaire
100 Language Processing Knock Chapitre 1 en Python
Mesure de retard unidirectionnelle du réseau par python
Traitement d'image avec la binarisation Python 100 knocks # 3
Logivan du langage artificiel et traitement du langage naturel (traitement du langage artificiel)
10 fonctions du "langage avec batterie" python
Le débutant en Python a essayé 100 traitements de langage Knock 2015 (05 ~ 09)
[Traitement du langage 100 coups 2020] Chapitre 8: Réseau neuronal
100 traitement d'image par Python Knock # 2 Échelle de gris
100 Language Processing Knock Chapitre 1 par Python
Se préparer à démarrer le traitement du langage naturel