[PYTHON] Versuchen Sie, O'Reillys Bücher durch Clustering zu klassifizieren

Ziel

Holen Sie sich die Buchinformationen von der O'Reilly Japan-Website, Lassen Sie uns Bücher durch nicht hierarchisches Clustering aus den erfassten Informationen klassifizieren. Das Verfahren ist wie folgt. ・ Greifen Sie auf der oberen Seite des Webs auf die detaillierten Informationen des Buches zu Holen Sie sich den Text dieser Einführung in eine Liste ・ Für jedes Buch wird der Text dieser Einführung in Wortebenen zerlegt und jedes Wort gewichtet. ・ Klassifizieren Sie Bücher anhand der oben genannten Informationen durch Clustering Die Sprache verwendet Python.

Holen Sie sich Informationen aus dem Internet

  1. Rufen Sie zunächst alle URLs zur Detailseite des neuen Buches auf der obersten Seite ab. Als Array in allBookLinks speichern.

スクリーンショット 2015-12-05 20.54.17.png

clustering.py


#coding:utf-8

import numpy as np
import mechanize
import MeCab
import util
import re
from bs4 import BeautifulSoup
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
from sklearn.cluster import AffinityPropagation

# get O'Reilly new books from Top page
page = mechanize.Browser()
page.open('http://www.oreilly.co.jp/index.shtml')

response = page.response()
soup = BeautifulSoup(response.read(), "html.parser")

allBookLinks = []
bibloLinks = soup.find_all("p", class_="biblio_link")
for bibloLink in bibloLinks:
    books = bibloLink.find_all("a", href=re.compile("http://www.oreilly.co.jp/books/"))
    for book in books:
        allBookLinks.append( book.get("href") )

  1. Wechseln Sie zur Detailseiten-URL des oben und von der Zielseite erhaltenen Buches Speichern Sie den Titel des Buches in titleList und den Einführungstext in inputDatas. Rufen Sie auch die URL der zugehörigen Buchinformationen ab und fügen Sie der Liste nur eine Ebene hinzu.

スクリーンショット 2015-12-05 21.09.01.png

clustering.py


def get_detail_sentence_list( detailPageLink ):
    page.open( detailPageLink )
    detailResponse = page.response()
    detailSoup = BeautifulSoup( detailResponse.read(), "html.parser" )
    # get title
    titleTag = detailSoup.find("h3", class_="title")
    title = titleTag.get_text().encode('utf-8')
    # get detail
    detailDiv = detailSoup.find("div", id="detail")
    detail = detailDiv.find("p").get_text().encode('utf-8')
    # get relation book links
    relationLinks = detailDiv.find_all("a")
    relationLinkList = []
    for relationLink in relationLinks:
        href = relationLink.get("href")
        if href.find('/books/') > 0:
            relationLinkList.append(href[href.find('/books/') + len('/books/'):])
    return [ title, detail, relationLinkList ]


# crolling books info
titleList = []
inputDatas = []
for bookLink in allBookLinks:
    title, detail, relationLinkList = get_detail_sentence_list( bookLink )
    # save
    if not (title in titleList):
        titleList.append(title)
        inputDatas.append( detail )

    # go to relation book links
    for relationLink in relationLinkList:
        title, detail, relationLinkList = get_detail_sentence_list( 'http://www.oreilly.co.jp/books/' + relationLink )
        # save
        if not (title in titleList):
            titleList.append(title)
            inputDatas.append( detail )

Gewichten Sie den Einführungstext für jedes Buch mit der TF-IDF-Methode

Der Inhalt von X mit TfidfVectorizer ist ・ Len (X) = Anzahl der durchsuchten Bücher ・ Len (X [0]) = Anzahl der Wörter im Einführungstext des Buches -X [0] [0] = 0 TF-IDF-Wert des 0. Wortes (Wort, das in Begriffen [0] gespeichert ist) im 0. Buch Eine solche Prozession. Sie können TF-IDF berechnen, indem Sie Logik erstellen, aber es ist einfacher, diese Bibliothek zu verwenden.

clustering.py


def get_word_list( targetText ):
    tagger = MeCab.Tagger()
    wordList = []
    if len(targetText) > 0:
        node = tagger.parseToNode(targetText)
        while node:
            if len(util.mytrim(node.surface)) > 0:
                wordList.append(node.surface)
            node = node.next
    return wordList

tfidfVectonizer = TfidfVectorizer(analyzer=get_word_list, min_df=1, max_df=50)
X = tfidfVectonizer.fit_transform( inputDatas )
terms = tfidfVectonizer.get_feature_names()

util.py


#coding:utf-8

def mytrim( target ):
    target = target.replace(' ','')
    return target.strip()

