[PYTHON] Hauptkomponentenanalyse mit Livedoor News Corpus --Practice--

Über diesen Artikel

Verwenden Sie den Livedoor News Corpus, um die Hauptkomponentenanalyse von Textdaten in Frage zu stellen. Letztes Mal wurde der Text als Vorbereitung vor der Analyse in morphologische Elemente zerlegt und in tabellarischer Form zusammengefasst.

Wir werden diese Tabelle verwenden, um eine Hauptkomponentenanalyse durchzuführen. Selbst wenn es viele gewichtete Wörter gibt, ist es schwierig, daher werde ich mich auf die fünf häufigsten Wörter für die allgemeine Nomenklatur und Artikelklassifizierung beschränken.

Sie können sich auch auf den folgenden Code beziehen. https://github.com/torahirod/TextDataPCA

Überprüfen Sie zunächst die fünf am häufigsten verwendeten Wörter für jede Artikelkategorie.

Überprüfen Sie die 5 häufigsten Wörter für jede Artikelkategorie

python


import pandas as pd
import numpy as np

#Lesen Sie zur Vorbereitung die in einer Datei gesammelten Textdaten
df = pd.read_csv('c:/temp/livedoor_corpus.csv')

#Teilwörter werden auf die allgemeine Nomenklatur eingegrenzt
df = df[df['Teil'].str.startswith('Substantiv,Allgemeines')].reset_index(drop=True)

#Aggregieren Sie die Häufigkeit des Auftretens von Wörtern für jede Artikelkategorie
gdf = pd.crosstab([df['Artikelklassifizierung'],df['Wort'],df['Teil']],
                  'Nummer',
                  aggfunc='count',
                  values=df['Wort']
                 ).reset_index()

#Rangfolge nach absteigender Häufigkeit des Auftretens von Wörtern für jede Artikelkategorie
gdf['Rangfolge'] = gdf.groupby(['Artikelklassifizierung'])['Nummer'].rank('dense', ascending=False)
gdf.sort_values(['Artikelklassifizierung','Rangfolge'], inplace=True)

#Grenzen Sie die fünf am häufigsten verwendeten Wörter nach Artikelklassifizierung ein
gdf = gdf[gdf['Rangfolge'] <= 5]

#Überprüfen Sie die 5 häufigsten Wörter für jede Artikelkategorie
for k in gdf['Artikelklassifizierung'].unique():
    display(gdf[gdf['Artikelklassifizierung']==k])

** ・ Dokujotsushin ** image.png Die Wörter "weiblich" und "weiblich" werden hoch eingestuft, weil sie "deutsche Kommunikation" genannt werden.

** ・ it-life-hack ** image.png In IT-Life-Hacks scheinen Wörter wie "Menschen" und "Apps" sicherlich von hoher Relevanz zu sein. Was ist ein "Produkt"? Es kann so etwas wie ein Gerät sein.

** ・ Kanen-chan e l ** image.png Im Haushaltsgerätekanal werden häufig Wörter wie "Thema", "Verkaufen" und "Video" angezeigt. Was ist eine "Person"? Es ist ein wenig seltsam, dass es häufig in der Artikelklassifizierung des Haushaltsgerätekanals erscheint.

** ・ livingoor-homme ** image.png Live Door-Om ist ein Artikel für Männer. Ist "Golf" ein Gentleman-Geschmack? Interessant ist auch, dass das "Jahreseinkommen" unter den Top 5 liegt.

** ・ Film eingeben ** image.png Wie der Name schon sagt, haben Wörter wie "Film" und "Arbeit" in Filmen und Unterhaltung einen hohen Stellenwert.

** ・ pfirsichfarben ** image.png Dies ist auch ein Artikel für Frauen. Es scheint schwierig, es von der deutschen Kommunikation zu trennen.

** ・ smax ** image.png Esmax scheint ein Artikel zu Smartphones und Mobilgeräten zu sein. Es scheint einige IT-Life-Hack- und Content-Coverage zu geben.

