月光博客 » 编程开发 » 中文分词和TF-IDF

中文分词和TF-IDF

  中文分词(Chinese Word Segmentation)指的是将一个汉字序列切分成一个一个单独的词。中文分词是文本挖掘的基础,对于输入的一段中文,成功的进行中文分词,可以达到电脑自动识别语句含义的效果。

  TF-IDF(term frequency–inverse document frequency)是一种用于信息搜索和信息挖掘的常用加权技术。在搜索、文献分类和其他相关领域有广泛的应用。

  TF-IDF的主要思想是,如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TF词频(Term Frequency)指的是某一个给定的词语在该文件中出现的次数。IDF反文档频率(Inverse Document Frequency)的主要思想是:如果包含词条的文档越少,IDF越大,则说明词条具有很好的类别区分能力。

  使用TF*IDF可以计算某个关键字在某篇文章里面的重要性,因而识别这篇文章的主要含义,实现计算机读懂文章的功能。

  常见中文分词开源项目:

  SCWS

  Hightman开发的一套基于词频词典的机械中文分词引擎,它能将一整段的汉字基本正确的切分成词。采用的是采集的词频词典,并辅以一定的专有名称,人名,地名,数字年代等规则识别来达到基本分词,经小范围测试大概准确率在 90% ~ 95% 之间,已能基本满足一些小型搜索引擎、关键字提取等场合运用。45Kb左右的文本切词时间是0.026秒,大概是1.5MB文本/秒,支持PHP4和PHP 5。

  ICTCLAS:  

  这可是最早的中文开源分词项目之一,ICTCLAS在国内973专家组组织的评测中活动获得了第一名,在第一届国际中文处理研究机构SigHan组织的评测中都获得了多项第一名。ICTCLAS3.0分词速度单机996KB/s,分词精度98.45%,API不超过200KB,各种词典数据压缩后不到3M.ICTCLAS全部采用C/C++编写,支持Linux、FreeBSD及Windows系列操作系统,支持C/C++、C#、Delphi、Java等主流的开发语言。

  HTTPCWS

  HTTPCWS 是一款基于HTTP协议的开源中文分词系统,目前仅支持Linux系统。HTTPCWS 使用“ICTCLAS 3.0 2009共享版中文分词算法”的API进行分词处理,得出分词结果。HTTPCWS 将取代之前的 PHPCWS 中文分词扩展

  庖丁解牛分词

  Java 提供lucence 接口,仅支持Java语言。

  CC-CEDICT

  一个中文词典开源项目,提供一份以汉语拼音为中文辅助的汉英辞典,截至2009年2月8日,已收录82712个单词。其词典可以用于中文分词使用,而且不存在版权问题。Chrome中文版就是使用的这个词典进行中文分词的。

  基于VB/ASP的中文分词

  上面的开源项目没有给予VB和ASP的,这里提供一个简单的VB/ASP类,加上词典之后就可以进行分词了,注意这个类只供演示,其分词速度极慢不适合实际应用。

  类名为:WordSplit

Private rootTable As String

Private Function GetCount(ByVal s As String) As Long
    GetCount = InStr(1, rootTable, s)
End Function

Public Function WordCount(ByVal strString As String, ByVal strGetWord As String) As Long
    Dim k
    k = Split(strString, strGetWord)
    WordCount = UBound(k)
End Function


' 分析输入的字符串,将其切割成一个个的词语。
' <param name="s">待切割的字符串</param>
' <returns>所切割得到的中文词语数组</returns>

Public Function ParseChinese(ByVal s As String, ByVal separator As String) As String
    Dim lngLength As Long
    Dim strTemp As String
    Dim ArrayList As String
    Dim i, j

    ArrayList = ""
    lngLength = Len(s)
    i = 1
    While i < lngLength
        strTemp = Mid(s, i, 1)
        If GetCount(strTemp) > 1 Then
            j = 2
            While i + j < lngLength + 1 And GetCount(Mid(s, i, j)) > 0
                j = j + 1
            Wend
            strTemp = Mid(s, i, j - 1)
            i = i + j - 2
        End If
        i = i + 1
        'WordAdd (temp)
        ArrayList = ArrayList + strTemp + separator
    Wend
    ParseChinese = ArrayList

End Function

Private Sub Class_Initialize()
    Dim fso, templetfile, txtfile
    templetfile = App.Path + "\ChineseDictionary.txt"
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set txtfile = fso.OpenTextFile(templetfile, 1)
    rootTable = txtfile.ReadAll
    txtfile.Close
End Sub

  调用示例:

    strInput = "中文分词指的是将一个汉字序列切分成一个一个单独的词。中文分词是文本挖掘的基础,对于输入的一段中文,成功的进行中文分词,可以达到电脑自动识别语句含义的效果。"
    Dim strWordSplit As New WordSplit
    strSubject = strWordSplit.ParseChinese(strInput, "|")
    arrSubject = Split(strSubject, "|")
 

顶一下 ▲()   踩一下 ▼()

