如何从文本块列表中创建类似DTM的文本矩阵?

时间:2013-01-03 08:25:45

标签: r text-mining corpus

我一直在使用textmatrix()函数创建DTM,我可以进一步用于LSI。

dirLSA<-function(dir){
  dtm<-textmatrix(dir)
  return(lsa(dtm))
}

textdir<-"C:/RProjects/docs"
dirLSA(textdir)

> tm
$matrix
                  D1 D2 D3 D4 D5 D6 D7 D8 D9
1. 000             2  0  0  0  0  0  0  0  0
2. 20              1  0  0  1  0  0  1  0  0
3. 200             1  0  0  0  0  0  0  0  0
4. 2014            1  0  0  0  0  0  0  0  0
5. 2015            1  0  0  0  0  0  0  0  0
6. 27              1  0  0  0  0  0  0  1  0
7. 30              1  0  0  0  1  0  1  0  0
8. 31              1  0  2  0  0  0  0  0  0
9. 40              1  0  0  0  0  0  0  0  0
10. 45             1  0  0  0  0  0  0  0  0
11. 500            1  0  0  0  0  0  1  0  0
12. 600            1  0  0  0  0  0  0  0  0
728. bias          0  0  0  2  0  0  0  0  0
729. biased        0  0  0  1  0  0  0  0  0
730. called        0  0  0  1  0  0  0  0  0
731. calm          0  0  0  1  0  0  0  0  0
732. cause         0  0  0  1  0  0  0  0  0
733. chauhan       0  0  0  2  0  0  0  0  0
734. chief         0  0  0  8  0  0  1  0  0

Textmatrix()是一个获取目录(文件夹路径)并返回文档术语频率的函数。这用于进一步分析,如潜在语义索引/分配(LSI / LSA)

但是,我遇到的一个新问题是,如果我在批处理文件中发送推文数据(约500000条推文/批处理),我想对这些数据执行类似的操作。

我有代码模块来清理我的数据,我想将已清理的推文直接传递给LSI功能。我面临的问题是textmatrix()不支持它。

我试着查看其他软件包和代码片段,但这并没有让我更进一步。有什么方法可以创建各种各样的行项矩阵吗?

我尝试将table(tokenize(cleanline[i]))发送到循环中,但它不会为矩阵中尚未存在的单词添加新列。任何解决方法?

更新:我刚试过这个:

a<-table(tokenize(cleanline[10]))
b<-table(tokenize(cleanline[12]))

df1<-data.frame(a)
df1
df2<-data.frame(b)
df2

merge(df1,df2, all=TRUE)

我明白了:

> df1
    Var1 Freq
1           6
2      "    2
3    and    1
4   home    1
5   mabe    1
6 School    1
7   then    1
8   xbox    1
> b<-table(tokenize(cleanline[12]))
> df2<-data.frame(b)
> df2
        Var1 Freq
1              13
2          "    2
3  BillGates    1
4       Come    1
5       help    1
6        Mac    1
7       make    1
8  Microsoft    1
9     please    1
10   Project    1
11    really    1
12   version    1
13      wish    1
14     would    1
> merge(df1,df2)
  Var1 Freq
1    "    2
> merge(df1,df2, all=TRUE)
        Var1 Freq
1               6
2              13
3          "    2
4        and    1
5       home    1
6       mabe    1
7     School    1
8       then    1
9       xbox    1
10 BillGates    1
11      Come    1
12      help    1
13       Mac    1
14      make    1
15 Microsoft    1
16    please    1
17   Project    1
18    really    1
19   version    1
20      wish    1
21     would    1

我想我很接近。

2 个答案:

答案 0 :(得分:0)

尝试这样的事情

  ll <- list(df1,df2)
  dtm <- xtabs(Freq ~ ., data = do.call("rbind", ll))

答案 1 :(得分:0)

对我有用的东西:

textLSA<-function(text){

  a<-data.frame(table(tokenize(text[1])))
  colnames(a)[2]<-paste(c("Line",1),collapse=' ')
  df<-a

  for(i in 1:length(text)){
    a<-data.frame(table(tokenize(text[i])))
    colnames(a)[2]<-paste(c("Line",i),collapse=' ')
    df<-merge(df,a, all=TRUE)
  }

  df[is.na(df)]<-0
  dtm<-as.matrix(df[,-1])
  rownames(dtm)<-df$Var1

  return(lsa(dtm))
}

您如何看待此代码?