** ・ Sportuhr ** image.png Sportuhren sind wie "Spieler", "Fußball" und "Baseball". Ich weiß nicht, was das "T" ist. Ich werde später überprüfen, wie der Satz aussieht.

** ・ Topic-News ** image.png Topic News war ein Bild des Umgangs mit verschiedenen Artikeln, aber es kann viele Artikel geben, die die öffentliche Reaktion auf die Nachrichten mit Worten wie "net", "bulletin board" und "voice" beschreiben.

Überprüfen Sie die umgebenden Sätze des Wortes, das Ihnen wichtig ist

Früher hatte ich mir Sorgen gemacht, dass Wörter, die in der Sportuhr nichts miteinander zu tun zu haben schienen, an die Spitze kamen. Lassen Sie uns das überprüfen.

#Stellen Sie das Wort ein, das Sie interessiert
word = 'T'

df = pd.read_csv('c:/temp/livedoor_corpus.csv')

#Holen Sie sich die Erscheinungsposition des Wortes, an dem Sie interessiert sind
idxes = df[(df['Wort'] == word)
          &(df['Teil'].str.startswith('Substantiv,Allgemeines'))].index.values.tolist()

#Fenstergröße (Festlegen, wie viele Wörter vor und nach dem Wort, an dem Sie interessiert sind)
ws = 20

#Holen Sie sich die umgebenden Sätze des Wortes, das Sie interessiert
l = []
for i, r in df.loc[idxes, :].iterrows():
    s = i - ws
    e = i + ws
    tmp = df.loc[s:e, :]
    tmp = tmp[tmp['Dateiname']==r['Dateiname']]
    lm = list(map(str, tmp['Wort'].values.tolist()))
    ss = ''.join(lm)
    l.append([r['Artikelklassifizierung'],r['Dateiname'],r['Wort'],ss])
rdf = pd.DataFrame(np.array(l))
rdf.columns = ['Artikelklassifizierung','Dateiname','Wort','Wort周辺文']

rdf.head(5)

image.png Anscheinend ist der einzelne Buchstabe "T" ein Teil der URL, die die Zeit darstellt. Wenn Sie die URL ausschließen, ändern sich wahrscheinlich das 4. bis 5. Wort. Überprüfen Sie daher nach dem Ausschließen der URL die Top 5 erneut.

Verarbeitung von Textdaten

Ändern Sie den Vorbereitungscode ein wenig, entfernen Sie Leerzeichen, Zeilenumbrüche und URLs und aggregieren Sie dann die Morphologie für jede Datei. Um die URL zu entfernen, schauen Sie sich das Ergebnis des Satzes um das Wort an, und es scheint, dass der Typ der URL bis zu einem gewissen Grad festgelegt ist. Daher werde ich versuchen, ihn mit einem groben Standard auszuschließen. Es ist kein schöner Prozess, der den URL-Teil vollständig entfernt.

import pandas as pd
import numpy as np
import pathlib
import glob
import re

from janome.tokenizer import Tokenizer
tnz = Tokenizer()

pth = pathlib.Path('c:/temp/text')

l = []
for p in pth.glob('**/*.txt') :
    #Überspringen außer Artikeldaten
    if p.name in ['CHANGES.txt','README.txt','LICENSE.txt']:
        continue
    
    #Öffnen Sie die Artikeldaten und analysieren Sie die Morphologie mit janome ⇒ In der Liste in Form von 1 Wort pro Zeile
    with open(p,'r',encoding='utf-8-sig') as f :
        s = f.read()
        s = s.replace(' ', '')
        s = s.replace(' ', '')
        s = s.replace('\n', '')
        s = re.sub(r'http://.*\+[0-9]{4}', '', s)
        #Entfernen Sie Leerzeichen, Zeilenumbrüche und URLs
        l.extend([[p.parent.name, p.name, t.surface, t.part_of_speech] for t in tnz.tokenize(s)])

#Liste in Datenrahmen konvertieren
df = pd.DataFrame(np.array(l))

#Geben Sie den Spaltennamen an
df.columns = ['Artikelklassifizierung','Dateiname','Wort','Teil']

