Technology Blogs by Members
Explore a vibrant mix of technical expertise, industry insights, and tech buzz in member blogs covering SAP products, technology, and events. Get in the mix!
cancel
Showing results for 
Search instead for 
Did you mean: 
Former Member

首先感谢  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 @独角兽老头

2 Comments
Labels in this area