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.
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") )
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 )
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()
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
Es sieht so aus!
Recommended Posts