#CSV-Ausgabedatenrahmen
df.to_csv('c:/temp/livedoor_corpus.csv', index=False)

Bestätigen Sie die Top 5 häufig verwendeten Wörter in Sports Watch erneut

** ・ Sportuhr ** image.png Im Vergleich zu vor der Verarbeitung haben sich das 4. bis 5. Wort geändert. "Team" scheint mit Sport zu tun zu haben.

Wir konnten die 5 am häufigsten verwendeten Wörter für jede Artikelkategorie bestätigen. Wir werden die Hauptkomponentenanalyse mit diesen als Gewichten durchführen.

Hauptkomponentenanalyse (2D)

#Enthält die fünf am häufigsten verwendeten Wörter für jede in der oberen Zelle erfasste Artikelkategorie als Liste
words = gdf['Wort'].unique().tolist()

df = pd.read_csv('c:/temp/livedoor_corpus.csv')
df = df[df['Teil'].str.startswith('Substantiv,Allgemeines')].reset_index(drop=True)
df = df[df['Wort'].isin(words)]

#Holen Sie sich eine Kreuztabelle der 5 häufigsten Wörter nach Datei- und Artikelklassifizierung
xdf = pd.crosstab([df['Artikelklassifizierung'],df['Dateiname']],df['Wort']).reset_index()
#Als Liste für die spätere Ausgabe als Faktorladelabel aufbewahren
cls = xdf.columns.values.tolist()[2:]

#Jeder Artikelklassifizierung wird eine Klassifizierungsnummer für die spätere grafische Anzeige zugewiesen.
ul = xdf['Artikelklassifizierung'].unique()
def _fnc(x):
    return ul.tolist().index(x)
xdf['Klassennummer'] = xdf['Artikelklassifizierung'].apply(lambda x : _fnc(x))

#Vorbereitung zum Auffinden der Hauptkomponente
data = xdf.values
labels = data[:,0]
d = data[:, 2:-1].astype(np.int64)
k = data[:, -1].astype(np.int64)

#Datenstandardisierung * Die Standardabweichung wird durch unverzerrte Standardabweichung berechnet
X = (d - d.mean(axis=0)) / d.std(ddof=1,axis=0)

#Finden Sie die Korrelationsmatrix
XX = np.round(np.dot(X.T,X) / (len(X) - 1), 2)

#Finden Sie den Eigenwert und den Eigenwertvektor der Korrelationsmatrix
w, V = np.linalg.eig(XX)

#Finden Sie die erste Hauptkomponente
z1 = np.dot(X,V[:,0])

#Finden Sie die zweite Hauptkomponente
z2 = np.dot(X,V[:,1])

#Objekte für Diagramme generieren
fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(111)

#Gitterlinien einfügen
ax.grid()

#Grenze der zu zeichnenden Daten
lim = [-10.0, 10.0]
ax.set_xlim(lim)
ax.set_ylim(lim)

#Bringen Sie die linke und untere Achse in die Mitte
ax.spines['bottom'].set_position(('axes', 0.5))
ax.spines['left'].set_position(('axes', 0.5))
#Löschen Sie die rechte und obere Achse
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

#Passen Sie den Abstand der Achsenskalen an
ticks = np.arange(-10.0, 10.0, 1.0)
ax.set_xticks(ticks)
ax.set_yticks(ticks)

#Achsenbeschriftung hinzufügen, Position anpassen
ax.set_xlabel('Z1', fontsize=16)
ax.set_ylabel('Z2', fontsize=16, rotation=0)
ax.xaxis.set_label_coords(1.02, 0.49)
ax.yaxis.set_label_coords(0.5, 1.02)

from matplotlib.colors import ListedColormap
colors = ['red','blue','gold','olive','green','dodgerblue','brown','black','grey']
cmap = ListedColormap(colors)
a = np.array(list(zip(z1,z2,k,labels)))
df = pd.DataFrame({'z1':pd.Series(z1, dtype='float'),
                   'z2':pd.Series(z2, dtype='float'),
                   'k':pd.Series(k, dtype='int'),
                   'labels':pd.Series(labels, dtype='str'),
                  })

