py2.7 《集体智慧编程》chapter3:发现群组

来源:互联网 发布:网络答题成绩单系统 编辑:程序博客网 时间:2024/05/17 04:05

数据聚类:目的并不是通过输入和期望输出来调整算法,而是采集数据。且常用方法是定义一组公共的数值型属性,利用这些属性进行比较。


一、对博客用户进行分类:

#-*- coding:utf-8 -*-import feedparserimport 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') #生成单词计数文件


0 0