[PYTHON] Visualisez la "couleur régionale" de la ville en appliquant la vectorisation des documents

Aperçu

En appliquant la méthode de vectorisation de document dans le traitement du langage naturel, nous avons créé une carte à code couleur de chaque région en fonction des informations de région décrites dans le texte. Plus précisément, les résultats de la classification des documents de l'urbanisme (entretien, aménagement, politique de conservation: dit entretien) de l'aire métropolitaine par le modèle thématique (LDA) sont exprimés sur la carte avec des valeurs RVB. sample_20191230.png

Je pense que cela peut conduire à une découverte conceptuelle que "cette zone et cette zone sont géographiquement séparées, mais ont les mêmes caractéristiques que prévu".

À l'heure actuelle, les données ne sont pas complètement organisées et les dents manquent. Par exemple, la préfecture d'Ibaraki est souvent violette, tandis que les préfectures de Chiba et de Saitama sont principalement vertes et brunes. Cependant, même à Saitama, le côté ouest comme Chichibu montre une couleur proche de celle de la préfecture d'Ibaraki. De plus, Kimitsu et Tokorozawa sont étonnamment proches. C'est un mystère pourquoi le centre de la ville de Saitama (Omiya) est également violet, etc. À mesure que le nombre de données augmente, le sentiment de précision peut s'améliorer.

données originales

J'ai réparé les documents d'urbanisme de Chiba, Saitama et Ibaraki du Liens du plan directeur d'urbanisme du ministère des Terres, des Infrastructures, des Transports et du Tourisme. Cependant, tous les domaines ne sont pas couverts et ne sont que des échantillons. J'ai créé un ensemble de données (format CSV) comme celui-ci en tant qu'entrée.

name description
1 Ryugasaki / Ushihisa Ryugasaki / Ushiku City Planning (Ryugasaki City, Ushiku City, Tone Town) - Renforcer la coopération entre les villes voisines dans la zone d'urbanisme Il est devenu (omis)
2 Ville d'Iino Iino City Planning (Iino City) Vise à réaliser une société à faible émission de carbone en promouvant l'utilisation des transports publics et en créant de la verdure dans la zone d'urbanisme. Développement unique de la région ~ (omis)

Vectorisation de documents

――Le code que vous avez réellement créé est le suivant. MeCab est utilisé pour l'analyse morphologique, gensim est utilisé pour la vectorisation par modèle thématique et scikit-learn est utilisé pour la réduction de dimension par TSNE. Il peut y avoir de nombreuses améliorations, mais j'aimerais corriger ces points au besoin.

visualizer.py


from sklearn.manifold import TSNE
from gensim import corpora, models
import string
import re
import MeCab
import pandas as pd
import numpy as np

#Text Tokenizer by MeCab
def text_tokenizer(text):
    token_list = []
    tagger = MeCab.Tagger()
    tagger.parse('') 
    node = tagger.parseToNode(text)
    while node:
        pos = node.feature.split(",")
        if pos[0] in ["nom", "verbe", "adjectif"]: #target word-class
            if pos[6] != '*': #lemma is added when it exists
                token_list.append(pos[6])
            else:
                token_list.append(node.surface)        
        node = node.next
    return list(token_list)

#Loading input dataset
df = pd.read_csv('input.csv', encoding="utf-8")
df['text'] = df['description'] #set target column

#Remove https-links
df['text_clean'] = df.text.map(lambda x: re.sub(r'https?://[\w/:%#\$&\?\(\)~\.=\+\-]+', "", x))
#Remove numerals
df['text_clean'] = df.text_clean.map(lambda x: re.sub(r'\d+', '', x))
#Converting all letters into lower case
df['text_clean'] = df.text_clean.map(lambda x: x.lower())
#Creating DataFrame for Token-list
df['text_tokens'] = df.text_clean.map(lambda x: text_tokenizer(x))