相关文章

  1. 1
    shell   说道:
    做基于云端的高级智能化伪原创,需要分词了。好文章!
    支持(12反对(5回复
  1. 2
    lukeliu   说道:
    这个要仔细看看。
    支持(13反对(7回复
  1. 3
    Randy   说道:
    这段时间正在折腾这个东西
    支持(13反对(7回复
  1. 4
    LEE   说道:
    真的相当不错噢

    支持(10反对(4回复
  1. 5
    修愚   说道:
    支持下,非技术层的角色
    支持(10反对(6回复
  1. 6
    coldfly   说道:
    你好,看了你的文章,我很想了解一下关于文本语义提取方面的一些思路,不知道您在这方面有没有研究,期待您的建议
    heavenpoppy 于 2009-6-27 10:45:37 回复
    语义提取跟分词是两码事,这边的分词系统是基于词频的,只是权重分配调节,不同权重分配导致不同的结果,语义提取涉及语义网络的问题,还是看看语义网络的东西,现在很多做本体之类的都有这方面的
    支持(10反对(6回复
  1. 7
    天使界主   说道:
    看来对我不是很有用
    支持(14反对(10回复
  1. 8
    黑白之间   说道:
    看完了也不知道是什么意思,不明白
    支持(14反对(11回复
  1. 9
    foremire   说道:
    分词技术也算得上半个人工智能,学术界一直以来都在不断进行相关研究。相对而言,英文分词的性能和准确度还是比中文要高得多,这方面我们还有很多工作要做。
    xnhs 于 2009-6-25 8:59:11 回复
    英文单词本来就是分开呀。
    支持(11反对(8回复
  1. 10
    LV   说道:
    第一次听到这概念
    支持(10反对(7回复
  1. 11
    塞班互动   说道:
    不知道能不能用在SEO上,比如:关键字抓取?
    支持(9反对(7回复
  1. 12
    2547   说道:
    看不懂,纯支持了
    支持(7反对(6回复
  1. 13
    kate   说道:
    月光的博客,前后片呼应,不错。

    绿坝,谷歌色情,这都和分词技术有关系,不错!

    前两天差点在月光做沙发坐成三连冠了。
    支持(8反对(7回复
  1. 14
    XX   说道:
    上面打错一字,应该是装了某个软件。
    另外,也有这样的:
    十八口交换机,变成:十八文明用语交换机。
    支持(9反对(8回复
  1. 15
    best   说道:
    看不大懂 有点迷糊
    支持(9反对(8回复
  1. 16
    微笑   说道:
    分词。。最 无脑 的 方式 就是 像 我 这样,。。哈,也是个不错的 方式,可以从输入法 的判断起手,在不浪费空格时间的情况下,以某种方式分词,,
    支持(11反对(10回复
  1. 17
    FORECE   说道:
    不是我能理解的了得
    支持(8反对(8回复
  1. 18
    XX   说道:
    上面的有人说看不懂,咱来个解释吧。
    将了某软件,上了某网站。网站上有一句话。
    十八口交换机。
    最后看到的是
    十八嘴交换机。
    十八口交换机,变成了十八嘴交换机。
    看懂了吧。
    支持(9反对(9回复
  1. 19
    LEE   说道:
    不大好懂啊
    支持(7反对(7回复
  1. 20
    鬓角   说道:
    纯技术文章,只回不看,吼吼。。
    支持(7反对(8回复
  1. 21
    零距离   说道:
    好久没来看看看了,分词对我一窍不通
    支持(6反对(7回复
  1. 22
    TM   说道:
    纯支持了。。。。。。。

    第2帖
    支持(7反对(8回复
  1. 23
    xianyuninfo   说道:
    了解了 呵呵
    支持(6反对(7回复
  1. 24
    ganlanshu   说道:
    不错,学习啦。。。
    支持(7反对(8回复
  1. 25
    xwseg   说道:
    phenix word segment
    速度 10M/s
    效果 媲美百度,海量等分词
    yoyo 于 2010-9-29 15:33:59 回复
    phenix word segment?我怎么搜索不到呢?
    支持(7反对(9回复
  1. 26
    xiaotu   说道:
    感觉分词的技术,对于搜索引擎很重要,其他的应用就没怎么见过了
    支持(6反对(8回复
  1. 27
    danty   说道:
    虽说有点深奥,但还是要看一看!
    支持月光^_^
    支持(7反对(9回复
  1. 28
    czlelva   说道:
    月光,介绍下国外免费的分词技术
    或者类似于google的单词自动修正技术
    比如输入一个gogole,google就会提示你did you mean google?
    支持(7反对(9回复
  1. 29
    园子   说道:
    确实也不太懂这方面的知识

    以后多学习吧~
    支持(3反对(6回复
  1. 30
    cyberdreams   说道:
    百度和谷歌对中文的分词,是否不同?
    支持(5反对(8回复
  1. 31
    calf   说道:
    vb,asp很相似
    kate 于 2009-6-24 1:33:52 回复
    月光的博客,前后片呼应,不错。

    绿坝,谷歌色情,这都和分词技术有关系,不错!

    前两天差点在月光做沙发坐成三连冠了。
    支持(3反对(8回复
  1. 32
    koomi   说道:
    以前看了马克了,居然现在搞起了这方面的研究,囧~~再来看看
    支持(6反对(11回复
  1. 33
    grnnet   说道:
    文章写的真好啊,有技术就是好,访问量就是大
    支持(5反对(12回复
  1. 34
    妖狐闪现   说道:
    属于自然语言处理的技术,中文分词现在的准确率很难再提升了。
    支持(9反对(16回复
  1. 35
    angnow   说道:
    感谢月光前辈,学习了!
    支持(5反对(14回复

发表留言