从文本分类问题中的特征词选择算法追踪如何将数学知识,数学理论迁移到实际工程中去...

博文转载请注明作者和出处(作者:finallyliuyu :出处博客园)

附:《卡方特征词选择算法》

  《DF特征词选择算法》

一.数学背景

数学知识、数学理论以及数学思想迁移到实际工程问题中,经常会促进工程问题的圆满解决。

可是如何将数学知识引入工程问题中呢?首先需要有“数学思维”例如理解数学公式所刻画的内涵;其次需要有“建模”能力:从不同的视角来看待同一个问题,最后抽象出的数学模型也可能会差别很大。比如有的数学模型有现成的解决方案可用,然而有的数学模型没有现成的解决方案可用;或者有的模型比其他模型能更好地刻画和表示实际问题。如果把在头脑中搜索适合待解决实际问题的数学工具定义为“数学思维”,把将实际问题抽象成数学模型的能力定义为"”数学建模”的话,只有这两种能力配合“默契”才能更好地解决实际问题。或许我们从文本分类问题中的各种特征词选择方法能够看到些端倪。

首先先来看一些公式的含义

QQ截图未命名

注意:上面的互信息公式有些错误,做如下更正:

QQ截图未命名

平均互信息:(或叫做信息增益)

IG

 

下面开开始介绍平均互信息与互信息在文本分类特征词选择算法中的应用

为了避免引起混淆,互信息在文本分类特征词选择中被称为point-wise MI;平均互信息被称作IG(Information Gain)。

参照 Manning《信息检索导论》p189页(王斌译作)的定义:

IG 公式为:

IG公式

point-wise MI公式为

Point-wise MI

二.下面给出实现这两种算法的代码C++代码

 

ExpandedBlockStart.gifpoint-wise MI 声明代码
double CalPointWiseMI(double N11,double N10,double N01,double N00);//计算pointwise MI;

vector
<pair<string,double> >PointWiseMIFeatureSelectionForPerclass(DICTIONARY& mymap,CONTINGENCY& contingencyTable,string classLabel);

void PointWiseMIFeatureSelection(vector<string > classLabels,DICTIONARY& mymap,CONTINGENCY& contingencyTable,int N,char * address);
ExpandedBlockStart.gif计算pointwiseMI的值
/************************************************************************/
/* 计算pointwiseMI的值                                                                     */
/************************************************************************/
double Preprocess:: CalPointWiseMI(double N11,double N10,double N01,double N00)
{
    
double pointwiseMI=0;
    
if(N11>0)
    {
        pointwiseMI
=log(N11+N10+N01+N00)+log(N11)-log(N11+N10)-log(N11+N01);
    }
    
return pointwiseMI;
}
ExpandedBlockStart.gif计算每个词对每个类别的pointwiseMI
/************************************************************************/
/* 计算每个词对每个类别的pointwiseMI                                                                     */
/************************************************************************/
vector
<pair<string,double> > Preprocess:: PointWiseMIFeatureSelectionForPerclass(DICTIONARY& mymap,CONTINGENCY& contingencyTable,string classLabel)
{
    
int N=endIndex-beginIndex+1;//总共的文章数目
    vector<string>tempvector;//词袋子中的所有词
    vector<pair<string,double> > MIInfo;
    
for(map<string,vector<pair<int,int>>>::iterator it=mymap.begin();it!=mymap.end();++it)
    {
        tempvector.push_back(it
->first);
    }
    
//计算卡方值
    for(vector<string>::iterator ittmp=tempvector.begin();ittmp!=tempvector.end();ittmp++)
    {
        
int N1=mymap[*ittmp].size();
        pair
<string,string> compoundKey=make_pair(*ittmp,classLabel);
        
double N11=double(contingencyTable[compoundKey].first);
        
double N01=double(contingencyTable[compoundKey].second);
        
double N10=double(N1-N11);
        
double N00=double(N-N1-N01);
        
double miValue=CalPointWiseMI(N11,N10,N01,N00);
        MIInfo.push_back(make_pair(
*ittmp,miValue));



    }
    
//按照卡方值从大到小将这些词排列起来
    stable_sort(MIInfo.begin(),    MIInfo.end(),isLarger);
    
return MIInfo;


}

 

 

 

 