#Plotten Sie mit verschiedenen Farben für jede Artikelkategorie
for l in df['labels'].unique():
    d = df[df['labels']==l]
    ax.scatter(d['z1'],d['z2'],c=cmap(d['k']),label=l)
    ax.legend()

#Zeichnung
plt.show()

image.png Wenn man die Ergebnisse betrachtet, werden die Punkte abhängig von der Artikelklassifizierung an engen Positionen gesammelt, aber es gibt viele überlappende Punkte, und es ist schwierig, die Grenzen für jede Artikelklassifizierung zu verstehen.

Als nächstes überprüfen wir die Faktorbelastung.

#Koordinaten mit dem Eigenvektor, der dem größten Eigenwert auf der horizontalen Achse entspricht, und dem Eigenvektor, der dem vorletzten Eigenwert auf der vertikalen Achse entspricht.
V_ = np.array([(V[:,0]),V[:,1]]).T
V_ = np.round(V_,2)

#Daten für die Grafikzeichnung
z1 = V_[:,0]
z2 = V_[:,1]

#Objekte für Diagramme generieren
fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(111)

#Gitterlinien einfügen
ax.grid()

#Grenze der zu zeichnenden Daten
lim = [-0.4, 0.4]
ax.set_xlim(lim)
ax.set_ylim(lim)

#Bringen Sie die linke und untere Achse in die Mitte
ax.spines['bottom'].set_position(('axes', 0.5))
ax.spines['left'].set_position(('axes', 0.5))
#Löschen Sie die rechte und obere Achse
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

#Passen Sie den Abstand der Achsenskalen an
ticks = np.arange(-0.4, 0.4, 0.05)
ax.set_xticks(ticks)
ax.set_yticks(ticks)

#Achsenbeschriftung hinzufügen, Position anpassen
ax.set_xlabel('Z1', fontsize=16)
ax.set_ylabel('Z2', fontsize=16, rotation=0)
ax.xaxis.set_label_coords(1.02, 0.49)
ax.yaxis.set_label_coords(0.5, 1.02)

#Datenplot
for (i,j,k) in zip(z1,z2,cls):
    ax.plot(i,j,'o')
    ax.annotate(k, xy=(i, j),fontsize=10)
    
#Zeichnung
plt.show()

image.png Verglichen mit dem Ergebnis der Hauptkomponentenanalyse zuvor scheint das Wort, das sich auf die Artikelklassifizierung bezieht, auf die Gruppe jeder Artikelklassifizierung und die ähnliche Position zu kommen.

Hauptkomponentenanalyse (3D)

#Enthält die fünf am häufigsten verwendeten Wörter für jede in der oberen Zelle erfasste Artikelkategorie als Liste
words = gdf['Wort'].unique().tolist()

df = pd.read_csv('c:/temp/livedoor_corpus.csv')
df = df[df['Teil'].str.startswith('Substantiv,Allgemeines')].reset_index(drop=True)
df = df[df['Wort'].isin(words)]

#Holen Sie sich eine Kreuztabelle der 5 häufigsten Wörter nach Datei- und Artikelklassifizierung
xdf = pd.crosstab([df['Artikelklassifizierung'],df['Dateiname']],df['Wort']).reset_index()
#Als Liste für die spätere Ausgabe als Faktorladelabel aufbewahren
cls = xdf.columns.values.tolist()[2:]

#Jeder Artikelklassifizierung wird eine Klassifizierungsnummer für die spätere grafische Anzeige zugewiesen.
ul = xdf['Artikelklassifizierung'].unique()
def _fnc(x):
    return ul.tolist().index(x)
xdf['Klassennummer'] = xdf['Artikelklassifizierung'].apply(lambda x : _fnc(x))

#Vorbereitung zum Auffinden der Hauptkomponente
data = xdf.values
labels = data[:,0]
d = data[:, 2:-1].astype(np.int64)
k = data[:, -1].astype(np.int64)

#Datenstandardisierung * Die Standardabweichung wird durch unverzerrte Standardabweichung berechnet
X = (d - d.mean(axis=0)) / d.std(ddof=1,axis=0)

