WekaWiki 上有一个文本聚类的示例,简述了使用 weka 进行文本聚类的过程,本系列文章将使用其中的text_example 演示一遍 文本挖掘从 预处理 到 特征提取 再到挖掘的全过程。
下载完 text_example 完后,解压,其中有3个文件夹,分别为class1,class2,class3,每个文件夹中各有数篇文章,这就是分类好的样本。class1,class2,class3就是类别。在示例中,所有的文本都是HTML网页,所以第一步就是将网页中的HTML标签去掉。
下面这段代码使用了 BeautifulSoup 和 正则表达式来从网页中提取数据,其中正则表达式的部分可以参见我的另一篇博文:http://blog.csdn.net/rav009/article/details/12888027。而 BeautifulSoup 的文档在:http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html
#py2.7 #coding:utf-8 import re import os import chardet from BeautifulSoup import BeautifulSoup as bs, Comment def BsHandler(str): ''' 用BeautifulSoup提取内容 ''' soup=bs(str) comments = soup.findAll(text=lambda text : isinstance(text, Comment)) [comment.extract() for comment in comments] scripts=soup.body.findAll('script') for script in scripts: script.extract() styles = soup.body.findAll('style') for style in styles: style.extract() rs=' '.join(soup.body.findAll(text=True)) return rs def HtmlCharEntityHandler(htmltext): ''' 过滤html的保留符号,比如 ''' htmlentity=re.compile('&#?w+;?') return htmlentity.sub(' ', htmltext) def Handler(str): rs= HtmlCharEntityHandler(BsHandler(str)) fuhao=re.compile('[\r\n[]()|]') return fuhao.sub(' ', rs) if __name__=='__main__': path='E:\forshare\text_example' for root,dirs,files in os.walk(path): for file in files: if file.endswith('.htm'): fname=root+os.path.sep+file f=open(fname) stream=f.read() f.close() encoding=chardet.detect(stream)['encoding'] htmlstr=stream.decode(encoding) rs=Handler(htmlstr) f=open(fname+'.txt','w') f.write(rs.encode('utf-8')) f.close()
通过这段代码完成了对这些 htm 文件的预处理,接下来就轮到 WEKA中的过滤器来提取特征了。