分类: 默认

  • 基于LingPipe的文本倾向性分析–LingPipe学习笔记

    基于LingPipe的文本倾向性分析–LingPipe学习笔记

    文本倾向性分析

    文本倾向性分析(情感分析 )是将用户的观点分为“正面”和“负面”,有时候会多一个“中性”。文本倾向性分析一个比较直观的应用就是追踪用户对于一个事物的观点和偏好,比如分析豆瓣上一个电影的评论进行分析。正因为如此情感分析又被称为观点挖掘。

    LingPipe

    lingpipe 是alias公司开发的一款自然语言处理软件包,包括主题分类、句题检测、字符语言建模等十余个模块。而且文档完整,甚至每一个算法都有论文参考。更难能可贵的是它支持中文。

    官方地址:http://alias-i.com/lingpipe/

    下载地址:http://alias-i.com/lingpipe/web/download.html

    LingPipe分为两个大块,一块是LingPipe核心文件,另外一块是LingPipe的模型类。需要支持中文的话需要下载Chinese Word Segmentation模块。

    准备语料库

    语料库在语言学上意指大量的文本,通常经过整理,具有既定格式与标记。

    一般而言做情感分析有个很重要的步骤就是采集观点并进行整理,但由于应用场景不同,处理方法也不同。为了方便起见,这里使用已经处理好的语料库。Movie Review Data的polarity dataset v2.0,包含1000个正面的观点和1000个负面观点。当然这个是英文的哈。

    基本极性分析

    基本极性是指事物从样本来看所处的整体倾向,比如:一本书,用户对其的情感倾向是正面的,这样的断言就是一个基本极性断言。

    基本极性的分析直接使用LingPipi的DynamicLMClassifier即可。

    大致上来讲分为两步,第一步训练,第二步进行分析。

    新建一个类名为PolarityBasic。

    publicPolarityBasic(String basePath) {
    pDir =new File(basePath,"txt_sentoken");//获取语料集
    categories = pDir.list();//获取类别
    int nGram =4;
    classifer = DynamicLMClassifier.createNGramProcess(categories, 
  • RIpple-DOwn Rule算法和weka中Rider使用–数据挖掘学习和weka使用(五)

    RIpple-DOwn Rule算法和weka中Rider使用–数据挖掘学习和weka使用(五)

    RIpple-DOwn Rule算法简介

    RIpple-DOwn Rule算法(链波下降规则)是一种专家系统方法论,它是澳大利亚新南威尔士大学的Compton教授于1989年提出。它是一种用于知识表示和获取的方法。从某种意义上看RDR算法是CBR方法的一种扩展或者变形,RDR将规则引入CBR中,用规则来索引案例,以错误驱动机制来获取知识。

    RIpple-DOwn Rule算法是比较简单,有时候得出的结果不能让人满意,但是它是我最喜欢的一种算法,它通过否定规则来表示结果,非常适合人类理解。

    RIpple-DOwn Rule算法流程

    RIpple-DOwn Rule算法使用了二元决策树,区别于标准决策树,RDR用复合条款是来确定分支,同时这些条款不需要详尽涵盖所有情况,即可以有分类错误的情况,然后用错误的数据作为新整体再处理,以获得内部分支。

    为了方便说明,我们先看一个RDR的输出

    weka5_1

    这是一个医学诊断系统的涟波规则。

    我们还是以weather.arff的数据为例。

    weka5_2

    看一下我们的分类要求,要分成no和yes两类。

    no 的权重是5,yes的权重是9。

    由错误驱动生成第一条规则

    play = no

    很明显这条规则没有正确分类

    weka5_3

    总共14个样本,有9个被分类错了。

    再来生成内规则。

    生成过程就省略了…请参考本文最后的参考文献。第二条规则是

    Except (humidity <= 82.5) => play = yes

    序号为6的数据被错误分类为play了.最终的规则是

    play = no

               Except (humidity <= …

  • OneR算法和weka中OneR使用–数据挖掘学习和weka使用(四)

    OneR算法和weka中OneR使用–数据挖掘学习和weka使用(四)

    OneR算法简介

    OneR又称1-R,是1993出现的一种极为简单的分类算法模型,它可以产生一个单层的决策树。

    OneR算法是一个简单、廉价的方法,但是常常能够获得一个非常好的结果,用于描述数据中的结构。

    OneR算法的使用非常广泛,可以简单的得到一个对数据的概括性了解,有时候甚至可以直接获得结果。

    OneR算法实现

    OneR的思路很简单,建立一个只针对于单个属性进行测试的规则,并进行不同的分支。每个分支对应的不同属性值。

    分支的类就是原始数据(训练数据)在这个分支上出现最多的类。

     

    每一个属性都会产生一个不同的规则集,每条规则对应这个属性的每个值。对每个属性值的规则集的误差率进行评估,选择效果最好的一个即可。

    伪代码表述:

    对于每个属性

      对于这个属性的每个属性值,建立如下规则

        计算每个类别出现的频率

        找出出现最频繁的类别

        建立规则,将这个类别赋予这个属性值

      计算规则的误差率

    选择误差率最小的规则

     

    一个简单的例子,数据使用weka自带的weather数据集。

    weka4_1

    针对每个属性,一共有5个,其中最后一个是我们希望输出的结果,所以只有4个属性值。即outlook、temperature、humidity、windy。

    我们先计算outlook属性,它有3个属性值,sunny、rainy、overcast。

    weka4_2

    针对属性值sunny而言,一共有5条数据。

    weka4_3

    其中对应play为no的有3条、对应play为yes的有2条,为no的最频繁,所以给sunny赋值为no。

    同理对于rainy而言,有5条记录。

    weka4_4

    其中对应play为yes的有3条、对应play为no的有2条,为yes的最频繁,所以给rainy赋值为yes。

    同理计算overcast属性值,赋值为yes。

     

    然后计算误差率

    sunny—>no 中有3个分类正确,2个分类错误,误差0.4

    rainy—>yes 误差为0.4

    overcast—>yes 误差为0

    outlook总误差4/14…

  • 数据预处理和weka.filters的使用–数据挖掘学习和weka使用(三)

    数据预处理和weka.filters的使用–数据挖掘学习和weka使用(三)

    上一篇介绍了arff格式,这是weka专有格式,一般情况需要我们从其他数据源抽取或者获得。weka支持从cvs转化,也可以从数据库中抽取,界面如下图

    weka3_1

    weka安装目录有一个data目录,里面有一些测试数据,可以用于测试和学习。

    导入了数据仅仅是一个开始,我们还需要对数据进行预处理。

    数据预处理(data preprocessing)

    数据预处理(data preprocessing)是指在主要的处理以前对数据进行的一些处理。

    现实世界中数据大体上都是不完整,不一致的脏数据,无法直接进行数据挖掘,或挖掘结果差强人意。

    为了提高数据挖掘的质量产生了数据预处理技术。

    数据预处理有多种方法:数据清理,数据集成,数据变换,数据归约等。这些数据处理技术在数据挖掘之前使用,大大提高了数据挖掘模式的质量,降低实际挖掘所需要的时间。

    数据清理是使用比较频繁的,主要有:

    (1)空缺值处理

    目前最常用的方法是使用最可能的值填充空缺值,比如可以用回归、贝叶斯形式化方法工具或判定树归纳等确定空缺值.这类方法依靠现有的数据信息来推测空缺值,使空缺值有更大的机会保持与其他属性之间的联系。

    还可以用一个全局常量替换空缺值、使用属性的平均值填充空缺值或将所有元组按某些属性分类,然后用同一类中属性的平均值填充空缺值.如果空缺值很多,这些方法可能误导挖掘结果。

    (2)噪声数据处理

    噪声是一个测量变量中的随机错误或偏差,包括错误的值或偏离期望的孤立点值。常用分箱、回归、计算机检查和人工检查结合、聚类等方法进行噪音处理。

     

    数据变化主要使用平滑聚集,数据概化,规范化等手段使数据换为较利于数据挖掘的格式。

     

    数据归约主要是为了压缩数据量,源数据可以用来得到数据集的归约表示,它接近于保持原数据的完整性,但数据量比原数据小得多.与非归约数据相比,在归约的数据上进行挖掘,所需的时间和内存资源更少,挖掘将更有效,并产生相同或几乎相同的分析结果。常用维归约、数据压缩、数值归约等方法实现。

    Weka.Filters

    weka.filters中包含了一些数据预处理的简单实现(其实已经够用了),主要分成两大类,监督过滤(UnsupervisedFilter)和非监督过滤(UnsupervisedFilter)。

    如果是使用GUI的话,点击Filter的Choose就可以选择

    weka3_2

    选择完成后点击选择的Filter本身就可以修改相关参数。

    weka3_3

    完成参数修正后点击Apply就Ok了。

    我平时使用的比较多的还是非监督过滤,下面介绍一些比较常见。

    先介绍weka.filters.unsupervised.attribute包下的,这是非监督方法对属性进行预处理。

    1.Add

    为数据库添加一个新的属性,新的属性将会包含所有缺失值。可选参数:

    attributeIndex:属性位置,从1开始算,last是最后一个,first是第一个

    attributeName:属性名称

    attributeType:属性类型,一般是4选1

    dateFormat:数据格式,参考ISO-8601

    nominalLabels:名义标签,多个值用逗号隔开

    2.AddExpression

    新增一个属性,该属性由现有属性通过设定的表达式计算得出。支持+, -, *, /, ^, …

  • 输入数据与ARFF文件–数据挖掘学习和weka使用(二)

    输入数据与ARFF文件–数据挖掘学习和weka使用(二)

    我个人认为直接讨论数据挖掘算法和weka的使用过于心急。我一开始就直接学习的数据挖掘方法,有些方法艰涩枯燥,我常常在思考的不是方法本身,而是“这是干什么的?”。

    在使用了weka后有些东西渐渐清晰,因为输入和输出给了人很直观的感觉,再结合技术本身学习效率很高。

    输入主要有三类:概念、实例和属性。

    概念

    概念简单而言就是需要被处理的东西。它可以是分类学习中那个已经分类完成的样本集。

    你需要处理的东西可能差别很大,但你可以统称它们为概念,而输出就是对其的描述,即概念描述。

    实例

    实例这个词你可能觉得陌生,但是你可以大致认为其为样本。

    我们通常的输入是一个实例集,其中的每一个实例都是单一、独立的概念样本。

    当然最常见的实例表现方式就是表格:

    instances

    不过这是因为如此,有人戏称数据挖掘应该成为文件挖掘。

    诚然,关系型数据库可以表现更为复杂的关系,但有限关系的有限集一般都可以转化为单个表。有兴趣深入看看的朋友可以看一下有关反向规格化的虚假事实问题。

    属性

    如果上面说到的实例是表格中的一行的话,属性就是数据表中的一列。

    一个特定实例的一个属性值是属性对应部分的一个测量或者观测值。

    ARFF格式

    arff格式是weka专用的文件格式,全称Attribute-Relation File Format。

    它是一个ASCII文本文件,记录了一些共享属性的实例。arff格式是由怀卡托大学的计算机科学部门开发的。

    arff格式文件主要由两个部分构成,头部定义和数据区。

    头部定义包含了关系名称(relation name)、一些属性(attributes)和对应的类型,如:

    %1.Title:IrisPlantsDatabase %
    %2.Sources: %
    (a)Creator:R.A.Fisher %
    (b)Donor:MichaelMarshall (MARSHALL%[email protected]) %
    (c)Date:July,1988 %@RELATION iris@ATTRIBUTE sepallengthNUMERIC@ATTRIBUTE sepalwidthNUMERIC@ATTRIBUTE petallengthNUMERIC@ATTRIBUTE petalwidthNUMERIC@ATTRIBUTEclass {Iris-setosa,Iris-versicolor,Iris-virginica}
  • 数据挖掘简述和weka介绍–数据挖掘学习和weka使用(一)

    写在开篇

    weka用了一些时日了,觉得真心不错。功能很完善,而且是开源的。最重要的扩展方便,非常适合搞研究和做全国大学生数学建模之类的比赛。

    我学习weka主要是看的一本数据挖掘和weka使用的书,是英文的。国内有中文版…但是不想吐就不要看译本吧,不知道是翻译的人是怎么想的.

    我写博文的顺序和参考书顺序是一样的,一方面是我觉得原书的学习顺序很合理,另外一个方面是因为我也确确实实是按照这个顺序学的。

    文章的内容一部分是我大致翻译的原书内容,一部分是我的实际经验。

    weka的中文资料还是有一些的,但是我没有找到一个较为系统,所以准备自己写一个系列出来。因为数据挖掘涉及一些比较专业的知识,我虽然是学数学的,但毕竟不是专职做数据挖掘的,如果有什么错误和疏漏还希望大家指正。

    数据挖掘的发展背景

    我们正在被数据所困扰。在我们生活的世界中,数据不断增长。无所不在的个人计算机使原本应该被废弃的数据现在可以很轻易地被保存。廉价的存储设备可以让我们简简单单存储数据而不急于决定其用途,我们所需要的只是再买个硬盘然后继续保存数据。

    互联网让我们被信息淹没,但另一个方面每一个选择都被记录下来。它们都是私人的数据,每一个数据都对应了一个个体。数据的数量高速增长,但让人感到遗憾的是,人们的认知和知识保有量却没有同步增长。信息隐藏在大量数据中,那些极有用处的信息没有被发现和重复利用。

    寻找数据中的模式是一切的核心,这并不是多么新奇或者高级的事情,从人类出现开始人们就开始寻找模式。猎人从动物迁徙行为中寻找模式;农夫从谷物生长中寻找模式;政客寻求选民意见的模式;科学家寻找物理世界的模式并将其浓缩成理论;企业家评估风险,从行为中寻找模式并将其转化为可以盈利的事业并开阔它们。

    经济学家、统计学家和工程师们为了模式可以被自动风险、识别、验证并用于验证这个目标奋斗了相当长的时间,如洪水般增长的数据增加了发现规律的可能性,并使其成为前沿热点技术。据预测,存储于全球的数据每隔20个月就可以翻一倍,当世界不断变得复杂,我们被淹没于数据之中时,数据挖掘将成为极为有价值的技术。它可以让人们获得新的视角并在商业竞争中获得竞争优势。

    数据挖掘的定义

    数据挖掘是一门交叉学科,汇集了数据库、人工智能、统计学、可视化、并行计算等不同学科和领域。

    关于数据挖掘暂时没有一个统一的定义,以下几个定义比较常见:

    1.SAS研究所:在大量相关数据基础之上进行数据探索和建立相关模型的先进方法

    2.Hand等人:数据挖掘就是在大型数据库中寻找有意义、有价值信息的过程

    还有其他很多定义,我个人倾向于“数据挖掘是通过分析现存于数据库中的数据来解决问题的技术”。举个例子,我们要解决的问题在竞争激烈的市场中获得易变的顾客的忠诚。同时我们拥有一个数据库,它包含了顾客的个人信息和顾客的决策。通过分析以前顾客的信息,我们可以发现哪些顾客可能流失,哪些顾客会继续保持忠诚。

    数据挖掘的流程

    数据挖掘方法很多,但是大致的流程是相似的。

    1.问题定义

    明确数据挖掘任务的具体需求,同时确定所需要采用的具体方法

    2.数据收集和预处理

    确定数据挖掘任务所涉及的目标数据,对其进行消除噪音、消除重复数据等处理,然后降维

    3.数据挖掘实施

    4.数据结果解释

    以上流程是一个相对简单的流程,SPSS和NCR等曾提出一个跨行业数据挖掘过程标准,将数据挖掘项目分成6个阶段。具体的内容和介绍可以参考IT168的一篇文章

    数据挖掘的功能

    数据挖掘是为了从现有数据中获得信息,但它也不是万能,能够发现的知识主要是以下5种:

    1.概念知识

    类别特征的概括性描述知识。根据数据的微观特征发现同类事物带有普遍性的、较高层次概念的共同性质,是一种对数据的概况、提炼和抽象。

    2.关联知识

    主要反映一个事件和其他事件之间依赖或者关联性。如果两项或者多项属性之间存在关联,那么其中一项的属性值就可以根据其他属性值进行预测。这类知识发现方法中最有名的就是Apriori算法。

    3.分类知识

    主要反映同类事物的共同特征和不同事物之间的差异。

    4.预测性知识

    根据历史数据和当前数据对未来数据进行预测,主要是时间序列预测。

    5.偏差性知识

    这是对差异和阶段特例的揭示,如数据聚类的离群值等。

    相较于挖掘能够发现的知识而言,数据挖掘的方法类型很多,大致可以分为7类…

  • 进化计算简介和遗传算法的实现–AForge.NET框架的使用(六)

    进化计算简介和遗传算法的实现–AForge.NET框架的使用(六)

    开学了,各种忙起来了。

    上一篇介绍了AForge.NET在人工神经网络上的一点点使用,但是老觉不过瘾。matlab用着实在不习惯,就又琢磨了一下进化计算。

    进化计算简介

    进化计算算不上新的方法了,已经有大量研究人员作出了努力,这导致了大量的进化计算算法出现。他们不仅研究算法本身,还致力于扩大算法的应用范围。

    众所周知,现实世界存在大量复杂问题,它们中一部分无法用常规方法在合理的时间内获得精确解,而另一部分甚至没有行之有效的解决方案。

    最著名的例子就是TSP问题,该问题意在寻求单一旅行者由起点出发,通过所有给定的需求点之后,最后再回到原点的最小路径成本。

    而进化计算可以应用于这些问题,因为大多数情况下这类问题允许我们在合理时间内给出较优解。

    进化计算并不能保证找到特定问题的最佳解决方案,但是可以找到一个很好的解决办法,该方案可能是非常接近的最佳解决方案。

    进化算法的分支和运用

    进化计算是一些算法的统称,主要包括Genetic Algorithms (GA遗传算法), Genetic Programming (GP遗传规划) 和 Gene Expression Programming (GEP基因表达式编程)。

    进化算法主要可以解决以下类别问题:

    1.函数优化

    2.符号回归

    3.时间序列预测

    4.旅行商问题

    遗传算法简介

    Genetic Algorithms(遗传算法)最早由John Holland基于进化观点在1960提出。从那时起相关研究不断进行。

    大部分研究成果运用到很多领域,并取得了很好的效果。虽然遗传算法的历史悠久,但是目前还是不断有新的方法被提出,扩宽了运用领域。

     

    遗传算法基于达尔文的“适者生存”理论和遗传学机理的生物进化过程。算法作用于每一代的基因,而每个基因都是问题的可能解。

    一般遗传算法的运用有以下4个步骤:

    1.随机选择个体,并进行交叉

    2.变异

    3.计算适应度

    4.选择下一个世代的个体

    算法的停止条件一般是指定的迭代数目完成或者得到一个可靠解。

    交叉算法中最简单的单点交叉,即随机选择两个基因的一个点,交换两个基因的一部分。

    基因1:0
  • 人工神经网络简介和单层网络实现AND运算–AForge.NET框架的使用(五)

    人工神经网络简介和单层网络实现AND运算–AForge.NET框架的使用(五)

    前面4篇文章说的是模糊系统,它不同于传统的值逻辑,理论基础是模糊数学,所以有些朋友看着有点迷糊,如果有兴趣建议参考相关书籍,我推荐《模糊数学教程》,国防工业出版社,讲的很全,而且很便宜(我买成7元钱)。

    人工神经网络的简介

    人工神经网络是一种应用类似于大脑神经突触联接的结构进行信息处理的数学模型。它是一种运算模型,由大量神经元和相互的连接组成,每个神经元代表一种特定的输出函数,称为激励函数(activation function)。每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重(weight),用于模拟记忆。整个网络的输出则依网络的连接方式、权重值和激励函数的不同而不同。而网络自身通常都是对自然界某种算法或者函数的逼近,也可能是对一种逻辑策略的表达。

    人工神经网络的优势很明显,主要体现在以下三个方面:

    1.具有自学习功能

    2.具有联想存储功能

    3.具有高速寻找优化解的能力

    更多知识请参阅相关资料

    AForge.Net单层网络实现AND运算

    AForge.Net中有关神经网络的实现主要在AForge.Neuro中,用install-package AForge.Neuro获取。

    ann1-1

    我们按照一般步骤来:

    1.构建模型

    AND运算的话不用多讲,整理一下输入输出:

    [0,0]  ===>  [0]

    [1,0]  ===>  [0]

    [0,1]  ===>  [0]

    [1,1]  ===>  [1]

    可以很容易看出,输入是2个,输出是1个节点,层数单层足矣。

    代码:

    //整理输入输出数据 double[][] input = new double[4][]; double[][] output = new double[4][]; 
  • 模糊系统架构和简单实现–AForge.NET框架的使用(四)

    模糊系统架构和简单实现–AForge.NET框架的使用(四)

    先说一下,为什么题目是简单实现,因为我实在没有弄出好的例子。

    我原来用AForge.net做的项目中的模糊系统融入了神经网络和向量机,没法抽出来当例子,就用了个最老的自动车辆的例子。

    模糊系统(Fuzzy System)架构

    前面零零散散说来一下有关模糊系统和模糊理论的东西,这里来个总结。

    模煳系统的基本架构如图8.1所示,其中主要的功能方块包括:(1)模煳化机构、(2)模煳规则库、(3)模煳推论引擎、以及(4)去模煳化机构。

    fuzzy4-1

    模糊化机构是有关模糊集合和隶属度函数的内容。

    模糊规则前文也有提及,去模糊化只涉及了重心法一种,这里简单说一下模糊推理引擎。

    模糊推理引擎是模煳系统的核心,它可以藉由近似推论或模煳推论的进行,来模拟人类的思考决策模式,以达到解决问题的目地。

    比如:

    前提(premise)一:x is A’

    前提(premise)二:if x is A,y is B

    结论:y is B’

    fuzzy4-2

    模糊推理系统的简单实现

    在AForge.Net中的对应类是InferenceSystem。

    在程序实现中一个模糊推理系统(Fuzzy Inference System )由数据库(Database)和规则库(Rulebase)组成,一般操作如下:

    1.获取数值输入

    2.通过数据库(Database)将数值输入转为语意含义

    3.验证规则库(Rulebase)中的哪些规则被输入激活

    4.组合被激活的规则,得到模糊输出(Fuzzy Output)

    5.去模糊化(实现IDefuzzifier接口)

    下面看看例子,这个例子是关于控制车辆避免正面冲撞的系统。

    输入为距离,论域[0,120],隶属度函数

    fuzzy4-6

    输出为角度,论域[-10,50],隶属度函数

    fuzzy4-7

    核心代码:

    // 隶属度函数(距离) 
  • 子句判断、启动强度和去模糊化–AForge.NET框架的使用(三)

    子句判断、启动强度和去模糊化–AForge.NET框架的使用(三)

    使用AForge.NET进行模糊运算

    上一篇说来一些模糊运算的数学问题,用AForge.NET做相关运算就很简单了。

    1.联集运算中的标准联集

    数学:s (p,q) = max (p,q)

    程序:

    publicclass MaximumCoNorm : ICoNorm {publicfloatEvaluate(float membershipA,float membershipB ) {return Math.Max( membershipA, membershipB ); } }

    2.交集运算中的标准交集

    数学:t (p,q) = min (p,q)

    程序:

    publicclass MinimumNorm : INorm {publicfloatEvaluate(float membershipA,float membershipB ) {return