`

数据挖掘-分词入门

阅读更多

谷歌4亿英镑收购人工智能公司DeepMind,百度目前正推进“百度大脑”项目,腾讯、阿里等各大巨头布局深度学习。随着社会化数据大量产生,硬件速度上升、成本降低,大数据技术的落地实现,让冷冰冰的数据具有智慧逐渐成为新的热点。要从数据中发现有用的信息就要用到数据挖掘技术,不过买来的数据挖掘书籍一打开全是大量的数学公式,而课本知识早已还给老师了,难以下手、非常头大!

我们可以跳过数学公式,先看看我们了解数据挖掘的目的:发现数据中价值。这个才是关键,如何发现数据中的价值。那什么是数据呢?比如大家要上网首先需要输入网址,打开网页后会自动判断哪些是图片、哪些是新闻、哪些是用户名称、游戏图标等。人大脑可以存储大量的信息,包括文字、声音、视频、图片等,每一个都可以转换数据存储在电脑。人的大脑可以根据输入自动进行判断,电脑可以通过输入判断吗?答案是肯定的! 不过需要我们编写程序来判断每一种信息,就拿文字识别来说吧,怎么从一个人在社交网络的言论判断他今天的心情是高兴还是愤怒!比如:“你假如上午没给我吃冰淇淋,我绝对会不happy的。” 信息发布时间为下午2点。对于我们人类一看这个句子就知道他是吃过冰淇淋了,心情肯定不会是愤怒。那计算机怎么知道呢?

这就是今天的主题,要让计算机理解句子的语义,必须要有个程序,上面的句子和发布时间是输入,输出就是 “高兴”。要得到“高兴”就要建立 “高兴”的规则,可以建一个感情色彩词库,比如 高兴(识别词是高兴、happy),愤怒(识别词是愤怒、生气)。这里的识别词就是输入中出现的词语,比如上面的句子中的“happy”就识别出了“高兴”这个感情色彩词。但是光识别出“happy”肯定是不行的,前面的“假如。。。没。。。,我。。。不。。。”等关键词都需要识别出来,才能完整判断一个句子的意思。为了达到这个效果,就必须要用分词技术了。

我们先人工对上面的句子来进行一下切词,使用斜线分割:“你/假如/上午/没/给/我/吃/冰淇淋/,/我/绝对/会/不/happy/的/。/”。但是程序如何做到自动切分?这个其实中国的前辈们已经做了很多中文分词的研究,常见的分词算法有:

1、基于词典的分词,需要先预设一个分词词典,比如上面句子切分出来的“假如、上午”这些词先存放在词典,然后把句子切分成单字组合成词语去词典里查找,匹配上了就挑选出来一个词。没有匹配上的就切分成单字。

2、基于统计的分词,需要先获取大量的文本语料库(比如新闻、微博等),然后统计文本里相邻的字同时出现的次数,次数越多就越可能构成一个词。当达到一定次数时就构成了一个词即可形成语料概率库。再对上面句子进行单字切分,把字与字结合后在语料概率库里查找对应的概率,如果概率大于一定值就挑选出来形成一个词。这个是大概描述,实际生产环境中还需要对句子的上下文进行结合才能更准确的分词。

3、基于语义的分词,简而言之就是模拟人类对句子的理解来进行分词。需要先整理出中文语句的句法、语义信息作为知识库,然后结合句子的上下文,对句子进行单字切分后组合成词逐个带入知识库进行识别,识别出来就挑选出一个词。目前还没有特别成熟的基于语义的分词系统。

为了让大家快速的了解分词技术,我们采用第一个方式来做测试:基于词典的分词,这种方式简单暴力可以解决百分之七八十的问题。基于词典的分词大概分为以下几种方式:

1、正向最大匹配,沿着我们看到的句子逐字拆分后组合成词语到词典里去匹配,直到匹配不到词语为止。举个实际的例子:“人民大会堂真雄伟”,我们先拆分为单字“人”去词典里去查找,发现有“人”这个词,继续组合句子里的单字组合“人民”去词典里查找,发现有“人民”这个词,以此类推发现到“人民大会堂”,然后会结合“人民大会堂真”去词典里查找没有找到这个词,第一个词“人民大会堂”查找结束。最终分词的结果为:“人民大会堂/真/雄伟”。

segment

2、逆向最大匹配,这个和上面相反,就是倒着推理。比如“沿海南方向”,我们按正向最大匹配来做就会切分成 “沿海/南方/向”,这样就明显不对。采用逆向最大匹配法则来解决这个问题,从句子的最后取得“方向”这两个字查找词典找到“方向”这个词。再加上“南方向”组成三字组合查找词典没有这个词,查找结束,找到“方向”这个词。以此类推,最终分出“沿/海南/方向”。

3、双向最大匹配,顾名思义就是结合正向最大匹配和逆向最大匹配,最终取其中合理的结果。最早由哈工大王晓龙博士理论化的取最小切分词数,比如“我在中华人民共和国家的院子里看书”,正向最大匹配切分出来为“我/在/中华人民共和国/家/的/院子/里/看书”工8个词语,逆向最大匹配切分出来为“我/在/中华/人民/共/和/国家/的/院子/里/看书”共11个词语。取正向最大匹配切出来的结果就是正确的。但是如果把上面那个例子“沿海南方向”双向切分,都是3个词语,改如何选择?看第4个《最佳匹配法则》。

4、最佳匹配法则,先准备一堆文本语料库、一个词库,统计词库里的每一个词在语料库里出现的次数记录下来。最后按照词频高的优先选出,比如“沿海南方向”,正向切分为:“沿海/南方/向”,逆向切分为:“沿/海南/方向”。其中“海南”的频度最高,优先取出来。剩下“沿”、“方向”也就正常切分了。是不是这就是基于词典分词的最佳方案?比如数学之美中提到的:“把手抬起来” 和 “这扇门的把手”,可以分为“把”、“手”、“把手”,不管怎么分总有一句话的意思不对。后续再介绍如何通过统计的分词处理这些问题。

说了这么多,我们来实战一下如何基于词典的分词:

public class TestPositiveMatch {
    public static void main(String[] args) {
        String str = "我爱这个中华人民共和国大家庭";
        List<String> normalDict = new ArrayList<String>();

        normalDict.add("");
        normalDict.add("爱");
        normalDict.add("中华");   //测试词库里有中华和中华人民共和国,按照最大匹配应该匹配出中华人民共和国
        normalDict.add("中华人民共和国");

        int strLen = str.length();  //传入字符串的长度
        int j = 0;
        String matchWord = ""; //根据词库里识别出来的词
        int matchPos = 0; //根据词库里识别出来词后当前句子中的位置
        while (< strLen) {      //从0字符匹配到字符串结束
            int matchPosTmp = 0;   //截取字符串的位置
            int i = 1;
            while (matchPosTmp < strLen) {   //从当前位置直到整句结束,匹配最大长度
                matchPosTmp = i + j;
                String keyTmp = str.substring(j, matchPosTmp);//切出最大字符串
                if (normalDict.contains(keyTmp)) { //判断当前字符串是否在词典中
                    matchWord = keyTmp;  //如果在词典中匹配上了就赋值
                    matchPos = matchPosTmp; //同时保存好匹配位置
                }
                i++;
            }
            if (!matchWord.isEmpty()) {
                //有匹配结果就输出最大长度匹配字符串
                j = matchPos;
                //保存位置,下次从当前位置继续往后截取
                System.out.print(matchWord + " ");
            } else {
                //从当前词开始往后都没有能够匹配上的词,则按照单字切分的原则切分
                System.out.print(str.substring(j, ++j) + " ");
            }
            matchWord = "";
        }
    }
}

输出结果为: 我 爱 这 个 中华人民共和国 大 家 庭

按照这样我们一个基本的分词程序开发完成。

对于文章一开始提到的问题还没解决,如何让程序识别文本中的感情色彩。现在我们先要构建一个感情色彩词库“高兴”,修饰词库“没”、”不”。再完善一下我们的程序:

public class TestSentimentPositiveMatch {
    public static void main(String[] args) {
        String str = "你假如上午没给我吃冰淇淋,我绝对会不happy的。";

        //语义映射
        Map<String, String> sentimentMap = new HashMap<String, String>();
        sentimentMap.put("happy""高兴");

        //情感词库
        List<String> sentimentDict = new ArrayList<String>();
        sentimentDict.add("happy");

        //修饰词
        List<String> decorativeDict = new ArrayList<String>();
        decorativeDict.add("不");
        decorativeDict.add("没");

        //修饰词衡量分数
        Map<String, Double> decorativeScoreMap = new HashMap<String, Double>();
        decorativeScoreMap.put("不"-0.5);
        decorativeScoreMap.put("没"-0.5);

        List<String> decorativeWordList = new ArrayList<String>();  //修饰词
        String sentimentResult = ""; //情感结果

        int strLen = str.length();  //传入字符串的长度
        int j = 0;
        String matchSentimentWord = ""; //根据词库里识别出来的情感词
        String matchDecorativeWord = ""; //根据词库里识别出来的修饰词
        int matchPos = 0; //根据词库里识别出来词后当前句子中的位置
        while (< strLen) {      //从0字符匹配到字符串结束
            int matchPosTmp = 0;   //截取字符串的位置
            int i = 1;
            while (matchPosTmp < strLen) {   //从当前位置直到整句结束,匹配最大长度
                matchPosTmp = i + j;
                String keyTmp = str.substring(j, matchPosTmp);//切出最大字符串
                if (sentimentDict.contains(keyTmp)) { //判断当前字符串是否在词典中
                    matchSentimentWord = keyTmp;  //如果在词典中匹配上了就赋值
                    matchPos = matchPosTmp; //同时保存好匹配位置
                }
                if (decorativeDict.contains(keyTmp)) { //判断当前字符串是否在词典中
                    matchDecorativeWord = keyTmp;  //如果在词典中匹配上了就赋值
                    matchPos = matchPosTmp; //同时保存好匹配位置
                }
                i++;
            }
            if (!matchSentimentWord.isEmpty()) {
                //有匹配结果就输出最大长度匹配字符串
                j = matchPos;
                //保存位置,下次从当前位置继续往后截取
                System.out.print(matchSentimentWord + " ");
                sentimentResult = sentimentMap.get(matchSentimentWord);
            }
            if (!matchDecorativeWord.isEmpty()) {
                //有匹配结果就输出最大长度匹配字符串
                j = matchPos;
                //保存位置,下次从当前位置继续往后截取
                System.out.print(matchDecorativeWord + " ");
                decorativeWordList.add(matchDecorativeWord);
            } else {
                //从当前词开始往后都没有能够匹配上的词,则按照单字切分的原则切分
                System.out.print(str.substring(j, ++j) + " ");
            }
            matchSentimentWord = "";
            matchDecorativeWord = "";
        }

        double totalScore = 1;
        for (String decorativeWord : decorativeWordList) {
            Double scoreTmp = decorativeScoreMap.get(decorativeWord);
            totalScore *= scoreTmp;
        }

        System.out.print("\r\n");
        if (totalScore > 0) {
            System.out.println("当前心情是:" + sentimentResult);
        } else {
            System.out.println("当前心情是:不" + sentimentResult);
        }
    }
}

通过传入“你假如上午没给我吃冰淇淋,我绝对会不happy的。”,结果输出为:“当前心情是:高兴”。当然你也可以改变其中的修饰词,比如改为:“你假如上午没给我吃冰淇淋,我绝对会happy的。”,结果输出为:“当前心情是:不高兴”。

机器再也不是冷冰冰的,看起来他能读懂你的意思了。不过这只是一个开始,抛出几个问题:

1、如何让程序识别句子中的时间?比如“上午”、“下午2点”。
2、如何处理“把手抬起来” 和 “这扇门的把手”中的“把”与“手”的问题?
3、如何构建海量的知识库,让程序从“婴儿”变成“成年人”?
4、如何使用有限的存储空间海量的知识库?
5、如何提高程序在海量知识库中查找定位信息的效率?
6、如何识别新词、人名、新鲜事物等未知领域?

univers_brain

这是《纽约时报》刊登的2张照片,一张是老鼠的脑细胞(左),一张是宇宙(右)。早期宇宙中星系互连关系,和大脑神经元相互连接,几乎无法分辨两张图之间的不同,大脑细胞与整个宇宙拥有一样的结构。

宇宙芸芸众生都是相通的,大脑也许就是一个小宇宙,在这个小宇宙又有很多星球、住着很多生物。而电脑也是宇宙中地球上的一个产物,只要存储计算速度发展到足够强大一定可以构建成一个强大的大脑。

你看这个单词 “testaword” 认识吗?可能不认识,因为我们五官先获取到的信息,然后根据大脑以往学习的经验做出判断。但是你看这个短语 ” test a word” 认识吗?再看看开始那个单词“testaword”是不是就亲切多了?

原创文章,转载请注明: 转载自LANCEYAN.COM

本文链接地址: 数据挖掘-分词入门

分享到:
评论

相关推荐

    Python-Python数据挖掘NLP实战示例

    1. **NLTK(Natural Language Toolkit)**:这是一个强大的Python库,提供了分词、词性标注、命名实体识别、语料库处理等功能,是初学者入门NLP的首选。 2. **Spacy**:相比NLTK,Spacy更加高效且设计现代化,它...

    阿里天池-零基础入门NLP - 新闻文本分类

    1. **数据预处理**:这是NLP任务的第一步,包括分词、去除停用词(如“的”、“是”等常见词)、词干提取和词形还原。此外,还需要对文本进行编码,例如使用词袋模型(Bag of Words)、TF-IDF或者词嵌入(如Word2Vec...

    互联网数据挖掘课程 北大NLP课程-自然语言处理系列课程 第04章 自然语言处理基础 共64页.pdf

    本课程《互联网数据挖掘》涵盖了NLP的基础知识,旨在为学习者提供一个全面的入门指南。课程内容由北京大学提供,通过细致的课件设计,深入浅出地讲解了NLP的基本概念、任务和技术。 首先,课程介绍了自然语言的基本...

    《数据竞赛入门讲义》.pdf

    数据分析是数据挖掘的第一步,包含赛题背景分析和赛题数据分析,目的是了解数据特点和业务需求。 #### 6.2 特征工程 特征工程是数据挖掘中至关重要的一步,它包含数据清洗、特征预处理、特征提取和特征筛选。 ####...

    python数据科学教学大纲教案.doc

    《Python数据科学》课程旨在通过实践任务驱动,让学生掌握数据分析、数据挖掘和文本挖掘的核心技能。课程内容包括: 1. Python编程基础:针对无基础的学生进行基础教学,对于有一定基础的学生,可直接进入高级话题。...

    web data ming

    总之,《Web数据挖掘》这本书深入浅出地介绍了Web数据挖掘的基本概念、方法和技术,对于初学者来说是一本很好的入门教材。通过学习,读者能够掌握如何从Web信息中提取有价值的知识,并将其应用于实际问题中,提升...

    集体智慧编程(中文版).rar

    《集体智慧编程》是一本深度探讨Web数据挖掘的中文版专著,旨在引导读者进入这个充满机遇和挑战的领域。本书以丰富的实例和易于理解的操作步骤,为初学者提供了宝贵的入门资源,同时也为有一定基础的从业者提供了...

    Lucene入门学习文档

    深入学习Lucene,有助于提升信息检索和数据分析的能力,对于从事搜索引擎开发、大数据分析、信息挖掘等领域的人来说尤其重要。 通过阅读"Lucene学习文档",你可以一步步了解并掌握这些知识,逐步成为一个熟练的...

    Lingpipe(自然语言处理的Java开源工具包)入门

    Lingpipe 的信息抽取和数据挖掘工具可以跟踪实体、链接命名实体数据库、发现实体和行为之间的关系、对文本进行语言、字体编码、类型、主题和情感分类、拼写检查、文档聚类和趋势发现、词性标注和短语组块等。...

    爬虫入门到大牛笔记

    数据挖掘技术和分类算法的应用可以避免死链。熟悉数据库如mongoDB和redis,了解如何利用缓存减少重复下载。此外,能使用Scrapy等分布式爬虫框架,部署和管理大规模数据爬取项目。 爬虫的种类主要分为通用爬虫和聚焦...

    零基础看懂LDA主题模型

    **LDA**(Latent Dirichlet Allocation,潜在狄利克雷分配)是一种基于概率的无监督学习算法,用于挖掘文本数据中的隐藏主题结构。它通过分析文档集合中的词汇分布来推断出文档的主题,并进一步揭示出构成这些主题的...

    PYTHON 兵器谱

    本文档《PYTHON 兵器谱》介绍了Python在多个领域的应用,包括网页爬虫、文本处理、科学计算、机器学习和数据挖掘。作者数盟君亲身经历了一个从初学者到熟练使用者的转变,并最终将Python应用于各种开发任务中。文中...

    NLP入门+实战必读:一文教会你最常见的10种自然语言处理技术(附代码).pdf

    例如,英文中动词的过去式和过去分词形式会转换为原形。这个过程对于一些NLP应用来说很有帮助,比如搜索引擎中处理不同词形的词时,都可以当作相同的词处理,以提高搜索的相关性和准确性。常用的词干提取算法有...

    R语言与文本挖掘入门篇(各软件包详解)

    在IT领域,文本挖掘是一种利用计算机程序从大量文本数据中提取有用信息的技术。R语言作为统计分析和图形绘制的强大工具,同样适用于文本挖掘任务。本文将深入探讨R语言在文本挖掘中的应用,以及如何利用R中的相关...

    分享一个Nutch入门学习的资料

    Nutch 是一个开源的搜索引擎...通过深入学习和实践,你可以掌握网络爬虫的基本原理,为后续的大数据分析和信息挖掘打下坚实基础。对于想在互联网数据领域有所作为的开发者来说,Nutch是一个值得投入时间去学习的工具。

    文本挖掘课程PDF

    接着,文档描述中提到“从深度学习技术的基础讲起,较容易入门”,说明课程会从基础的深度学习概念开始讲授,并逐步深入到具体的NLP技术,如语言模型、机器翻译、拼写纠错等。 在课程内容上,“自然语言处理”是这...

    基于python的文本挖掘应用——以米9用户评论的词频统计为例.zip

    文本挖掘是一种从大量文本数据中提取有用信息和知识的技术,主要应用于信息检索、情感分析、主题建模等领域。本案例以“米9用户评论的词频统计”...这个案例就是一个很好的实践教程,帮助初学者快速入门文本挖掘领域。

Global site tag (gtag.js) - Google Analytics