首先感谢 p31415926 分享的文章 小试SAP HANA SP05 对中文的分词处理,受到很大启发,我也分享一些其他针对中方分词的处理方式,即使用HANA 对R的支持,利用R来对中文分词的处理。
首先强调一下中文分词的难度,其主要原因还是因为中文本事的原因,例如:
> NGramTokenizer(' 中华人民共和国成立于1949 年')
[1] " 中华人民共和国成立于" " 成立于1949 年" " 中华人民共和国成立"
[4] " 成立于" " 于1949 年" " 中华人民共和国"
[7] " 成立" " 于" "1949 年"
我们就会出现不同的结果,而这种结果,在不同的场合下,不能认为是错误,或者是正确,因为敏感度是不同的,对词义的理解不同。
在R中最相对较为容易的分词方式就是rmmseg4j 这个扩展包[Ronggui, 2011],会自动调用了Java 分词程序对语句进行分词。例如:
>library(rmmseg4j)
> mmseg4j(' 花儿为什么这样红')
[1] " 花儿 为什么 这样 红"
这里的中文分词并不是唯一解决方案, rmmseg4j 的作者在其r-forge 项目主页上还有基于smartcn 方案的rsmartcn 包。
在R中挖掘属于文本挖掘的范畴,对于中文环境还有一些包来处理中文字符使用的是R 中的tm 包。关于tm 包最早发表于Journal of Statistical Software [Feinerer et al., 2008],而关于text mining in R 最早表在R News [Feinerer, 2008]。
在tm 中主要的管理文件的结构被称为语料库(Corpus),代表了一系列的文档集合。语料库是一个概要性的概念,在这里分为动态语料库(Volatile Corpus,作为R 对象保存在内存中)和静态语料库(Permanent Corpus,R 外部保存)。
在语料库构成中,x 必须有一个说明资料来源(input location)的源对象(Source Object)。
我们可以看一下tm 中Corpus(或VCorpus)函数的用法,对于动态语料库:
Corpus(x, readerControl = list(reader = x$DefaultReader, language = "en"), ...)
在tm 中静态语料库也是可以处理的,但需要使用filehash 包来支持:
PCorpus(x, readerControl = list(reader = x$DefaultReader, language = "en"), dbControl = list(dbName = "", dbType = "DB1"), ...)
对于这些资料来源(即x),tm 包提供了一些相关的函数,比如
• DirSource:处理目录
• VectorSource:由文档构成的向量
• DataframeSource:数据框,就像CSV 文件
第二个参数是readerControl,这里必须声明reader 和language 两个内容。第一个reader 是指从资料源创立的文本文件。tm 包提供了一系列的函数支持(比如,readPlain(),readGmane(), readRCV1(), readReut21578XMLasPlain(), readPDF(), readDOC() 等)。可以使用getReaders() 获得这些函数的列表。对于每一类源,都会有自己默认的reader。比如对DirSource 来说,默认读入输入文件并把内容解释为文本。第二个language 就比较简单了,即字符集,比如可能是UTF-8 字符集。 在使用静态语料库条件下,会涉及第三个参数dbControl,它用来声明R 内存对象外的资料来源(比如数据库)。dbType 控制了包filehash 支持的数据库类型。数据库支持可以有效的减少对内存的要求,但数据的访问会受到硬盘的读写能力限制。
比如,txt 目录下的包含拉丁字符的纯文本,内容是罗马诗人奥维德Ovid 的诗集,可以这样读进来:
> txt <- system.file("texts", "txt", package = "tm")
> (ovid <- Corpus(DirSource(txt), + readerControl = list(language = "lat"))) A corpus with 5 text documents
当然同样也可以从字符向量创建语料库:
> docs <- c("This is a text.", "This another one.")
> Corpus(VectorSource(docs)) 3 A corpus with 2 text documents
有时候,我们需要选取给定条件下的文档。tm_filter 函数即为这个目所设计。sFilter 适应于一般情况下的用户自定义过滤情况:它整合了适用于元数据的的最小查询语句。假如需要找出ID 等于237,表头(heading)包含“INDONESIA SEEN AT CROSSROADS OVER ECONOMIC CHANGE” 字符的文本本舰。
> query <- "id == '237' & 2 + heading == 'INDONESIA SEEN AT CROSSROADS OVER ECONOMIC CHANGE'"
> tm_filter(reuters, FUN = sFilter, query) A corpus with 1 text document
也可以进行全文过滤
> tm_filter(reuters, pattern = "company") A corpus with 5 text documents
> tm_filter(reuters, FUN = searchFullText, "company") A corpus with 5 text documents
××比如the, is, at, which 和on 等不表意的词汇,tm 包提供了近五百个英文停止词,除英文外还支持法语、荷兰语、西班牙语、意大利语等十几种语言。
字典是一个字符集和。经常用于在文本挖掘中展现相关的词条时。使用Dictionary() 函数实现,可以看示例:
> (d <- Dictionary(c("prices", "crude", "oil")))
[1] "prices" "crude" "oil" attr(,"class")
[1] "Dictionary" "character"
在tm 包中提供了诸如频数提取( findFreqTerms )、相关性提取( findAssocs )等函数,以及用于计算cosine 距离的dissimilarity 函数,这个函数在下面会被讨论到。R 中的wordcloud 包提供了绘制文本云的技术,甚至还可以对两个文本云进行比较。
例如进行聚类【一般会考虑使用层次(Hierarchical)聚类法或分割(Partitioning)聚类】,对于层次聚类的核心实际在距离阵的计算,一般会使用欧氏距离、闵氏距离等,但在大型数据条件下会优先选择cosine 距离,及dissmilarity 函数,直接上代码:
> library(tm)
> data(acq)
> data(crude)
> m <- c(acq, crude)
> dtm <- DocumentTermMatrix(m)
> dtm <- removeSparseTerms(dtm, 0.8)
> inspect(dtm[1:5, 1:5])
> dist_dtm <- dissimilarity(dtm, method = 'cosine')
> hc <- hclust(dist_dtm, method = 'ave')
> plot(hc, xlab = '')
得到的结果将会如下:
有了距离阵后续可以做的事情非常多,如相关性可视化展示,或者Multi dimensional Scaling空间展示等。或者使用kmeans 函数构建K 均值聚类模型。
对于文本的处理一定是未来决策系统的核心,我们在基于SAP 数据分析与OA 文本,关联与分析的路上才刚刚开始。希望借助与HANA的内置与扩展包,为决策提供更加智能的解决方案提供一个尝试的机会。针对文本处理的一些更详细技术对比,希望能有更多的探讨。
By @独角兽老头
You must be a registered user to add a comment. If you've already registered, sign in. Otherwise, register and sign in.
User | Count |
---|---|
13 | |
11 | |
5 | |
5 | |
5 | |
4 | |
4 | |
3 | |
3 | |
3 |