为tm开发一个中文reader

为tm添加中文支持

前文中提到,为了让tm支持中文,需要为tm开发一个具有中文分词功能的reader

tm 中reader的调用方式

以下是VCorpus函数的定义,可以看到其对reader的调用方式:

function (x, readerControl = list(reader = reader(x), language = "en")) 
{
    stopifnot(inherits(x, "Source"))
    readerControl <- prepareReader(readerControl, reader(x))
    x <- open(x)
    tdl <- vector("list", length(x))
    if (is.function(getS3method("pGetElem", class(x), TRUE))) 
        tdl <- mapply(function(elem, id) readerControl$reader(elem, 
            readerControl$language, id), pGetElem(x), id = as.character(seq_along(x)), 
            SIMPLIFY = FALSE)
    else {
        counter <- 1
        while (!eoi(x)) {
            x <- stepNext(x)
            elem <- getElem(x)
            doc <- readerControl$reader(elem, readerControl$language, 
                as.character(counter))
            tdl[[counter]] <- doc
            counter <- counter + 1
        }
    }
    x <- close(x)
    as.VCorpus(tdl)
}

由此知,reader的基本形式为readFUN(elem,language,id),其中

  • elem : 为source中的某一个元素
  • language: 一个字符串,指定当前使用的语言
  • id: 说明当前是第几个文档

关于该函数的返回值,我们看一下DirSource的reader是怎么写的:

使用

mydir=DirSource(".")
reader(mydir)

可以看到该函数如下:

function (elem, language, id) 
{
    if (!is.null(elem$uri)) 
        id <- basename(elem$uri)
    PlainTextDocument(elem$content, id = id, language = language)
}

由此可见,DirSource中的每个elem已经具有content了,该reader只是把其内容付给PlainTextDocument. 而PlainTextDocument函数的定义为:

> PlainTextDocument
function (x = character(0), author = character(0), datetimestamp = as.POSIXlt(Sys.time(), 
    tz = "GMT"), description = character(0), heading = character(0), 
    id = character(0), language = character(0), origin = character(0), 
    ..., meta = NULL, class = NULL) 
{
    p <- list(content = as.character(x), meta = TextDocumentMeta(author, 
        datetimestamp, description, heading, id, language, origin, 
        ..., meta = meta))
    class(p) <- unique(c(class, "PlainTextDocument", "TextDocument"))
    p
}

中文reader模板

有了上面这些知识,我们就可以写一个自己的reader了,基本模式为:

cnreader<-function(elem,language,id)
{
    #进行分词
    words <- wordseg(elem$content)
    #合并分词的结果为新的文档,该文档可为tm正确的识别
    ncon <- paste(words,collapse=" ")
    PlainTextDocument(ncon, id=id,language=language)
}

调用方法

mycop <- VCorpus(DirSource("."),
          readerControl = list(reader = cnreader))


本文地址: http://www.bagualu.net/wordpress/archives/6118 转载请注明




发表评论

电子邮件地址不会被公开。 必填项已用*标注