R tm包和Spark/python为文档术语频率任务提供了不同的词汇表大小

R tm包和Spark/python为文档术语频率任务提供了不同的词汇表大小,python,r,scala,apache-spark,nlp,Python,R,Scala,Apache Spark,Nlp,我有一个单一列的csv,每一行都是一个文本文档。所有文本均已规范化: 全小写 没有标点符号 没有数字 单词之间的空格不能超过一个 无标记(xml、html) 我还有一个R脚本,它在这些文档上构建文档术语矩阵,并进行一些机器学习分析。我需要在Spark中转换这个 第一步是生成文档术语矩阵,其中每个术语都有文档中的相对频率计数。问题是,相对于spark api或python sklearn,我使用R得到的词汇表大小不同(spark和python在结果上是一致的) 这是R的相关代码: librar

我有一个单一列的csv,每一行都是一个文本文档。所有文本均已规范化:

  • 全小写
  • 没有标点符号
  • 没有数字
  • 单词之间的空格不能超过一个
  • 无标记(xml、html)
我还有一个R脚本,它在这些文档上构建文档术语矩阵,并进行一些机器学习分析。我需要在Spark中转换这个

第一步是生成文档术语矩阵,其中每个术语都有文档中的相对频率计数。问题是,相对于spark api或python sklearn,我使用R得到的词汇表大小不同(spark和python在结果上是一致的)

这是R的相关代码:

library(RJDBC)
library(Matrix)
library(tm)
library(wordcloud)
library(devtools)
library(lsa)
library(data.table)
library(dplyr)
library(lubridate)

corpus <- read.csv(paste(inputDir, "corpus.csv", sep="/"), stringsAsFactors=FALSE)
DescriptionDocuments<-c(corpus$doc_clean)
DescriptionDocuments <- VCorpus(VectorSource(DescriptionDocuments))
DescriptionDocuments.DTM <- DocumentTermMatrix(DescriptionDocuments, control = list(tolower = FALSE,
                                                                                    stopwords = FALSE,
                                                                                    removeNumbers = FALSE,
                                                                                    removePunctuation = FALSE,
                                                                                    stemming=FALSE))

# VOCABULARY SIZE = 83758


我还检查了python sklearn,我得到了与spark一致的结果:

import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer

corpus = pd.read_csv("/path/to/corpus.csv")
docs = corpus.loc[:, "doc"].values

def tokenizer(text):
    return text.split

cv = CountTokenizer(tokenizer=tokenizer, stop_words=None)
dtf = cv.fit_transform(docs)
print len(dtf.vocabulary_)

# VOCABULARY SIZE = 84290



我不太清楚,但在我看来,默认情况下应该在空白处标记。有人提示我为什么会得到不同的词汇量?

造成差异的原因是创建文档术语矩阵时的默认选项。如果您选中
?termFreq
,您可以找到选项WordLength:

长度为2的整数向量。比最小单词短的单词 字长[1]或大于最大字长 字长[2]被丢弃。默认为c(3,Inf),即最小值 字长为3个字符

c(3,Inf)的默认设置删除所有短于3的单词,如“at”、“in”、“I”等

这个默认值是导致tm和spark/python之间差异的原因

请参见下面示例中字长设置的差异

library(tm)

data("crude")

dtm <- DocumentTermMatrix(crude)
nTerms(dtm)
[1] 1266

dtm2 <- DocumentTermMatrix(crude, control = list(wordLengths = c(1, Inf)))
nTerms(dtm2)
[1] 1305
library(tm)
数据(“原油”)

谢谢你,先生,你救了我一天
library(tm)

data("crude")

dtm <- DocumentTermMatrix(crude)
nTerms(dtm)
[1] 1266

dtm2 <- DocumentTermMatrix(crude, control = list(wordLengths = c(1, Inf)))
nTerms(dtm2)
[1] 1305