网站分类前导:获取网站标题和描述及对相关信息进行分词处理
前言:
之前,笔者做过一些关于网络爬虫的东西。而且爬取的效果还可以。不过还有一些爬虫的博客没有完成,在后期会将其更新完成。而之前的爬虫只是对网页中的URL进行提取,我想做的效果是能对这些网页进行分类。而分类的前提是我们能够依据一些可信文本,对这些文本进行分词,再通过这些分出来的词再进行分类(如:贝叶斯分类器)。
而本文就是对网页分类的前导学习——中文分词学习。
关于文章:
本文链接:http://blog.csdn.net/lemon_tree12138/article/details/48463215 - 编程小笙
转载请注明出处
获取网站标题和描述文本:
写过Java网络的人都应该知道这里要如何获得网站的标题和描述情况。
我们可以打开一个网页,然后在网页上右键查看源码。在源码的上方会有类似这样的一些信息,如下图:
1.标题
2.网页描述
通过上面的截图我们可以知道这里两个信息的Tag和attr。具体的Java实现如下:
public class GetTitleDesc { private void parser() throws IOException { Document doc = Jsoup.connect("http://mail.163.com/") .header("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:33.0) Gecko/20100101 Firefox/33.0") .get(); System.out.println(doc.title()); Elements metaElements = doc.getElementsByAttributeValue("name", "description"); for (Element element : metaElements) { System.out.println(element.attr("content")); } } public static void main(String[] args) { GetTitleDesc get = new GetTitleDesc(); try { get.parser(); } catch (IOException e) { e.printStackTrace(); } } }
对标题和描述进行分词:
1.Lucene分词:
1.说明:
对于英文的分词是一个比较方便的操作,因为英文是以空格为分隔符。而在中文中,我们不能单纯地以某一个字来分隔一段字符。这样我们可能会得到一些莫名其妙的结果。
关于分词的代码,主要参考:http://blog.sina.com.cn/s/blog_b8f01fb90101gxyb.html
不过还好,我们有lucene这个包。对于中文分词,我们具体需要导入以下工具包:
2.代码实现:
这里我们就以之前在163邮箱上的描述来作为输入文本:
网易163免费邮箱--中文邮箱第一品牌。容量自动翻倍,支持50兆附件,免费开通手机号码邮箱赠送3G超大附件服务。支持各种客户端软件收发,垃圾邮件拦截率超过98%。
public class TestJeAnalyzer { private static final String LABEL = "网易163免费邮箱--中文邮箱第一品牌。容量自动翻倍,支持50兆附件,免费开通手机号码邮箱赠送3G超大附件服务。支持各种客户端软件收发,垃圾邮件拦截率超过98%。"; public static void testStandard(String testString) throws Exception { Analyzer analyzer = new StandardAnalyzer(); Reader r = new StringReader(testString); StopFilter sf = (StopFilter) analyzer.tokenStream("", r); Token t; while ((t = sf.next()) != null) { System.out.println(t.termText()); } } public static void testCJK(String testString) throws Exception { Analyzer analyzer = new CJKAnalyzer(); Reader r = new StringReader(testString); StopFilter sf = (StopFilter) analyzer.tokenStream("", r); Token t; while ((t = sf.next()) != null) { System.out.println(t.termText()); } } public static void testChiniese(String testString) throws Exception { Analyzer analyzer = new ChineseAnalyzer(); Reader r = new StringReader(testString); TokenFilter tf = (TokenFilter) analyzer.tokenStream("", r); Token t; while ((t = tf.next()) != null) { System.out.println(t.termText()); } } public static void testJe(String testString) throws Exception { Analyzer analyzer = new IK_CAnalyzer(); Reader r = new StringReader(testString); TokenStream ts = (TokenStream) analyzer.tokenStream("", r); Token t; while ((t = ts.next()) != null) { System.out.println(t.termText()); } } public static void main(String[] args) throws Exception { String testString = LABEL; System.out.println("原始文本:" + testString); Utils.sleep(10); System.err.println("=====standard analyzer===="); System.err.println("分析方法:默认没有词只有字"); testStandard(testString); Utils.sleep(10); System.err.println("=====cjk analyzer===="); System.err.println("分析方法:交叉双字分割"); testCJK(testString); Utils.sleep(10); System.err.println("=====chinese analyzer===="); System.err.println("分析方法:基本等同StandardAnalyzer"); testChiniese(testString); Utils.sleep(10); System.err.println("=====je analyzer===="); System.err.println("分析方法:字典分词,正反双向搜索,具体不明"); testJe(testString); } }
3.分词结果(部分):
2.MMAnalyzer分词:
1.代码部分:
public class Segment1 { public static void main(String[] args) { String LABEL = "网易163免费邮箱--中文邮箱第一品牌。容量自动翻倍,支持50兆附件,免费开通手机号码邮箱赠送3G超大附件服务。支持各种客户端软件收发,垃圾邮件拦截率超过98%。"; MMAnalyzer analyzer = new MMAnalyzer(); try { System.out.println(analyzer.segment(LABEL, " | ")); } catch (IOException e) { e.printStackTrace(); } } }
2.效果展示:
网易 | 163 | 免费邮箱 | 中文 | 邮箱 | 第一 | 品牌 | 容量 | 自动 | 翻倍 | 支持 | 50兆 | 附件 | 免费 | 开通 | 手机 | 号码 | 邮箱 | 赠送 | 3g | 超大 | 附件 | 服务 | 支持 | 各种 | 客户端 | 软件 | 收发 | 垃圾邮件 | 拦截 | 率 | 超过 | 98% |
根据上面两种分词方面,可能你已经感觉到第二会更准确一些。