#Finden Sie die Korrelationsmatrix
XX = np.round(np.dot(X.T,X) / (len(X) - 1), 2)

#Finden Sie den Eigenwert und den Eigenwertvektor der Korrelationsmatrix
w, V = np.linalg.eig(XX)

#Finden Sie die erste Hauptkomponente
z1 = np.dot(X,V[:,0])

#Finden Sie die zweite Hauptkomponente
z2 = np.dot(X,V[:,1])

#Finden Sie die dritte Hauptkomponente
z3 = np.dot(X,V[:,2])

#Objekte für Diagramme generieren
fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(111, projection='3d')

#Gitterlinien einfügen
ax.grid()

#Grenze der zu zeichnenden Daten
lim = [-10.0, 10.0]
ax.set_xlim(lim)
ax.set_ylim(lim)

#Bringen Sie die linke und untere Achse in die Mitte
ax.spines['bottom'].set_position(('axes', 0.5))
ax.spines['left'].set_position(('axes', 0.5))
#Löschen Sie die rechte und obere Achse
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

#Passen Sie den Abstand der Achsenskalen an
ticks = np.arange(-10.0, 10.0, 1.0)
ax.set_xticks(ticks)
ax.set_yticks(ticks)

#Achsenbeschriftung hinzufügen, Position anpassen
ax.set_xlabel('Z1', fontsize=16)
ax.set_ylabel('Z2', fontsize=16, rotation=0)
ax.xaxis.set_label_coords(1.02, 0.49)
ax.yaxis.set_label_coords(0.5, 1.02)

from matplotlib.colors import ListedColormap
colors = ['red','blue','gold','olive','green','dodgerblue','brown','black','grey']
cmap = ListedColormap(colors)

a = np.array(list(zip(z1,z2,z3,k,labels)))
df = pd.DataFrame({'z1':pd.Series(z1, dtype='float'),
                   'z2':pd.Series(z2, dtype='float'),
                   'z3':pd.Series(z3, dtype='float'),
                   'k':pd.Series(k, dtype='int'),
                   'labels':pd.Series(labels, dtype='str'),
                  })

for l in df['labels'].unique():
    d = df[df['labels']==l]
    ax.scatter(d['z1'],d['z2'],d['z3'],c=cmap(d['k']),label=l)
    ax.legend()

#Zeichnung
plt.show()

image.png

Selbst wenn Sie es in drei Dimensionen betrachten, überlappt sich jeder Punkt immer noch, und es scheint schwierig zu sein, eine saubere Grenzlinie zu zeichnen. Da Sie das Diagramm jedoch drehen können, ist es interessant, es durch Drehen zu sehen.

image.png Ich drehte es um.

Faktor laden (3D)

#Koordinaten mit dem Eigenvektor, der dem größten Eigenwert auf der horizontalen Achse entspricht, und dem Eigenvektor, der dem vorletzten Eigenwert auf der vertikalen Achse entspricht.
V_ = np.array([(V[:,0]),V[:,1],V[:,2]]).T
V_ = np.round(V_,2)

#Daten für die Grafikzeichnung
z1 = V_[:,0]
z2 = V_[:,1]
z3 = V_[:,2]

#Objekte für Diagramme generieren
fig = plt.figure(figsize=(10, 6))
ax = fig.add_subplot(111, projection='3d')

#Gitterlinien einfügen
ax.grid()

#Grenze der zu zeichnenden Daten
lim = [-0.4, 0.4]
ax.set_xlim(lim)
ax.set_ylim(lim)

#Bringen Sie die linke und untere Achse in die Mitte
ax.spines['bottom'].set_position(('axes', 0.5))
ax.spines['left'].set_position(('axes', 0.5))
#Löschen Sie die rechte und obere Achse
ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False)

#Passen Sie den Abstand der Achsenskalen an
ticks = np.arange(-0.4, 0.4, 0.05)
ax.set_xticks(ticks)
ax.set_yticks(ticks)

