1.VC+++++是什么?
2.计算机视觉算法有哪些?CV算法
3.如何系统地学习量化交易?
4.深入剖析jieba分词机制
5.jiebaåè¯è¯¦è§£
6.jieba源码解析(一)——中文分词
VC+++++是什么?
VC++是微软公司开发的一个IDE(集成开发环境),换句话说,就是使用c++的一个开发平台.有些软件就是这个编出来的...另外还有VB,VF.只是使用不同语言...但是,
vc++是Windows平台上的C++编程环境,学习VC要了解很多Windows平台的特性并且还要掌握MFC、ATL、COM等的知识,难度比较大。Windows下编程需要了解Windows的源码安装rpmbuild消息机制以及回调(callback)函数的原理;MFC是WinAPI的包装类,需要理解文档视图类的结构,窗口类的结构,消息流向等等;COM是代码共享的二进制标准,需要掌握其基本原理等等。
VC作为一个主流的开发平台一直深受编程爱好者的喜爱,但是很多人却对它的入门感到难于上青天,究其原因主要是大家对他错误的认识造成的,严格的来说VC++不是门语言,虽然它和C++之间有密切的关系,如果形象点比喻的话,可以把C++看作为一种“工业标准”,而VC++则是某种操作系统平台下的“厂商标准”,而“厂商标准”是在遵循“工业标准”的前提下扩展而来的。
VC++应用程序的开发主要有两种模式,一种是WIN API方式,另一种则是MFC方式,传统的WIN API开发方式比较繁琐,而MFC则是对WIN API再次封装,所以MFC相对于WIN API开发更具备效率优势,但为了对WINDOWS开发有一个较为全面细致的认识,笔者在这里还是以讲解WIN API的相关内容为主线。
话说到这里可能更多人关心的是学习VC++需要具备什么条件,为什么对于这扇门屡攻不破呢?
要想学习好VC必须具备良好的C/C++的基础,必要的英语阅读能力也是必不可少的,因为大量的帝国 企业 网站 源码技术文档多以英文形式发布。
[编辑本段]VC++中播放声音的方法
声音是多媒体的一个重要组成部分,在应用程序中加入声音可以使界面更友好。在VC++中可以根据不同的应用要求,用不同的方法实现声音的播放。
一.播放声音文件的简单方法
在VC++ 中的多媒体动态连接库中提供了一组与音频设备有关的函数。利用这些函数可以方便地播放声音。最简单的播放声音方法就是直接调用VC++中提供的声音播放函数BOOL sndPlaySound ( LPCSTR lpszSound,UINT fuSound ); 或BOOL PlaySound( LPCSTR lpszSound, HMODULE hmod, DWORD fuSound );其中参数lpszSound是需要播放声音的.WAV文件的路径和文件名, hmod在这里为NULL,fuSound是播放声音的标志,详细说明请参考VC++中的帮助。 例如播放C:soundmusic.wav可以用sndPlaySound ("c:\sound\music.wav",SND_ASYNC);或PlaySound("c:\sound\music.wav",NULL, SND_ASYNC|SND_NODEFAULT );如果没有找到music.wav文件,第一种格式将播放系统默认的声音,第二种格式不会播放系统默认的声音。
二.将声音文件加入到程序中
在VC++的程序设计中,可以利用各种标准的资源,如位图,菜单,对话框等。同时VC++也允许用户自定义资源,因此我们可以将声音文件作为用户自定义资源加入程序资源文件中,经过编译连接生成EXE文件,实现无.WAV文件的声音播放。
要实现作为资源的声音文件的播放,首先要在资源管理器中加入待播放的声音文件(实现过程并不复杂,这里不在叙述)。假设生成的声音文件资源标识符为IDR_WAVE1。在播放时只需要调用下面的语句:
PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(), SND_ASYNC|SND_RESOURCE|SND_NODEFAULT|SND_LOOP);
其中MAKEINTRESOURCE()宏将整数资源标识符转变为字符串,AfxGetResourceHandle()函数返回包含资源的模块句柄,
SND_RESOURCE是星盘查询 源码必须的标志。
作为资源的声音文件的第二种播放方法是把资源读入内存后作为内存数据播放。具体步骤入下:
1.获得包含资源的模块句柄:
HMODULE hmod=AfxGetResourceHandle();
2.检索资源块信息:
HRSRC hSndResource=FindResource(hmod,MAKEINTRESOURCE(IDR_WAVE1),_T("WAVE"));
3. 装载资源数据并加锁:
HGLOBAL hGlobalMem=LoadResource(hmod,hSndResource);
LPCTSTR lpMemSound=(LPCSTR)LockResource(hGlobalMem);
4.播放声音文件:
sndPlaySound(lpMemSound,SND_MEMORY));
5.释放资源句柄:
FreeResource(hGlobalMem);
三.播放声音文件的高级方法
在VC++中提供了一组对音频设备及多媒体文件直接进行操作的函数。利用这些函数可以灵活地对声音文件进行各种处理。
首先介绍几个要用到的数据结构。WAVEFORMATEX结构定义了WAVE音频数据文件的格式。WAVEHDR结构定义了波形音频缓冲区。读出的数据首先要填充此缓冲区才能送音频设备播放。WAVEOUTCAPS结构描述了音频设备的性能。MMCKINFO结构包含了RIFF文件中一个块的信息。详细的说明请参考VC++中的帮助。
下面给出程序流程简图及程序源代码清单,在VC++环境下可直接使用:
源程序清单如下:
LPSTR szFileName;//声音文件名
MMCKINFO mmckinfoParent;
MMCKINFO mmckinfoSubChunk;
DWORD dwFmtSize;
HMMIO m_hmmio;//音频文件句柄
DWORD m_WaveLong;
HPSTR lpData;//音频数据
HANDLE m_hData;
HANDLE m_hFormat;
WAVEFORMATEX * lpFormat;
DWORD m_dwDataOffset;
DWORD m_dwDataSize;
WAVEHDR pWaveOutHdr;
WAVEOUTCAPS pwoc;
HWAVEOUT hWaveOut;
//打开波形文件
if(!(m_hmmio=mmioOpen(szFileName,NULL,MMIO_READ|MMIO_ALLOCBUF)))
{
//File open Error
Error("Failed to open the file.");//错误处理函数
return false;
}
//检查打开文件是否是声音文件
mmckinfoParent.fccType =mmioFOURCC(’W’,’A’,’V’,’E’);
if(mmioDescend(m_hmmio,(LPMMCKINFO)&mmckinfoParent,NULL,MMIO_FINDRIFF))
{
//NOT WAVE FILE AND QUIT
}
//寻找 ’fmt’ 块
mmckinfoSubChunk.ckid =mmioFOURCC(’f’,’m’,’t’,’ ’);
if(mmioDescend(m_hmmio,&mmckinfoSubChunk,&mmckinfoParent,MMIO_FINDCHUNK))
{
//Can’t find ’fmt’ chunk
}
//获得 ’fmt ’块的大小,申请内存
dwFmtSize=mmckinfoSubChunk.cksize ;
m_hFormat=LocalAlloc(LMEM_MOVEABLE,LOWORD(dwFmtSize));
if(!m_hFormat)
{
//failed alloc memory
}
lpFormat=(WAVEFORMATEX*)LocalLock(m_hFormat);
if(!lpFormat)
{
//failed to lock the memory
}
if((unsigned long)mmioRead(m_hmmio,(HPSTR)lpFormat,dwFmtSize)!=dwFmtSize)
{
//failed to read format chunk
}
//离开 fmt 块
mmioAscend(m_hmmio,&mmckinfoSubChunk,0);
//寻找 ’data’ 块
mmckinfoSubChunk.ckid=mmioFOURCC(’d’,’a’,’t’,’a’);
if(mmioDescend(m_hmmio,&mmckinfoSubChunk,&mmckinfoParent,MMIO_FINDCHUNK))
{
//Can’t find ’data’ chunk
}
//获得 ’data’块的大小
m_dwDataSize=mmckinfoSubChunk.cksize ;
m_dwDataOffset =mmckinfoSubChunk.dwDataOffset ;
if(m_dwDataSize==0L)
{
//no data in the ’data’ chunk
}
//为音频数据分配内存
lpData=new char[m_dwDataSize];
if(!lpData)
{
//faile
}
if(mmioSeek(m_hmmio,SoundOffset,SEEK_SET)<0)
{
//Failed to read the data chunk
}
m_WaveLong=mmioRead(m_hmmio,lpData,SoundLong);
if(m_WaveLong<0)
{
//Failed to read the data chunk
}
//检查音频设备,返回音频输出设备的性能
if(waveOutGetDeVCaps(WAVE_MAPPER,&pwoc,sizeof(WAVEOUTCAPS))!=0)
{
//Unable to allocate or lock memory
}
//检查音频输出设备是否能播放指定的音频文件
if(waveOutOpen(&hWaveOut,DevsNum,lpFormat,NULL,NULL,CALLBACK_NULL)!=0)
{
//Failed to OPEN the wave out devices
}
//准备待播放的数据
pWaveOutHdr.lpData =(HPSTR)lpData;
pWaveOutHdr.dwBufferLength =m_WaveLong;
pWaveOutHdr.dwFlags =0;
if(waveOutPrepareHeader(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR))!=0)
{
//Failed to prepare the wave data buffer
}
//播放音频数据文件
if(waveOutWrite(hWaveOut,&pWaveOutHdr,sizeof(WAVEHDR))!=0)
{
//Failed to write the wave data buffer
}
//关闭音频输出设备,释放内存
waveOutReset(hWaveOut);
waveOutClose(hWaveOut);
LocalUnlock(m_hFormat);
LocalFree(m_hFormat);
delete [] lpData;
说明:1)以上使用的音频设备和声音文件操作函数的声明包含在mmsystem.h头文件中,因此在程序中必须用#include "mmsystem.h"语句加入头文件。同时在编译时要加入动态连接导入库winmm.lib,具体实现方法是从Developer Studio的Project菜单中选择Settings,然后在Link选项卡上的Object/Library Modules控制中加入winmm.lib。2)在pWaveOutHdr.lpData中指定不同的数据,可以播放音频数据文件中任意指定位置的声音。3) 以上程序均在VC++6.0中调试通过,在文中省略了对错误及异常情况的处理,在实际应用中必须加入。
四.结论
在VC++中可以根据应用需要采用不同的方法播放声音文件。简单应用可以直接调用声音播放函数。第二种方法可以把声音作为资源加入可执行文件中。如果在播放之前要对声音数据进行处理,可用第三种方法。
计算机视觉算法有哪些?CV算法
计算机视觉是易游模块源码深度学习领域内备受关注的分支,它汇聚了计算机科学、数学、工程、物理学以及心理学等多个学科的知识。关于计算机视觉算法有哪些,业内专家给出了以下解答。
早期算法包括:
子空间(线性降维)
PCA(主成分分析):旨在最大限度地保留原始数据的主要信息,同时降低冗余信息;
LDA(线性判别分析):通过增大类间差距、减小类内差距来实现分类;
非线性降维:流形学习、加入核函数等方法。
ICA(独立成分分析):相较于PCA,ICA在处理光照、人脸表情、姿态等方面具有更好的效果,但其泛化能力有限。
HMM(隐马尔可夫):相比其他算法,HMM在处理光照变化、表情和姿态变化等方面更加鲁棒。
后期算法:通过loss函数优化模型结构,从而得到具有区分度的特征。
常用算法总结:
计算机视觉相关算法的源代码;
计算机视觉常用算法博客。
特征提取算法(寻找关键点):
(1) SIFT(尺度不变特征变换):具有尺度不变性,能够在图像中检测到关键点;
(2) SURF(加速稳健特征,SIFT加速版):通过构建Hessian矩阵,判断当前点是否为邻近区域中更亮或更暗的点,从而确定关键点位置;
优:特征稳定;
缺:对于边缘光滑的目标提取能力较弱。
(3) ORB:结合Fast与Brief算法,为Fast特征点增加方向性,小杰授权站源码实现旋转不变性,并提出金字塔方法解决尺度不变性问题;
ORB算法速度是SIFT的倍,是SURF的倍。
经观察,ORB算法在特征点标记时数量较少,如图所示。
SIFT、SURF、ORB实现;
(4) FAST角点检测:主要考虑像素点附近的圆形窗口上的个像素,通过比较像素强度,判断是否为角点;
非极大值抑制:在存在多个关键点时,删除角响应度较小的特征点。
(5) HOG(方向梯度直方图);
(6) LBP(局部二值特征):论述了高维特征与验证性能的正相关关系,即人脸维度越高,验证的准确度就越高。
(7) Haar:
如何系统地学习量化交易?
有TB和matlab就基本足够了,实现的话c++比较好。当然要看自身的知识背景和技术水平。
我的理解其实做量化交易很难有一个所谓的系统学习的过程,量化只是手段,交易的逻辑是多元化的,你可以通过形态描述、追踪市场不合理价差等手段切入,也可以把天体物理、小波分析、神经网络等复杂模型应用其中,你可以做的是K线结构上的策略,也可以做日线或每毫秒数据进行决策的策略。
所有的一切目的就是为了获利,所谓量化和程序化只是实现这一目的的手段。
你可以通过各种手段了解做量化时注意的细节,比如如何避免使用未来函数、如何理解每一条数据的意义、测试与实盘之间的差异、不同测试软件的优缺点等等。但你没法去“学习”量化交易,因为不会有人把自己真正赚钱的东西拿出来,如何赚钱必须自己去挖掘
首先从高频交易分类来说,您研究的期现套利只是其中一种,股指期货刚推出的时候和现货的期现套利收益率还不错,近两年低到有时甚至不到无风险收益率。国债期货和现货套利空间在推出后很快就消失了。以后推出了期权,可能会有一定机会,但应该风险很高。其实从国外来看,高频交易最大的用处是做市商交易,快进快出提供市场流动性,这种策略在中国订单驱动市场显然很难。然后就是后面答案中提到的趋势交易,利用KDJ,SAR,海龟法,割头皮法之类的策略判断市场方向进行交易,这也是国内期货公司和大部分量化私募的方向。不得不说,这种策略参数选择基于过去,可能会过度优化参数或者加入拍脑袋主观想法,有时候赚很多倍有时候很快赔光。一般的策略都回撤太高不适合投资。最后有一种,是目前我所了解的比较先进的方法, 隐含马尔可夫模型(HMM),这也是西蒙斯的文艺复兴在做的方法。具体策略我学识有限了解不深,这是一种随机过程的方法,《数学之美》里介绍过利用HMM来语音识别。因此,我建议题主如果真的有志于高频交易应该首先读一个数学或者计算物理的博士,编程能力并不是高频交易的核心竞争力,数学理论才是。当然,本人阅历能力有限,仅了解皮毛,随口一说,欢迎拍砖
深入剖析jieba分词机制
中文分词:打造最优Python中文词组划分模块。
引言:采用清晰明了的解释方式,结合源码,深入解析Jieba分词的基本原理
算法基本逻辑:构建全局前缀词典、建立有向无环图(DAG)
以sentence="基坑支护施工"为例,首先构建前缀词典,初始化并建立jieba自带词典、前缀词典和用户词典,注意词典中包含"4S店"时,前缀词典会生成"4"、"4S"、"4S店"。接着构建待分词语句的DAG图,通过两层循环判断当前词汇是否在前缀词典中,以实现分词有向无环图的建立。
动态规划选取最大词频路径:计算可能性最大的路径,使用动态规划算法找出基于词频的最大切分组合。
公式描述:其中,每条路径的概率计算基于词在前缀词典里的词频与所有词的词频之和的比值。如果词频为0或不存在,则视为词频为1。取对数概率,通过相加计算替代相乘,以防止下溢。
未登录词优化:对于未登录词,采用基于汉字成词能力的HMM模型,通过Viterbi算法优化分词结果。
总结:Jieba分词通过构建全局前缀词典、构建有向无环图、动态规划选取最大词频路径和优化未登录词,实现了高效、准确的中文文本划分,满足不同领域专业词汇的分词需求。
jiebaåè¯è¯¦è§£
âç»å·´âåè¯æ¯ä¸ä¸ªPython ä¸æåè¯ç»ä»¶ï¼åè§ /fxsjy/jiebaå¯ä»¥å¯¹ä¸æææ¬è¿è¡åè¯ãè¯æ§æ 注ãå ³é®è¯æ½åçåè½ï¼å¹¶ä¸æ¯æèªå®ä¹è¯å ¸ã
æ¬æå æ¬ä»¥ä¸å 容ï¼
1ãjiebaåè¯å çå®è£
2ãjiebaåè¯ç使ç¨æç¨
3ãjiebaåè¯çå·¥ä½åçä¸å·¥ä½æµç¨
4ãjiebaåè¯ææ¶åå°çHMMãTextRankãTF-IDFçç®æ³ä»ç»
å¯ä»¥ç´æ¥ä½¿ç¨pipæ¥è¿è¡å®è£ ï¼
sudo pip install jieba
æè
sudo pip3 install jieba
å ³é®è¯æ½åæ两ç§ç®æ³ï¼åºäºTF-IDFååºäºTextRankï¼
jiebaåè¯æä¸ç§ä¸åçåè¯æ¨¡å¼ï¼ç²¾ç¡®æ¨¡å¼ãå ¨æ¨¡å¼åæç´¢å¼æ模å¼ï¼
对åºçï¼å½æ°åå lå³æ¯å¯¹åºå¾å°listç»æçå½æ°ï¼
精确模å¼æ¯æ常ç¨çåè¯æ¹æ³ï¼å ¨æ¨¡å¼ä¼å°å¥åä¸ææå¯è½çè¯é½å举åºæ¥ï¼æç´¢å¼æ模å¼åéç¨äºæç´¢å¼æ使ç¨ãå ·ä½çå·®å«å¯å¨ä¸ä¸èå·¥ä½æµç¨çåæä¸è¯¦è¿°ã
å¨ä¸è¿°æ¯ä¸ªå½æ°ä¸ï¼é½æå为HMMçåæ°ãè¿ä¸é¡¹è¡¨ç¤ºæ¯å¦å¨åè¯è¿ç¨ä¸å©ç¨HMMè¿è¡æ°è¯åç°ãå ³äºHMMï¼æ¬æéå½ä¸å°ç®è¿°ç¸å ³ç¥è¯ã
å¦å¤åè¯æ¯æèªå®ä¹åå ¸ï¼è¯å ¸æ ¼å¼å dict.txt ä¸æ ·ï¼ä¸ä¸ªè¯å ä¸è¡ï¼æ¯ä¸è¡åä¸é¨åï¼è¯è¯ãè¯é¢ï¼å¯çç¥ï¼ãè¯æ§ï¼å¯çç¥ï¼ï¼ç¨ç©ºæ ¼éå¼ï¼é¡ºåºä¸å¯é¢ åã
å ·ä½ä½¿ç¨æ¹æ³ä¸ºï¼
å ³é®è¯æ½åç两个å½æ°çå®æ´åæ°ä¸ºï¼
å¯ä»¥éè¿
æ¥æå¼æå ³é并è¡åè¯åè½ã
个人æè§ä¸è¬ç¨ä¸å°ï¼å¤§æ件åè¯éè¦æå¨å®ç°å¤è¿ç¨å¹¶è¡ï¼å¥ååè¯ä¹ä¸è³äºç¨è¿ä¸ªã
jiebaåè¯ä¸»è¦éè¿è¯å ¸æ¥è¿è¡åè¯åè¯æ§æ 注ï¼ä¸¤è 使ç¨äºä¸ä¸ªç¸åçè¯å ¸ãæ£å å¦æ¤ï¼åè¯çç»æä¼å£å°å¾å¤§ç¨åº¦ä¸åå³äºè¯å ¸ï¼è½ç¶ä½¿ç¨äºHMMæ¥è¿è¡æ°è¯åç°ã
jiebaåè¯å æ´ä½çå·¥ä½æµç¨å¦ä¸å¾æ示ï¼
ä¸é¢å°æ ¹æ®æºç 详ç»å°åæå个模åçå·¥ä½æµç¨ã
å¨ä¹åå èä¸ï¼æ们å¨èè²çæ¹æ¡ä¸ç¤ºèäºå ³é®æ¥éª¤çè¾åºæ ·ä¾æè¯å ¸æ件çæ ¼å¼æ ·ä¾ãå¨æ¬èä¸é½éç¨ç±»ä¼¼ç表示æ¹å¼ã
jiebaåè¯ä¸ï¼é¦å éè¿å¯¹ç §å ¸çæå¥åçæåæ ç¯å¾ï¼åæ ¹æ®éæ©ç模å¼ä¸åï¼æ ¹æ®è¯å ¸å¯»æ¾æçè·¯å¾å对å¥åè¿è¡æªåæç´æ¥å¯¹å¥åè¿è¡æªåã对äºæªç»éè¯ï¼ä¸å¨è¯å ¸ä¸çè¯ï¼ä½¿ç¨HMMè¿è¡æ°è¯åç°ã
è¯å ¸çæ ¼å¼åºä¸º
word1 freq1 word_type1
word2 freq2 word_type2
â¦
å ¶ä¸èªå®ä¹ç¨æ·è¯å ¸ä¸è¯æ§word_typeå¯ä»¥çç¥ã
è¯å ¸å¨å ¶ä»æ¨¡åçæµç¨ä¸å¯è½ä¹ä¼ç¨å°ï¼ä¸ºæ¹ä¾¿åè¿°ï¼åç»çæµç¨å¾ä¸å°ä¼çç¥è¯å ¸çåå§åé¨åã
å¾bæ¼ç¤ºäºæç´¢å¼æ模å¼çå·¥ä½æµç¨ï¼å®ä¼å¨ç²¾ç¡®æ¨¡å¼åè¯çåºç¡ä¸ï¼å°é¿è¯å次è¿è¡ååã
å¨è¿éæ们åå®è¯»è å·²ç»äºè§£HMMç¸å ³ç¥è¯ï¼å¦æ没æå¯å è¡é 读ä¸ä¸ç« å 容ä¸çHMMç¸å ³é¨åæè è·³è¿æ¬èã
å¨jiebaåè¯ä¸ï¼å°åå¨è¯ä¸çä½ç½®BãMãEãSä½ä¸ºéèç¶æï¼åæ¯è§æµç¶æï¼ä½¿ç¨äºè¯å ¸æ件åå«åå¨åä¹é´ç表ç°æ¦çç©éµï¼finalseg/prob_emit.pyï¼ãåå§æ¦çåé(finalseg/prob_start.py)å转移æ¦çç©éµ(finalseg/prob_trans.py)ãè¿å°±æ¯ä¸ä¸ªæ åç解ç é®é¢ï¼æ ¹æ®æ¦çåå©ç¨viterbiç®æ³å¯¹æ大å¯è½çéèç¶æè¿è¡æ±è§£ã
è¯æ§åæé¨åä¸åè¯æ¨¡åç¨äºåä¸ä¸ªåºç¡çåè¯å¨ï¼å¯¹äºè¯å ¸è¯çè¯æ§ï¼å°ç´æ¥ä»è¯å ¸ä¸æåï¼ä½æ¯å¯¹äºæ°è¯ï¼è¯æ§åæé¨åæä¸ä¸ªä¸å±çæ°è¯åå ¶è¯æ§çåç°æ¨¡åã
ç¨äºè¯æ§æ 注çHMM模åä¸ç¨äºåè¯çHMM模åç¸ä¼¼ï¼åæ ·å°æååºåè§ä¸ºå¯è§ç¶æï¼ä½æ¯éèç¶æä¸åæ¯ååçè¯çä½ç½®ï¼B/E/M/Sï¼ï¼èåæäºè¯çä½ç½®ä¸è¯æ§çç»åï¼å¦(B,v)(B,n)(S,n)ççãå æ¤å ¶åå§æ¦çåéã转移æ¦çç©éµå表ç°æ¦çç©éµåä¸ä¸èä¸æç¨çç¸æ¯é½è¦åºå¤§çå¤ï¼ä½æ¯å ¶æ¬è´¨ä»¥åè¿ç®æ¥éª¤é½æ²¡æååã
å ·ä½çå·¥ä½æµç¨å¦ä¸å¾æ示ã
jiebaåè¯ä¸æ两ç§ä¸åçç¨äºå ³é®è¯æ½åçç®æ³ï¼åå«ä¸ºTextRankåTF-IDFãå®ç°æµç¨æ¯è¾ç®åï¼å ¶æ ¸å¿å¨äºç®æ³æ¬èº«ãä¸é¢ç®åå°ç»åºå®ç°æµç¨ï¼å ·ä½çç®æ³å¯ä»¥åé ä¸ä¸ç« å 容ã
TextRankæ¹æ³é»è®¤çéè¯æ§ï¼èTF-IDFæ¹æ³æ¨¡åä¸è¿è¡è¯æ§çéã
å¨æ¬ç« ä¸ï¼å°ä¼ç®åä»ç»ç¸å ³çç®æ³ç¥è¯ï¼ä¸»è¦å æ¬ç¨äºæ°è¯åç°çé马å°ç§å¤«æ¨¡ååç»´ç¹æ¯ç®æ³ãç¨äºå ³é®è¯æåçTextRankåTF-IDFç®æ³ã
HMMå³é马å°ç§å¤«æ¨¡åï¼æ¯ä¸ç§åºäºé©¬å°ç§å¤«å设çç»è®¡æ¨¡åãä¹æ以为âéâï¼æ¯å 为ç¸è¾äºé©¬å°ç§å¤«è¿ç¨HMMæçæªç¥çåæ°ãå¨ä¸çä¸ï¼è½çå°çå¾å¾é½æ¯è¡¨è±¡ï¼èäºç©ççæ£ç¶æå¾å¾é½éå«å¨è¡¨è±¡ä¹ä¸ï¼å¹¶ä¸ä¸è¡¨è±¡æä¸å®çå ³èå ³ç³»ã
å ¶ä¸ï¼SãOåå«è¡¨ç¤ºç¶æåºåä¸è§æµåºåã
å¦æ读è è¿å¯¹è¿é¨åå 容å¿åçé®ï¼ä¸å¦¨å å¾ä¸é 读ï¼ä¸é¢æ们å°ä»¥ä¸ä¸ªæ¯è¾ç®åçä¾å对HMMå解ç ç®æ³è¿è¡å®é 说æä¸æ¼ç¤ºï¼å¨è¯»å®ä¸ä¸å°èä¹åååæ¥çè¿äºå¼åï¼æ许è½å¤æç¶å¤§æã
ä¸é¢ä»¥ä¸ä¸ªç®åçä¾åæ¥è¿è¡éè¿°ï¼
å设å°ææä¸ä¸ªç½åå°çº¢ï¼å°çº¢æ¯å¤©é½ä¼å¨æåå说æèªå·±ä»å¤©åäºä»ä¹ï¼å¹¶ä¸åè®¾å ¶ä» åå½å¤©å¤©æ°çå½±åï¼èå½å¤©ç天æ°ä¹åªååä¸å¤©å¤©æ°çå½±åã
äºå°æèè¨ï¼å°çº¢æ¯å¤©åäºä»ä¹æ¯å¯è§ç¶æï¼èå°çº¢é£éç天æ°å¦ä½å°±æ¯éèç¶æï¼è¿å°±ææäºä¸ä¸ªHMM模åãä¸ä¸ªHMM模åéè¦æäºä¸ªè¦ç´ ï¼éèç¶æéãè§æµéã转移æ¦çãè§æµæ¦çååå§ç¶ææ¦çã
å³å¨ç¬¬j个éèç¶ææ¶ï¼è¡¨ç°ä¸ºi表ç°ç¶æçæ¦çãå¼ä¸çnåm表示éèç¶æéåè§æµéä¸çæ°éã
æ¬ä¾ä¸å¨ä¸åç天æ°ä¸ï¼å°çº¢è¦åä¸åäºæ çæ¦çä¹ä¸åï¼è§æµæ¦çä»¥è¡¨æ ¼çå½¢å¼åç°å¦ä¸ï¼
å ¶ä¸
é¤æ¤ä¹å¤ï¼è¿éè¦ä¸ä¸ªåå§ç¶ææ¦çåéÏï¼å®è¡¨ç¤ºäºè§æµå¼å§æ¶ï¼å³t=0æ¶ï¼éèç¶æçæ¦çå¼ãæ¬ä¾ä¸æ们æå®Ï={ 0,0,1}ã
è³æ¤ï¼ä¸ä¸ªå®æ´çé马å°ç§å¤«æ¨¡åå·²ç»å®ä¹å®æ¯äºã
HMMä¸è¬ç±ä¸ç±»é®é¢ï¼
æ¦ç计ç®é®é¢ï¼å³ç»å®A,B,Ïåéèç¶æåºåï¼è®¡ç®è§æµåºåçæ¦çï¼
é¢æµé®é¢ï¼ä¹æ解ç é®é¢ï¼å·²ç¥A,B,Ïåè§æµåºåï¼æ±æä¼å¯è½å¯¹åºçç¶æåºåï¼
å¦ä¹ é®é¢ï¼å·²ç¥è§æµåºåï¼ä¼°è®¡æ¨¡åçA,B,Ïåæ°ï¼ä½¿å¾å¨è¯¥æ¨¡åä¸è§æµåºåçæ¦çæ大ï¼å³ç¨æ大似ç¶ä¼°è®¡çæ¹æ³ä¼°è®¡åæ°ã
å¨jiebaåè¯ä¸æç¨çæ¯è§£ç é®é¢ï¼æ以æ¤å¤å¯¹é¢æµé®é¢åå¦ä¹ é®é¢ä¸åæ·±å ¥æ¢è®¨ï¼å¨ä¸ä¸å°èä¸æ们å°ç»§ç»ä»¥æ¬èä¸çä¾å为ä¾ï¼å¯¹è§£ç é®é¢è¿è¡æ±è§£ã
å¨jiebaåè¯ä¸ï¼éç¨äºHMMè¿è¡æ°è¯åç°ï¼å®å°æ¯ä¸ä¸ªå表示为B/M/E/Såå«ä»£è¡¨åºç°å¨è¯å¤´ãè¯ä¸ãè¯å°¾ä»¥åååæè¯ãå°B/M/E/Sä½ä¸ºHMMçéèç¶æï¼èè¿ç»çå个ååä½ä¸ºè§æµç¶æï¼å ¶ä»»å¡å³ä¸ºå©ç¨è§æµç¶æé¢æµéèç¶æï¼å¹¶ä¸å ¶æ¨¡åçA,B,Ïæ¦çå·²ç»ç»åºå¨æ件ä¸ï¼æ以è¿æ¯ä¸ä¸ªæ åç解ç é®é¢ãå¨jiebaåè¯ä¸éç¨äºViterbiç®æ³æ¥è¿è¡æ±è§£ã
Viterbiç®æ³çåºæ¬ææ³æ¯ï¼å¦ææ佳路å¾ç»è¿ä¸ä¸ªç¹ï¼é£ä¹èµ·å§ç¹å°è¿ä¸ªç¹çè·¯å¾ä¸å®æ¯æçè·¯å¾ï¼å¦åç¨èµ·å§ç¹å°è¿ç¹æ´ççä¸æ¡è·¯å¾ä»£æ¿è¿æ®µï¼å°±ä¼å¾å°æ´ççè·¯å¾ï¼è¿æ¾ç¶æ¯çç¾çï¼ä»èµ·å§ç¹å°ç»æç¹çè·¯å¾ï¼å¿ ç¶è¦ç»è¿ç¬¬n个æ¶å»ï¼åå¦ç¬¬n个æ¶å»æk个ç¶æï¼é£ä¹æç»è·¯å¾ä¸å®ç»è¿èµ·å§ç¹å°æ¶å»nä¸k个ç¶æéæçè·¯å¾çç¹ã
å°æ¶å»téèç¶æ为iææå¯è½çç¶æ转移路å¾i1å°i2çç¶ææ大å¼è®°ä¸º
ä¸é¢æ们继ç»ä»¥ä¸ä¸èä¸çä¾åæ¥å¯¹viterbiç®æ³è¿è¡éè¿°ï¼
å°æä¸ç¥éå°çº¢æ¯åªé人ï¼ä»åªè½éè¿å°çº¢æ¯å¤©çæ´»å¨æ¥æ¨æé£éç天æ°ã
å设è¿ç»ä¸å¤©ï¼å°çº¢çæ´»å¨ä¾æ¬¡ä¸ºï¼âç¡è§-æ游æ-éè¡âï¼æ们å°æ®æ¤è®¡ç®ææå¯è½ç天æ°æ åµã
表示第ä¸å¤©ä¸ºé¨å¤©è½å¤ä½¿å¾ç¬¬äºå¤©ä¸ºæ´å¤©çæ¦çæ大ï¼ä¹å°±æ¯è¯´å¦æ第äºå¤©æ¯æ´å¤©å¨æçè·¯å¾ä¸çè¯ï¼ç¬¬ä¸å¤©æ¯é¨å¤©ä¹ä¸å®å¨æçè·¯å¾ä¸ï¼åè§ä¸æä¸Viterbiç®æ³çåºæ¬ææ³ï¼
æ¤æ¶å·²ç»å°äºæåçæ¶å»ï¼æ们å¼å§å溯ã
å ¶è®¡ç®è¿ç¨ç¤ºæå¾å¦ä¸å¾æ示ã
ï¼çè·¯å¾ã
TF-IDFï¼è¯é¢-éææ¬é¢çï¼æ¯ä¸ç§ç¨ä»¥è¯ä¼°åè¯å¨ææ¡£ä¸éè¦ç¨åº¦çç»è®¡æ¹æ³ãå®çæ ¸å¿ææ³æ¯ï¼å¦ææ个è¯å¨ä¸ç¯æç« ä¸åºç°çé¢çå³TFé«ï¼å¹¶ä¸å¨å ¶ä»ææ¡£ä¸åºç°çå¾å°ï¼å认为è¿ä¸ªè¯æå¾å¥½çç±»å«åºåè½åã
å ¶ä¸ï¼
TextRankæ¯ä¸ç§ç¨ä»¥å ³é®è¯æåçç®æ³ï¼å 为æ¯åºäºPageRankçï¼æ以å ä»ç»PageRankã
PageRankéè¿äºèç½ä¸çè¶ é¾æ¥å ³ç³»ç¡®å®ä¸ä¸ªç½é¡µçæåï¼å ¶å ¬å¼æ¯éè¿ä¸ç§æ票çææ³æ¥è®¾è®¡çï¼å¦ææ们计ç®ç½é¡µAçPageRankå¼ï¼é£ä¹æ们éè¦ç¥éåªäºç½é¡µé¾æ¥å°Aï¼å³é¦å å¾å°Açå ¥é¾ï¼ç¶åéè¿å ¥é¾ç»ç½é¡µAè¿è¡æ票æ¥è®¡ç®AçPRå¼ãå ¶å ¬å¼ä¸ºï¼
å ¶ä¸ï¼
d为é»å°¼ç³»æ°ï¼åå¼èå´ä¸º0-1ï¼ä»£è¡¨ä»ä¸å®ç¹æåå ¶ä»ä»»æç¹çæ¦çï¼ä¸è¬åå¼0.ã
å°ä¸å¼å¤æ¬¡è¿ä»£å³å¯ç´å°æ¶æå³å¯å¾å°ç»æã
TextRankç®æ³åºäºPageRankçææ³ï¼å©ç¨æ票æºå¶å¯¹ææ¬ä¸éè¦æåè¿è¡æåºãå¦æ两个è¯å¨ä¸ä¸ªåºå®å¤§å°ççªå£å å ±ååºç°è¿ï¼å认为两个è¯ä¹é´åå¨è¿çº¿ã
å ¬å¼ä¸PageRankçåºæ¬ç¸åãå¤æ¬¡è¿ä»£ç´è³æ¶æï¼å³å¯å¾å°ç»æã
å¨jiebaåè¯ä¸ï¼TextRank设å®çè¯çªå£å¤§å°ä¸º5ï¼å°å ¬å¼1è¿ä»£æ¬¡çç»æä½ä¸ºæç»æéçç»æï¼èä¸ä¸å®è¿ä»£è³æ¶æã
jieba源码解析(一)——中文分词
全模式解析:
全模式下的中文分词通过构建字典树和DAG实现。首先加载字典,字典树中记录词频,例如词"不拘一格"在字典树中表示为{ "不" : 0, "不拘" : 0, "不拘一" : 0, "不拘一格" : freq}。接着构造DAG,表示连续词段的起始位置。例如句子'我来到北京清华大学',分词过程如下:
1. '我':字典树中key=0,尝试'我来',不在字典,结束位置0寻找可能的分词,DAG为 { 0:[0]}。
2. '来':字典树中key=1,尝试'来到',在字典,继续尝试'来到北',不在字典,结束位置1寻找可能的分词,DAG为 { 0:[0], 1:[1]}。
3. '到':字典树中key=2,尝试'来到北',不在字典,结束位置2寻找可能的分词,DAG为 { 0:[0], 1:[1], 2:[2]}。
4. 以此类推,最终形成所有可能分词结果:我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学。
全模式的关键代码涉及字典树和DAG的构建与使用。
精确模式与HMM模式解析:
精确模式与HMM模式对句子'我来到北京清华大学'的分词结果分别为:
精确模式:'我'/'来到'/'北京'/'清华大学'
HMM模式:'我'/'来到'/'了'/'北京'/'清华大学'
HMM模式解决了发现新词的问题。解析过程分为三个步骤:
1. 生成所有可能的分词。
2. 生成每个key认为最好的分词。
3. 按照步骤2的方式对每个key的结果从前面向后组合,注意判断单字与下个单字是否可以组成新词。
最后,解析结果为:我/ 来到/ 北京/ 清华/ 清华大学
HMM模式中的Viterbi算法在jieba中用于发现新词。算法通过统计和概率计算,实现新词的发现与分词。
具体应用中,HMM模型包含五个元素:隐含状态、可观测状态、初始状态概率矩阵、隐含状态转移概率矩阵、观测状态转移概率矩阵。模型利用这些元素实现状态预测与概率计算,进而实现中文分词与新词发现。
在Viterbi算法中,重要的是理解隐含状态、可观测状态、转移概率矩阵之间的关系,以及如何利用这些信息进行状态预测和概率计算。具体实现细节在代码中体现,包括字典树构建、DAG构造、概率矩阵应用等。