ExpandedBlockStart.gifpoint-wise MI特征词选择法
/************************************************************************/
/* point-wise MI特征词选择法                                                                     */
/************************************************************************/
void Preprocess:: PointWiseMIFeatureSelection(vector<string > classLabels,DICTIONARY& mymap,CONTINGENCY& contingencyTable,int N,char * address)
{
    clock_t start,finish;
    
double totaltime;
    
int totalTraingingCorpus=endIndex-beginIndex+1;//训练语料库总共的文章数目
    set<string>finalKeywords;//存放最终遴选出的特征词
    vector<pair<string,double>>MIInfo;
    start
=clock();
    
for(vector<string>::iterator it=classLabels.begin();it!=classLabels.end();it++)
    {
        
//训练语料库中某个类别的文章数目
        int N_subClassCnt=getCategorizationNum(*it,"TrainingCorpus");
        
//threshold决定每个类别遴选多少个特征词
        int threshold=N_subClassCnt*N/totalTraingingCorpus;
        MIInfo
=PointWiseMIFeatureSelectionForPerclass(mymap,contingencyTable,*it);
        
for(vector<pair<string,double> >::size_type j=0;j<threshold;j++)
        {
            finalKeywords.insert(MIInfo[j].first);

        }
        MIInfo.clear();




    }


    ofstream outfile(address);
    
int finalKeyWordsCount=finalKeywords.size();
    
for (set<string>::iterator it=finalKeywords.begin();it!=finalKeywords.end();it++)
    {
        outfile
<<*it<<endl;

    }
    outfile.close();
    cout
<<"最后共选择特征词"<<finalKeyWordsCount<<endl;
    finish
=clock();
    totaltime
=(double)(finish-start)/CLOCKS_PER_SEC;
    cout
<<"遴选特征词共有了"<<totaltime<<endl;



}

 

 

ExpandedBlockStart.gif信息增益特征词选择算法
double CalInformationGain(double N11,double N10,double N01,double N00);//计算IG值
vector<pair<string,double> >InformationGainFeatureSelectionForPerclass(DICTIONARY& mymap,CONTINGENCY& contingencyTable,string classLabel);
void InformationGainFeatureSelection(vector<string > classLabels,DICTIONARY& mymap,CONTINGENCY& contingencyTable,int N,char * address);

 

 

 

 

ExpandedBlockStart.gif计算IG值
/************************************************************************/
/* 计算IG值                                                                     */
/************************************************************************/
double Preprocess::CalInformationGain(double N11,double N10,double N01,double N00)
{
    
double IG=0;
    
double Ntotal=N11+N10+N01+N00;
    
double N1_=N11+N10;
    
double N0_=N01+N00;
    
double N_0=N10+N00;
    
double N_1=N11+N01;
    
if(N11>0)
    {
        IG
+=N11/Ntotal*log(Ntotal*N11/(N1_*N_1));
    }
    
if(N10>0)
    {
        IG
+=N10/Ntotal*log(Ntotal*N10/(N1_*N_0));

    }
    
if(N01>0)
    {
        IG
+=N01/Ntotal*log(Ntotal*N01/(N0_*N_1));
    }
    
if(N00>0)
    {
        IG
+=N00/Ntotal*log(Ntotal*N00/(N0_*N_0));
    }

    
return IG;
}
ExpandedBlockStart.gif计算每个单词,对于某个类别的IG值,并排序
************************************************************************/
/* 计算每个单词,对于某个类别的IG值,并排序                                                                  */
/************************************************************************/
vector
<pair<string,double> > Preprocess:: InformationGainFeatureSelectionForPerclass(DICTIONARY& mymap,CONTINGENCY& contingencyTable,string classLabel)
{
    
int N=endIndex-beginIndex+1;//总共的文章数目
    vector<string>tempvector;//词袋子中的所有词
    vector<pair<string,double> > IGInfo;
    
for(map<string,vector<pair<int,int>>>::iterator it=mymap.begin();it!=mymap.end();++it)
    {
        tempvector.push_back(it
->first);
    }
    
//计算卡方值
    for(vector<string>::iterator ittmp=tempvector.begin();ittmp!=tempvector.end();ittmp++)
    {
        
int N1=mymap[*ittmp].size();
        pair
<string,string> compoundKey=make_pair(*ittmp,classLabel);
        
double N11=double(contingencyTable[compoundKey].first);
        
double N01=double(contingencyTable[compoundKey].second);
        
double N10=double(N1-N11);
        
double N00=double(N-N1-N01);
        
//double chiValue=CalChiSquareValue(N11,N10,N01,N00);
        double igValue=CalInformationGain(N11,N10,N01,N00);
        IGInfo.push_back(make_pair(
*ittmp,igValue));



    }
    
//按照卡方值从大到小将这些词排列起来
    stable_sort(IGInfo.begin(),IGInfo.end(),isLarger);
    
return IGInfo;

}

 

 

 

 

 

