[PYTHON] Klassifizieren Sie Artikel mit Tags, die von Qiita durch unbeaufsichtigtes Lernen angegeben wurden

Einführung

Dieses Mal klassifizieren wir die Artikeldaten des angegebenen Tags durch unbeaufsichtigtes Lernen (k-means-Methode).

In diesem Artikel erfahren Sie, wie Sie die Artikeldaten des angegebenen Tags abrufen.

・ So erhalten Sie Artikeldaten mithilfe der Qiita-API https://qiita.com/wakudar/items/8c594c8cc7bda9b93b4e

Programmablauf

  1. Lesen und Klassifizieren von Artikeldaten (separates Schreiben)
  2. Vektorisierung von Artikeldaten durch TF-IDF
  3. Clustering nach der k-means-Methode
  4. Visualisierung der Ergebnisse
  5. Finden Sie die meisten Klassifizierungsergebnisse und geben Sie falsch klassifizierte Artikeldaten aus

1. Artikeldaten lesen und klassifizieren

#Teilen
def wakatigaki(text):
    mecab = MeCab.Tagger()
    mecab_result = mecab.parse(text).replace("EOS", "").split('\n')
    mecab_result = [i.replace("#", "").replace("\"", "").replace("\'", "").replace("\t", "_").replace(",","_").split("_") for i in mecab_result if i != ""]
    return mecab_result

#Laden und Klassifizieren von Artikeldaten
def load_article():
    category = ["Vagrant", "iOS", "numpy"]
    category_num = [0, 1, 2]
    docs  = []
    labels = []
    labels_num = []

    for c_name, c_num in zip(category, category_num):
        files = glob.glob("./qiita/{c_name}/*.txt".format(c_name=c_name))

        text = ""
        for file in files:
            with open(file, "r", encoding="utf-8") as f:
                lines = f.read().splitlines()
                body = "".join(lines[0:]).replace('\u3000', '')
                text = body
                text = " ".join([w[0] for w in wakatigaki(text)])

            docs.append(text)
            labels.append(c_name)
            labels_num.append(c_num)
    return docs, labels, category

#Laden und Klassifizieren von Artikeldaten
docs, labels, category = load_article()

Artikeldaten werden in Form von qiita / tag name / ------. Txt gespeichert. Dieses Mal werden wir die Kategorien der drei im Voraus gespeicherten Tags "Vagrant", "iOS" und "numpy" schätzen.

2. Vektorisierung von Sätzen durch TF-IDF

# TF-Generieren Sie einen Vektordarstellungskonverter mit IDF
vectorizer = TfidfVectorizer()
#Vektorkonvertierung von Dokumenten
vecs = vectorizer.fit_transform(docs)

3. Implementierung der k-means-Methode

# k-Implementieren Sie die Mittelmethode
kmeans_model = KMeans(n_clusters=n_cluster, random_state=0).fit(vecs)
#Speichert Clustering-Ergebnisbezeichnungen
predict_labels = kmeans_model.labels_

4. Visualisierung der Ergebnisse

#Ergebnisse aggregieren und visualisieren
res = {
    0:{},
    1:{},
    2:{}
}

#Speicherung und Anzeige der Ergebnisse
for pre_label, r_label in zip(predict_labels, labels):
    #Was tun, wenn ein Wert vorhanden ist?
    try:
        res[pre_label][r_label] += 1
    #Ausnahmebehandlung
    except:
        res[pre_label][r_label] = 1

#Ergebnisausgabe
for i in range(n_cluster):
    print(res[i])

5. Suchen Sie die Mehrheitskategorie des Klassifizierungsergebnisses und geben Sie die falsch klassifizierten Artikeldaten aus

Finden Sie die Mehrheit jedes Etiketts

#Hauptkategoriename Haupt_cat
major_cat = []
#Elementnummer des Namens der Mehrheitskategorie
major_num = []
for i in range(n_cluster):
    major_cat.append(max(res[i], key=res[i].get))
    major_num.append(category.index(major_cat[i]))

Generiert Kategorielabels angepasst_Labels basierend auf der Mehrheit

