数据聚类:目的并不是通过输入和期望输出来调整算法,而是采集数据。且常用方法是定义一组公共的数值型属性,利用这些属性进行比较。
一、对博客用户进行分类:
#-*- coding:utf-8 -*-
import feedparser
import re
#返回一个rss订阅源的标题和包含单词计数情况的字典
def getwordcounts(url):
#解析订阅源
d = feedparser.parse(url)
wc = {}
#循环遍历所有文章条目
for e in d.entries:
if 'summary' in e: #对于一篇文章而言:如果概述存在,则概述为文章概述
summary = e.summary
else:
summary = e.description #否则为文章描述
#提取一个单词列表
words = getwords(e.title+' '+summary) #获取标题+概述的单词总数
for word in words:
wc.setdefault(word,0) #判断字典里是否存在word,如果不存在初始化为0
wc[word]+=1
return d.feed.title , wc #标题和单词计数
#讲html标记剥离掉,以空格分割单词以列表形式返回
def getwords(html):
#去除html标记
txt = re.compile(r'<[^>]+>').sub(' ',html)#正则表达式:去除所有带<>以及里面的东西
#利用所有非字母字符拆分单词
words = re.compile(r'[^A-Z^a-z]+').split(txt)
#转化为小写形式
return [word.lower() for word in words if word!=' ']
#载入数据:feedlist->每行对应一个url,遍历url生成对每个博客的单词统计以及出现这些单词的博客数目
apcount = {} #出现这些单词的博客数目
wordcounts = {} #每个博客的单词统计
feedlist = [line for line in file('feedlist.txt')]
for feedurl in feedlist:
title , wc = getwordcounts(feedurl)
wordcounts[title] = wc #将相关标题的单词计数存入字典里
for word,count in wc.items():
apcount.setdefault(word,0)
if count>1:
apcount[word]+=1 #如果该单词存在于字典里,单词数+1
#建立单词列表:只考察介于某个百分比内的单词
wordlist = []
for w,bc in apcount.items(): #单词和数量,针对于每个博客的单词计数
frac = float(bc)/len(feedlist)
if frac>0.1 and frac<0.5:
wordlist.append(w)
#利用单词列表和博客列表建立针对每个博客的所有单词的统计情况
out = file('blogdata.txt','w')
out.write('Blog')
for word in wordlist:
out.write('\t%s' % word)
out.write('\n')
for blog , wc in wordcounts.items():
out.write(blog)
for word in wordlist:
if word in wc :
out.write('\t%d' %wc[word])
else:
out.write('\t0')
out.write('\n') #生成单词计数文件