ExpandedBlockStart.gif信息增益特征词选择算法
/************************************************************************/
/*    信息增益特征词选择算法                                                                         */
/************************************************************************/
void Preprocess::InformationGainFeatureSelection(vector<string > classLabels,DICTIONARY& mymap,CONTINGENCY& contingencyTable,int N,char * address)
{
    clock_t start,finish;
    
double totaltime;
    
int totalTraingingCorpus=endIndex-beginIndex+1;//训练语料库总共的文章数目
    set<string>finalKeywords;//存放最终遴选出的特征词
    vector<pair<string,double>>IGInfo;
    start
=clock();
    
for(vector<string>::iterator it=classLabels.begin();it!=classLabels.end();it++)
    {
        
//训练语料库中某个类别的文章数目
        int N_subClassCnt=getCategorizationNum(*it,"TrainingCorpus");
        
//threshold决定每个类别遴选多少个特征词
        int threshold=N_subClassCnt*N/totalTraingingCorpus;
        IGInfo
=InformationGainFeatureSelectionForPerclass(mymap,contingencyTable,*it); 
        
for(vector<pair<string,double> >::size_type j=0;j<threshold;j++)
        {
            finalKeywords.insert(IGInfo[j].first);

        }
        IGInfo.clear();




    }


    ofstream outfile(address);
    
int finalKeyWordsCount=finalKeywords.size();
    
for (set<string>::iterator it=finalKeywords.begin();it!=finalKeywords.end();it++)
    {
        outfile
<<*it<<endl;

    }
    outfile.close();
    cout
<<"最后共选择特征词"<<finalKeyWordsCount<<endl;
    finish
=clock();
    totaltime
=(double)(finish-start)/CLOCKS_PER_SEC;
    cout
<<"遴选特征词共有了"<<totaltime<<endl;


}

 

 

附: DF特征词选择算法

转载于:https://www.cnblogs.com/finallyliuyu/archive/2010/10/04/1841820.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495757.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

裁掉杰森伯恩,招揽人工智能,AI间谍厉害在哪?

来源&#xff1a;智能相对论 作者&#xff1a; 岳文纶摘要&#xff1a;CIA宣布&#xff0c;计划用人工智能取代间谍。其技术开发副主任Dawn Meyerriecks表示&#xff0c;CIA正在适应新的情形&#xff0c;其主要对手是一台机器&#xff0c;而不是一名外国间谍。间谍&#xff0…

一步一步教你使用AgileEAS.NET基础类库进行应用开发-基础篇-通过SQL实现特殊业务...

前面的四篇文章演示ORM的一些常规操作与配置&#xff0c;通过前面的文章&#xff0c;应用开发人员要可以使用ORM开发出简单的应用&#xff0c;但是&#xff0c;ORM也不是万能钥匙&#xff0c;在业务应用中&#xff0c;还有很多是ORM解决不了的问题&#xff0c;对于这些问题&…

英特尔详解5G将如何助力VR的未来发展

来源&#xff1a;亿欧智库摘要&#xff1a;英特尔中国研究院通过重点研究通信和计算融合的方式&#xff0c;解释了5G在面对巨大数据洪流时数据处理和传输的方式&#xff0c;通过边缘计算的新方法&#xff0c;使VR达到传输要求。打造一个高效的通信和计算系统&#xff0c;通往我…

王爽 汇编语言第三版 第8章( 寻址方式 ) --- 数据处理的两个问题

第八章 数据处理的两个基本问题 8.6 综合应用 示例代码 1&#xff1a; assume cs:codesg,ds:datasgdatasg segmentdb 1024 dup (0) datasg endscodesg segmentstart:mov ax,datasgmov ds,axmov bx,60h ; 确定记录地址 ds:bxmov word ptr [bx0ch],38 ;…

综述AI未来:神经科学启发的类脑计算

来源&#xff1a;运筹OR帷幄 作者&#xff1a;周岩摘要&#xff1a;脑科学是一门实践性很强的交叉学科&#xff0c;包含了神经科学&#xff0c;医学&#xff0c;数学&#xff0c;计算科学等多门学科。随着近几年深度学习的迅速发展&#xff0c;人工智能成为了无论学术界还是互…

[翻译]Wine完全使用指南——从基本到高级[转]

转载自 : http://forum.ubuntu.org.cn/viewtopic.php?t72933为了回应最近网友的一些普遍问题&#xff0c;特此作以下说明&#xff1a; 1、如果发现wine的注册表没有相应的键值&#xff0c;要自己创建。有时候用命令不行的话&#xff0c;只能手动一个个添加。 2、wine还是一个…

Flask --- 框架快速入门

From&#xff1a;http://docs.jinkan.org/docs/flask/quickstart.html Flask 用户指南&#xff1a;http://docs.jinkan.org/docs/flask/index.html w3cschool.cn 的 Flask 教程&#xff1a;https://www.w3cschool.cn/flask/ 《Flask Web开发&#xff1a;基于Python的Web应用…

AI与基因科学的对话:从“人工智能”到“动物智能”

