[PYTHON] Classer les articles avec des balises spécifiées par Qiita par apprentissage non supervisé

introduction

Cette fois, nous classerons les données d'article de la balise spécifiée par apprentissage non supervisé (méthode k-means).

Veuillez consulter cet article pour savoir comment obtenir les données d'article de la balise spécifiée.

・ Comment obtenir des données d'article à l'aide de l'API Qiita https://qiita.com/wakudar/items/8c594c8cc7bda9b93b4e

Flux de programme

  1. Lecture et classification des données d'articles (rédaction séparée)
  2. Vectorisation des données d'articles par TF-IDF
  3. Clustering par la méthode k-means
  4. Visualisation des résultats
  5. Rechercher la majorité des résultats de classification et générer des données d'articles mal classées

1. Lecture et classification des données d'articles

#Partage
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

#Chargement et classification des données d'article
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

#Chargement et classification des données d'article
docs, labels, category = load_article()

Les données d'article sont enregistrées sous la forme de qiita / nom de tag / ------. Txt. Cette fois, nous allons estimer les catégories des trois balises enregistrées à l'avance, «Vagrant», «iOS» et «numpy».

2. Vectorisation des phrases par TF-IDF

# TF-Générer un convertisseur de représentation vectorielle par IDF
vectorizer = TfidfVectorizer()
#Conversion vectorielle de documents
vecs = vectorizer.fit_transform(docs)

3. Application de la méthode des k-moyennes

# k-Mettre en œuvre la méthode des moyens
kmeans_model = KMeans(n_clusters=n_cluster, random_state=0).fit(vecs)
#Stocke les étiquettes de résultats de clustering
predict_labels = kmeans_model.labels_

4. Visualisation des résultats

#Agréger et visualiser les résultats
res = {
    0:{},
    1:{},
    2:{}
}

#Stockage et affichage des résultats
for pre_label, r_label in zip(predict_labels, labels):
    #Que faire s'il y a une valeur
    try:
        res[pre_label][r_label] += 1
    #Gestion des exceptions
    except:
        res[pre_label][r_label] = 1

#Sortie de résultat
for i in range(n_cluster):
    print(res[i])

5. Trouvez la catégorie majoritaire du résultat de la classification et sortez les données d'article mal classées

Trouvez la majorité de chaque étiquette

#Nom de la catégorie principale majeur_cat
major_cat = []
#Numéro d'élément du nom de la catégorie majoritaire
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]))

Génère des libellés de catégorie ajustés_labels basés sur la majorité

adjusted_labels = []
#Nombre d'articles dans chaque catégorie
article_num = [900, 900, 900]
for i in range(n_cluster):
    adjusted_labels.extend([major_num[i]] * article_num[i])

Comparaison des modifications des résultats d'étiquetage

#variable de nom de fichier txt cnt
cnt = 0
#Si les étiquettes avant et après la mise en cluster sont différentes, le contenu de l'article est généré.
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"
        #Chemin du nom de fichier_sortie de w
        with open(path_w, mode='w') as f:
            f.write(docs[cnt])

résultat

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

Le taux de réponse correct pour chaque tag est iOS: environ 67% Vagrant: environ 88% numpy: environ 63% Le résultat était que.

Considération / Résumé

Cette fois, ce n'était pas très précis ... Puisqu'il fonctionne avec un programme qui est presque le même que celui utilisé pour le corpus de nouvelles Livedoor, il est possible que la partie du code source de nombreux programmes de Qiita l'affecte. À l'avenir, je pense qu'il sera nécessaire d'envisager des méthodes telles que la classification par différentes méthodes d'apprentissage afin d'améliorer la précision, alors j'aimerais l'essayer quand j'aurai le temps!

Autre ingéniosité

・ Cette fois, nous avons recherché plusieurs balises afin que les balises ne se chevauchent pas, et avons sélectionné les trois balises avec le moins de chevauchement. (Vagrant, iOS, numpy)

・ J'ai essayé de classer une fois avec les balises Android et iOS, mais les résultats ont été décevants. Je pense qu'il y avait beaucoup d'articles avec deux balises en termes de développement de smartphone.

référence

・ Classification de phrases non supervisée (regroupement de phrases) [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/

・ Liste des balises Qiita https://qiita.com/tags

・ Articles avec à la fois le tag "iOS" et le tag "Vagrant" https://qiita.com/search?q=tag%3A+iOS+tag%3AVagrant

Recommended Posts

Classer les articles avec des balises spécifiées par Qiita par apprentissage non supervisé
Classer les numéros mnist par keras sans apprentissage par l'enseignant [Auto Encoder Edition]
Classer les visages d'anime par suite / apprentissage profond avec Keras
Catégoriser les articles de presse grâce au Deep Learning
J'ai essayé de classer les nombres de mnist par apprentissage non supervisé [PCA, t-SNE, k-means]
Classez les visages d'anime avec l'apprentissage en profondeur avec Chainer
Obtenez une liste d'articles publiés par les utilisateurs avec Python 3 Qiita API v2
Classement des numéros de stock par balise Qiita avec python
Classer les publications Qiita sans analyse morphologique avec Tweet2Vec
Apprentissage profond appris par la mise en œuvre ~ Détection d'anomalies (apprentissage sans enseignant) ~
99,78% de précision avec apprentissage en profondeur en reconnaissant les hiragana manuscrits
Classer les informations liées à l'apprentissage automatique par modèle de sujet