** Word N-gram ** utilise un ensemble de mots adjacents comme unité de données. 2 grammes (2 mots) est comme suit.
** Co-location ** compte le nombre de fois ** les mots apparaissent ensemble dans l'unité cible (phrase) **.
Ce qui précède est un exemple de deux mots pour la nomenclature. En d'autres termes, quelle que soit la relation de position mutuelle, ** la combinaison de mots qui apparaissent dans la même phrase est l'unité de données **.
import re
import zipfile
import urllib.request
import os.path
import glob
re
: Abréviation pour Regular Expression, un module pour manipuler les expressions régulièreszipfile
: Module de manipulation des fichiers zipglob
: Module pour obtenir le nom du chemin du fichierURL = 'https://www.aozora.gr.jp/cards/000148/files/772_ruby_33099.zip'
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("。")
!apt install aptitude
!aptitude install mecab libmecab-dev mecab-ipadic-utf8 git make curl xz-utils file -y
!pip install mecab-python3==0.7
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
]
splitlines ()
est utilisée comme v
, et le troisième élément [2] ʻest ajouté à la liste en divisant
v par
split () `. Obtenirv.split () [3] [: 2] == 'nom'
, la partie qui correspond au quatrième élément [3] ʻof
v` est un nom (<font color =" LightBlue "). Seuls ceux qui correspondent à la partie "> ■ </ font>) seront extraits.import itertools
from collections import Counter
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)
, les lister avec
list () , et les stocker dans
pair_list`.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 ()
.Counter ()
pour générer des ** données de cooccurrence de type dictionnaire ** cnt_pairs
.import pandas as pd
import numpy as np
tops = sorted(
cnt_pairs.items(),
key=lambda x: x[1], reverse=True
)[:50]
sorted ()
et lambda
, et trie les objets de type dictionnaire en fonction de l'élément spécifié sous key = lambda
.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)
weighted_edges
(données pondérées).import matplotlib.pyplot as plt
import networkx as nx
%matplotlib inline
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
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()
Recommended Posts