来源&#xff1a;亿欧网有人的地方就有江湖&#xff0c;巨头们一次次的“技术战役”就是现代江湖的样子。各家企业牢牢把握住科技就是第一生产力的关键&#xff0c;不断的较量平台、技术、场景、生态等多方面的综合实力&#xff0c;你方唱罢我登场好不热闹。在我们的认知中&…

顺序程序设计03 - 零基础入门学习C语言09

第三章&#xff1a;顺序程序设计03 让编程改变世界 Change the world by program 题目&#xff1a;输入三角形的三边长&#xff0c;求三角形面积。 已知三角形的三边长a,b,c&#xff0c;则该三角形的面积公式为&#xff1a; [caption id"attachment_64" align"a…

王爽 汇编语言第三版 第9章 转移指令的原理

第九章 转移指令的原理 汇编代码&#xff1a; assume cs:codesgcodesg segments: mov ax,bx ; mov ax,bx 的机器码占两个字节mov si, offset smov di, offset s0mov ax, cs:[si]mov cs:[di], axs0:nop ; nop 机器码占一个字节nopmov ax, 4c00hint 21h codesg ends end s 9…

触摸心灵-触觉感知和发展的模型

来源&#xff1a;计算机触觉触觉感知和发展的模型触觉感知模型是数学结构&#xff0c;试图解释触觉积累关于环境中的物体和试剂的信息的过程。 由于触觉是一种主动的感觉&#xff0c;即感觉器官在感觉过程中被移动&#xff0c;所以这些模型经常描述优化感知结果的运动策略。 触…

MFC 最详细入门教程

From&#xff1a;https://blog.csdn.net/wang18323834864/article/details/78621633/ Visual Studio 2019&#xff1a;https://visualstudio.microsoft.com/zh-hans/ 鸡啄米 ----- VS2010/MFC编程入门教程之目录和总结&#xff1a;http://www.jizhuomi.com/software/257.html …

没中、美这么大的统一市场,欧盟人工智能发展面临双重挑战

来源&#xff1a;澎湃新闻 作者&#xff1a;胡逸涵为在人工智能领域追赶中美两国&#xff0c;近日&#xff0c;欧盟将2020年前对人工智能&#xff08;AI&#xff09;的投资额增加约70%&#xff0c;至15亿欧元。欧盟希望到2020年底&#xff0c;整个欧盟在AI技术领域&#xff0…

人生的闲言碎语

1.人的一生 选对老师&#xff0c;智慧一生&#xff1b;选对伴侣&#xff0c;幸福一生&#xff1b;选对环境&#xff0c;快乐一生&#xff1b;选对朋友&#xff0c;甜蜜一生&#xff1b;选对行业&#xff0c;成就一生。 2.头头是道 人生一世&#xff0c;要起好头&#xff1a;…

error LNK2019: 无法解析的外部符号 WinMain,该符号在函数 int __cdecl invoke_main(void)”中被引用

From&#xff1a;https://blog.csdn.net/u012570056/article/details/74639894 一&#xff0c;问题描述 MSVCRTD.lib(exe_winmain.obj) : error LNK2019: 无法解析的外部符号 WinMain&#xff0c;该符号在函数 "int __cdecl invoke_main(void)" (?invoke_mainYAHXZ…

德国人工智能研究中心波尔特:人工智能与工业4.0并驾齐驱

来源&#xff1a;科技日报摘要&#xff1a;2013年德国政府提出的“工业4.0”战略就涵盖了人工智能。“工业4.0”战略着重在制造业等领域相互利用。以深度学习、自我升级为主要特征的人工智能有望将人类各方面智能拓展到极限&#xff0c;从而在各领域做到极致。人工智能的研发在…

C++ 基本数据类型 的 字节数

From&#xff1a;https://www.cnblogs.com/qiumingcheng/p/7824919.html C语言入门经典——基础知识&#xff08;数据类型&#xff09;&#xff1a;https://blog.csdn.net/weixin_42167759/article/details/80404815 闲聊c/c: 各平台下基本数据类型的字节长度&#xff1a;htt…

协作机器人的江湖:把人放在首位

来源&#xff1a;机器人创新生态 作者&#xff1a;张有凤远离硅谷及亚洲电子产业中心的地方&#xff0c;一个拥有许多灵魂的小创业公司正在掀起波澜。在伊利湖东端&#xff0c;一个由丹麦移民创办的公司正在布法罗市中心的所有地方建造移动计算机。在美国平板制造厂商Bak的厂…

Visual Assist X 安装、使用 和 快捷键

Visual Assist 官网地址&#xff1a;https://www.wholetomato.com visual Assist 快捷键大全&#xff1a;https://blog.csdn.net/dddd0216/article/details/80082885 Visual Assist X的使用&#xff1a;https://jingyan.baidu.com/article/380abd0a4844111d90192c9a.html Vi…