小说网 找小说 无限小说 烟雨红尘 幻想小说 酷文学 深夜书屋

网站分类前导:获取网站标题和描述及对相关信息进行分词处理

前言:

  之前,笔者做过一些关于网络爬虫的东西。而且爬取的效果还可以。不过还有一些爬虫的博客没有完成,在后期会将其更新完成。而之前的爬虫只是对网页中的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% | 

  根据上面两种分词方面,可能你已经感觉到第二会更准确一些。


相关源码下载:

http://download.csdn.net/detail/u013761665/9107117

posted on 2015-09-15 10:20  王峰炬  阅读(212)  评论(0编辑  收藏  举报

导航