adjusted_labels = []
#Anzahl der Artikel in jeder Kategorie
article_num = [900, 900, 900]
for i in range(n_cluster):
    adjusted_labels.extend([major_num[i]] * article_num[i])

Vergleich der Änderungen der Kennzeichnungsergebnisse

#txt Dateiname Variable cnt
cnt = 0
#Wenn die Beschriftungen vor und nach dem Clustering unterschiedlich sind, wird der Inhalt des Artikels ausgegeben.
for label1, label2 in zip(adjusted_labels, predict_labels):
    cnt += 1
    if label1 == label2:
        pass
    else:
        path_w = "./result/" + str(label1) + "-" + str(label2) + "/" + str(cnt) + ".txt"
        #Dateinamenpfad_Ausgabe von w
        with open(path_w, mode='w') as f:
            f.write(docs[cnt])

Ergebnis

{'Vagrant': 108, 'iOS': 900, 'numpy': 333}
{'Vagrant': 792}
{'numpy': 567}

Die richtige Antwortrate für jedes Tag ist iOS: ungefähr 67% Landstreicher: Ungefähr 88% Anzahl: ca. 63% Das Ergebnis war das.

Überlegung / Zusammenfassung

Diesmal war es nicht sehr genau ... Da es mit einem Programm ausgeführt wird, das fast dem für das Livedoor-Nachrichtenkorpus verwendeten Programm entspricht, ist es möglich, dass der Quellcodeteil vieler Programme in Qiita Auswirkungen darauf hat. Ich denke, dass es in Zukunft notwendig sein wird, Methoden wie das Klassifizieren nach verschiedenen Lernmethoden in Betracht zu ziehen, um die Genauigkeit zu verbessern. Deshalb würde ich es gerne versuchen, wenn ich Zeit habe!

Anderer Einfallsreichtum

・ Dieses Mal haben wir mehrere Tags durchsucht, damit sich die Tags nicht überlappen, und die drei Tags mit der geringsten Überlappung ausgewählt. (Vagrant, iOS, numpy)

・ Ich habe einmal versucht, mit Android- und iOS-Tags zu klassifizieren, aber die Ergebnisse waren enttäuschend. Ich denke, es gab viele Artikel mit zwei Tags in Bezug auf die Smartphone-Entwicklung.

Referenz

・ Unüberwachte Satzklassifizierung (Satzclustering) [Python] https://appswingby.com/2019/08/15/python%E6%95%99%E5%B8%AB%E3%81%AA%E3%81%97%E6%96%87%E7%AB%A0%E5%88%86%E9%A1%9E%EF%BC%88%E6%96%87%E7%AB%A0%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E3%83%AA%E3%83%B3%E3%82%B0%EF%BC%89/

・ Qiita-Tag-Liste https://qiita.com/tags

・ Artikel mit dem Tag "iOS" und dem Tag "Vagrant" https://qiita.com/search?q=tag%3A+iOS+tag%3AVagrant

Recommended Posts

Klassifizieren Sie Artikel mit Tags, die von Qiita durch unbeaufsichtigtes Lernen angegeben wurden
Klassifizieren Sie Mnist-Zahlen nach Keras, ohne dass der Lehrer etwas lernt [Auto Encoder Edition]
Klassifizieren Sie Anime-Gesichter durch Fortsetzung / Deep Learning mit Keras
Kategorisieren Sie Nachrichtenartikel mit Deep Learning
Ich habe versucht, die Anzahl der Mnisten durch unbeaufsichtigtes Lernen zu klassifizieren [PCA, t-SNE, k-means]
Klassifizieren Sie Anime-Gesichter mit tiefem Lernen mit Chainer
Holen Sie sich eine Liste der Artikel, die von Benutzern mit Python 3 Qiita API v2 veröffentlicht wurden
Stock Number Ranking von Qiita Tag mit Python
Klassifizieren Sie Qiita-Posts ohne morphologische Analyse mit Tweet2Vec
Tiefes Lernen durch Implementierung gelernt ~ Erkennung von Abnormalitäten (Lernen ohne Lehrer) ~
99,78% Genauigkeit bei tiefem Lernen durch Erkennen von handgeschriebenem Hiragana
Klassifizieren Sie Informationen zum maschinellen Lernen nach Themenmodellen