Klassifizieren Sie Bücher durch Clustering

Ich habe es sowohl mit K-Mitteln als auch mit Affinitätsausbreitung versucht. K-means wird verwendet, wenn entschieden wird, wie viele Teile zuerst klassifiziert werden sollen. Wenn Sie sich nicht entschieden haben, funktioniert Affinity Propagation ziemlich gut. Ich denke, Affinitätsausbreitung war in diesem Fall besser geeignet.

clustering.py


# clustering by KMeans
k_means = KMeans(n_clusters=5, init='k-means++', n_init=5, verbose=True)
k_means.fit(X)
label = k_means.labels_

clusterList = {}
for i in range(len(titleList)):
    clusterList.setdefault( label[i], '' )
    clusterList[label[i]] = clusterList[label[i]] + ',' + titleList[i]

print 'By KMeans'
for key, value in clusterList.items():
    print key
    print value

print 'By AffinityPropagation'
# clustering by AffinityPropagation
af = AffinityPropagation().fit(X)
afLabel = af.labels_
afClusterList = {}
for i in range(len(titleList)):
    afClusterList.setdefault( afLabel[i], '' )
    afClusterList[afLabel[i]] = afClusterList[afLabel[i]] + ',' + titleList[i]

for key, value in afClusterList.items():
    print key
    print value

Ichiou, das Ausführungsergebnis desjenigen, der Affinity Propagation verwendet

Es sieht so aus!

Klassifizierung 1
Praktisches maschinelles Lernsystem
Hochleistungs-Python
Erste Informatik
Make: Elektronik-Grundlagen von elektrischen und elektronischen Schaltkreisen, die Sie erstellen und verstehen können
Kapazitätsplanung - Standortanalyse / Prognose / Platzierung, um die Ressourcen optimal zu nutzen
Detaillierte Ethernet 2nd Edition
Einführung in die Datenvisualisierung mit JavaScript
Klassifizierung 2
Übe Python 3
Cython beschleunigt Python durch Fusion mit C
MongoDB & Python
Python & AWS-Kochbuch
Einführung in die Datenanalyse mit Python-Datenverarbeitung mit NumPy und Pandas
Detaillierte Erklärung der Python-Grammatik
Praktisches Computer Vision
Einführung Python 3
Erste Python 3rd Edition
Python Tutorial 2nd Edition
Beginnen Sie mit Arduino 3rd Edition
Beginnen wir mit der Verarbeitung
Python Cookbook 2nd Edition
Einführung in die Verarbeitung natürlicher Sprache
OpenStack Swift-Management und Entwicklung des Swift-Objektspeichers
SAN- und NAS-Speichernetzwerkverwaltung
Klassifizierung 3
Prototyping Lab-Arduino-Übungsrezept für "Denken beim Machen"
Weboperation - Praktische Technik der Site-Betriebsverwaltung
Praktische Bewertung der Metasploit-Sicherheitslücke durch Penetrationstest
Visualisierung der Daten-Informations-Visualisierungsmethode durch Verarbeitung
Schöne Visualisierung
Klassifizierung 4
Metaprogramming Ruby 2nd Edition
Ruby Best Practices - Professioneller Code und Techniken
Berechnung verstehen - Von einfachen Maschinen zu unmöglichen Programmen
Zum ersten Mal Ruby
Programmiersprache Ruby
Klassifizierung 5
Selenium Design Patterns & Best Practices
Üben Sie Selenium WebDriver
Testbares JavaScript
Schönes Testen - Schöne Praxis des Softwaretests

Recommended Posts

Versuchen Sie, O'Reillys Bücher durch Clustering zu klassifizieren
[Python] Versuchen Sie, Ramen-Shops durch Verarbeitung natürlicher Sprache zu klassifizieren
Versuchen Sie, sich der Teilsumme zu stellen
Empfohlene Bücher von 3 Typen im Zusammenhang mit Python
Versuchen Sie, den Strombedarf durch maschinelles Lernen vorherzusagen
Ich habe versucht, Drachenkugeln nach Adalin zu klassifizieren
[Keras] Persönliches Memo zum Klassifizieren von Bildern nach Ordner [Python]
Clustering-Experiment durch Probenahme
Versuchen Sie, die Schritte umzugestalten
[Jobwechsel-Meeting] Versuchen Sie, Unternehmen zu klassifizieren, indem Sie Mundpropaganda in natürlicher Sprache mit word2vec verarbeiten
[Grob] Clustering mit K-Mitteln
Versuchen Sie, yolact zu implementieren
Ich habe versucht, MNIST nach GNN zu klassifizieren (mit PyTorch-Geometrie).