[PYTHON] Visualisieren Sie die "regionale Farbe" der Stadt, indem Sie die Vektorisierung von Dokumenten anwenden

Überblick

Durch Anwendung der Dokumentvektorisierungsmethode in der Verarbeitung natürlicher Sprache haben wir eine farbcodierte Karte jeder Region basierend auf den im Text beschriebenen Regionsinformationen erstellt. Insbesondere werden die Ergebnisse der Klassifizierung der Dokumente der Stadtplanung (Instandhaltung, Entwicklung, Naturschutzpolitik: sogenannte Instandhaltung) des Ballungsraums nach dem Themenmodell (LDA) auf der Karte mit RGB-Werten ausgedrückt. sample_20191230.png

Ich denke, dass dies zu einer konzeptionellen Entdeckung führen könnte, dass "dieses Gebiet und dieses Gebiet geografisch getrennt sind, aber die gleichen Eigenschaften wie erwartet aufweisen".

Gegenwärtig sind die Daten nicht vollständig organisiert und die Zähne fehlen. Beispielsweise ist die Präfektur Ibaraki häufig lila, während die Präfekturen Chiba und Saitama meist grün und braun sind. Aber auch in Saitama zeigt die Westseite wie Chichibu eine Farbe, die der der Präfektur Ibaraki nahe kommt. Auch Kimitsu und Tokorozawa sind überraschend nah. Es ist ein Rätsel, warum das Zentrum von Saitama City (Omiya) auch lila ist usw. Mit zunehmender Anzahl von Daten kann sich das Genauigkeitsgefühl verbessern.

Originale Daten

Wir haben die Stadtplanungsdokumente für Chiba, Saitama und Ibaraki von Links zum Masterplan für Stadtplanung des Ministeriums für Land, Infrastruktur, Verkehr und Tourismus repariert. Es werden jedoch nicht alle Bereiche abgedeckt und sind nur Beispiele. Ich habe einen solchen Datensatz (CSV-Format) als Eingabe erstellt.

name description
1 Ryugasaki / Ushihisa Ryugasaki / Ushiku-Stadtplanung (Ryugasaki-Stadt, Ushiku-Stadt, Tonstadt) - Stärkung der Zusammenarbeit zwischen benachbarten Städten im Stadtplanungsgebiet, Koexistenz mit reichlich vorhandener Natur und ländlicher Umgebung, während sie zusammenarbeiten und zusammenleben Es wurde (weggelassen))
2 Iino City Iino City Planning (Iino City) Ziel ist die Verwirklichung einer kohlenstoffarmen Gesellschaft durch Förderung der Nutzung öffentlicher Verkehrsmittel und Schaffung von Grünflächen im Stadtplanungsgebiet. Einzigartige Entwicklung der Region ~ (weggelassen)

Dokumentvektorisierung

――Der tatsächlich erstellte Code lautet wie folgt. MeCab wird für die morphologische Analyse verwendet, Gensim wird für die Vektorisierung nach Themenmodellen verwendet und Scikit-Learn wird für die Dimensionsreduktion durch TSNE verwendet. Es mag viele Verbesserungen geben, aber ich möchte diese Bereiche nach Bedarf korrigieren.

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 ["Substantiv", "Verb", "Adjektiv"]: #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")

Visualisierung auf einer Karte

――Wenn jemand weiß, lassen Sie mich bitte wissen, ob es eine Möglichkeit gibt, den RGB-Wert in den Attributinformationen wie in QGIS auszudrücken.

Zu beachtende Punkte und zukünftige Probleme

―― Wenn der gesprochene Inhalt (Tendenz zum Auftreten von Wörtern, Thema usw.) nahe beieinander liegt, wird der Dokumentvektor in kurzer Entfernung als Vektor angezeigt. Wenn Sie ihn also in Farbe konvertieren, eine Stadt mit ähnlichen Schattierungen Ich denke, es kann beurteilt werden, dass der Inhalt, der erzählt wird, ähnlich ist. Bitte weisen Sie darauf hin, dass wir einen Gegenschlag gerne annehmen.

――Da diese Farbe die relative Beziehung zwischen Regionen anzeigt, ändert sich die Farbe jedes Mal, wenn Sie analysieren, indem Sie den Anfangswert ändern. Es ist schwierig, in Fällen wie "diese Arbeit jedes Jahr durchführen und Änderungen im Laufe der Zeit verfolgen" zu verwenden, daher würde ich gerne eine Lösung dafür finden.

――Wir verwenden diesmal Stadtplanungsdokumente probeweise, aber es ist nicht nur noch nicht möglich, alle Städte und Dörfer abzudecken, sondern es besteht allgemein das Gefühl, dass diese vorher "Merkmale der Stadt" darstellen. Ich denke, es gibt eine Lücke mit. Letztendlich denke ich, dass es interessant wäre, etwas zu schaffen, das die Stimmen der Touristen und die Diskussionsaufzeichnungen von Workshops auf Gemeindeebene widerspiegelt.

Recommended Posts

Visualisieren Sie die "regionale Farbe" der Stadt, indem Sie die Vektorisierung von Dokumenten anwenden
Visualisieren Sie das charakteristische Vokabular eines Dokuments mit D3.js.
Visualisieren Sie die Flugbahn von Hayabusa 2
Visualisieren Sie den Antwortstatus der Volkszählung 2020
Lernen Sie die Grundlagen der Dokumentklassifizierung durch Verarbeitung natürlicher Sprache, Themenmodell
[Python] Visualisieren Sie die von Wireshark erfassten Informationen
Visualisieren Sie den Grenzwert des mehrschichtigen Perzeptrons
Visualisieren Sie die Auswirkungen von Deep Learning / Regularisierung
Pandas des Anfängers, vom Anfänger, für den Anfänger [Python]
Visualisieren Sie die Exportdaten des Piyo-Protokolls