#Achsenbeschriftung hinzufügen, Position anpassen
ax.set_xlabel('Z1', fontsize=16)
ax.set_ylabel('Z2', fontsize=16)
ax.set_zlabel('Z3', fontsize=16)

ax.xaxis.set_label_coords(1.02, 0.49)
ax.yaxis.set_label_coords(0.5, 1.02)

#Datenplot
for zdir, x, y, z in zip(cls, z1, z2, z3):
    ax.scatter(x, y, z)
    ax.text(x, y, z, zdir)

#Zeichnung
plt.show()

image.png

Quellcode

https://github.com/torahirod/TextDataPCA

Impressionen

Es war interessant, einen bestimmten Grad an Kohäsion visuell bestätigen zu können, indem nur die Hauptkomponenten anhand der fünf häufigsten Wörter für jede Artikelklassifizierung analysiert wurden.

Es kann auch interessant sein, Folgendes zu versuchen und die Ergebnisse zu sehen.

・ Erweitern Sie zu Top10. ・ Schließen Sie Wörter aus, die in den Top5 in mehreren Artikelkategorien enthalten sind. ・ Probieren Sie Top 5 mit Funktionen wie TF-IDF anstelle von Top 5 mit einfacher Häufigkeit.

Von hier aus möchte ich die Klassifizierung von Dokumenten herausfordern, indem ich mit k-means die Informationen der 2D- und 3D-Koordinaten kombiniere, die durch die Hauptkomponentenanalyse erhalten wurden.

Recommended Posts

Hauptkomponentenanalyse mit Livedoor News Corpus --Practice--
Hauptkomponentenanalyse mit Livedoor News Corpus - Vorbereitung--
Hauptkomponentenanalyse mit Spark ML
Dies und das der Hauptkomponentenanalyse
Hauptkomponentenanalyse (Hauptkomponentenanalyse: PCA)
Dimensionskomprimierung durch Selbstcodierer- und Hauptkomponentenanalyse
Ich habe versucht, die Hauptkomponenten mit Titanic-Daten zu analysieren!
Koordinierte Filterung mit Hauptkomponentenanalyse und K-Mittel-Clustering
Fordern Sie die Hauptkomponentenanalyse von Textdaten mit Python heraus
Lernen ohne Lehrer 3 Hauptkomponentenanalyse
Hauptkomponentenanalyse mit Python von nim mit nimpy
Hauptkomponentenanalyse zum Anfassen mit PyCaret [Normalisierung + Visualisierung (grafisch)] Memo
Gesichtserkennung mit Hauptkomponentenanalyse
<Kurs> Maschinelles Lernen Kapitel 4: Hauptkomponentenanalyse
PRML Kapitel 12 Bayesianische Hauptanalyse Python-Implementierung
Beginnen wir mit der multivariaten Analyse und der Hauptkomponentenanalyse mit Pokemon! Zusammenarbeit zwischen R und Tableau
2. Multivariate Analyse in Python 3-2. Hauptkomponentenanalyse (Algorithmus)
Mathematisches Verständnis der Hauptkomponentenanalyse von Anfang an
Clustering und Hauptkomponentenanalyse nach der K-Means-Methode (Anfänger)
Hauptkomponentenanalyse Analysieren Sie handschriftliche Zahlen mit PCA. Teil 2
Hauptkomponentenanalyse (PCA) und unabhängige Komponentenanalyse (ICA) mit Python
Hauptkomponentenanalyse Analysieren Sie handschriftliche Zahlen mit PCA. Teil 1
2. Multivariate Analyse in Python 3-1. Hauptkomponentenanalyse (Scikit-Learn)
Datenanalyse mit Python 2
Korbanalyse mit Spark (1)
Abhängigkeitsanalyse mit CaboCha
Sprachanalyse mit Python
Sprachanalyse mit Python
Dynamische Analyse von Valgrind
Führen Sie eine Regressionsanalyse mit NumPy durch
Datenanalyse mit Python
Coursera-Herausforderungen für maschinelles Lernen in Python: ex7-2 (Primäranalyse)
Visualisieren Sie die Korrelationsmatrix durch Hauptkomponentenanalyse mit Python