#LDA
np.random.seed(2000)
texts = df['text_tokens'].values
dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]
ldamodel = models.ldamodel.LdaModel(corpus, id2word=dictionary, num_topics=20, passes=5, minimum_probability=0)
ldamodel.save('lda_bz.model')
print(ldamodel.print_topics())

#Converting Topic-Model result into numpy matrix
hm = np.array([[y for (x,y) in ldamodel[corpus[i]]] for i in range(len(corpus))])

#Dimensionality reduction by tsne
tsne = TSNE(n_components=3, init='pca', verbose=1, random_state=2000, perplexity=50, method='exact', early_exaggeration=120, learning_rate=200, n_iter=1000)
embedding = tsne.fit_transform(hm)

x_coord = embedding[:, 0]
y_coord = embedding[:, 1]
z_coord = embedding[:, 2]

#RGB conversion with normalization
def std_norm(x, axis=None):
    xmean = x.mean(axis=axis, keepdims=True)
    xstd = np.std(x, axis=axis, keepdims=True)
    y = (x-xmean)/xstd
    min = y.min(axis=axis, keepdims=True)
    max = y.max(axis=axis, keepdims=True)
    norm_rgb = (y-min)/(max-min) * 254
    result = norm_rgb.round(0)
    return result

x_rgb = std_norm(x_coord, axis=0)
y_rgb = std_norm(y_coord, axis=0)
z_rgb = std_norm(z_coord, axis=0)

embedding = pd.DataFrame(x_coord, columns=['x'])
embedding['y'] = pd.DataFrame(y_coord)
embedding['z'] = pd.DataFrame(y_coord)
embedding["r"] = pd.DataFrame(x_rgb)
embedding["g"] = pd.DataFrame(y_rgb)
embedding["b"] = pd.DataFrame(z_rgb)
embedding['description'] = df.description

#export to csv
embedding.to_csv("output.csv", encoding="utf_8")

Visualisation sur une carte

――Si quelqu'un sait, merci de me faire savoir s'il existe un moyen d'exprimer la valeur RVB dans les informations d'attribut comme dans QGIS.

Points à garder à l'esprit et problèmes futurs

―― En gros, si le contenu parlé (tendance d'apparence des mots, sujet, etc.) est proche, le vecteur du document apparaîtra à une courte distance sous forme de vecteur, donc si vous le convertissez en couleur, une ville avec des nuances similaires Je pense que l'on peut juger que le contenu dit est similaire. Veuillez noter que s'il y a un contre-poinçon, nous serons heureux de l'accepter.

――Comme cette couleur montre la relation relative entre les régions, la couleur changera chaque fois que vous analyserez en changeant la valeur initiale. Il est difficile à utiliser dans des cas tels que «effectuer ce travail chaque année et suivre les changements au fil du temps», je voudrais donc trouver une solution à ce problème.

«Nous utilisons des documents d'urbanisme à titre d'essai cette fois, mais non seulement il n'est pas encore possible de couvrir toutes les villes, villages et villages, mais c'est un sentiment général que ceux-ci représentent des« caractéristiques de la ville »avant cela. Je pense qu'il y a un écart avec. Finalement, je pense qu'il serait intéressant de créer quelque chose qui reflète les voix des touristes et les enregistrements de discussion des ateliers communautaires.

Recommended Posts

Visualisez la "couleur régionale" de la ville en appliquant la vectorisation des documents
Visualisez le vocabulaire caractéristique d'un document avec D3.js
Visualisez la trajectoire de Hayabusa 2
Visualisez l'état de la réponse du recensement national 2020
Apprenez les bases de la classification de documents par traitement du langage naturel, modèle de sujet
[Python] Visualisez les informations acquises par Wireshark
Visualisez la valeur limite du perceptron multicouche
Visualisez les effets de l'apprentissage profond / de la régularisation
Pandas du débutant, par le débutant, pour le débutant [Python]
Visualisez les données d'exportation du journal Piyo