Skip to Content

首先感谢  Charles Guo  分享的文章 小试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 = ”)

得到的结果将会如下:

R1.jpg

有了距离阵后续可以做的事情非常多,如相关性可视化展示,或者Multi dimensional Scaling空间展示等。或者使用kmeans 函数构建K 均值聚类模型。

    对于文本的处理一定是未来决策系统的核心,我们在基于SAP 数据分析与OA 文本,关联与分析的路上才刚刚开始。希望借助与HANA的内置与扩展包,为决策提供更加智能的解决方案提供一个尝试的机会。针对文本处理的一些更详细技术对比,希望能有更多的探讨。

        By @独角兽老头

To report this post you need to login first.

2 Comments

You must be Logged on to comment or reply to a post.

  1. Shengtao Tan

    其实我觉得中文的语意分析难在句读。句读会由上下文,不同行业,不同区域,不同时代等各方面因素相关。我觉得要真正做好中文文本分析功能需要一个包罗万象的数据库。这个库可以做到分析得更快更精准。另外这个库还需具备持续的自我学习的功能。

    Charles Guo,丁波,你们怎么看? 😉

    (0) 
  2. kingbo ding Post author

        的确,库是分析中的关键中关键。未来对库的更新将会成为关键。正如当前流行的机器学习,也就是在不停提取特征,并将这些特征固化在库中。库是知识标准标准化的基础,无论是数据分析,还是文本分析,库都将是智能化系统的基础。我们将在HANA的平台上,利用更多的新技术去尝试新的场景去提升或者去尝试改变ERP系统给人们的传统印象。

        原来一谈到ERP系统,我们就会说,系统只是系统,不可能改变企业的运行状态,进来的是垃圾,系统出的报表也是垃圾数据。高性能的技术,已经为智能化的系统打下了良好的基础。如果输入数据错误,ERP系统会在第一关卡住,后续的原始数据分析,将会为领导者,提供非常智能的决策支持。我想,是时候去尝试改变了。

        标准的挖掘与不同行业的挖掘,专业元库,通用的标准库,已经更新这些库的学习算法,将会是未来系统另外一个核心竞争力。

    (0) 

Leave a Reply