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.
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.
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) |
――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")
Le concept de base consiste à effectuer une «visualisation tridimensionnelle des vecteurs de document» qui est souvent effectuée dans le traitement du langage naturel, et à convertir les vecteurs tridimensionnels (valeurs x, y, z) en valeurs RVB.
Cette fois, nous avons adopté le [Topic Model](https://qiita.com/tags/Topic Model) pour vectoriser les documents. La raison en est que dans d'autres méthodes de vectorisation (par exemple, basées sur tf-idf et word2vec), il existe de nombreux cas où la valeur xyz après réduction de dimension a une valeur aberrante et l'effet lors de la conversion en une valeur RVB de 0 à 255 Parce que c'était trop gros. Dans le cas du modèle thématique, je pensais que si les paramètres étaient définis correctement, les valeurs aberrantes ne se produiraient pas facilement et ce problème pourrait être résolu.
――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.
―― 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