R: найти корпусный документ по ID-тэгу и установить дополнительный тэг

Хотите написать теги для документов, находящихся внутри корпуса. Теги хранятся вне корпуса в фрейме данных с определенными уникальными идентификаторами документов.

Задача: (1) взять каждый идентификатор из фрейма данных, (2) найти соответствующий документ внутри корпуса, (3) установить тег из фрейма данных в документ корпуса с конкретным идентификатором.

library("tm")
someID <- paste(letters[1:15], 16:30, sep="")
someTag <- sample(c("a","x","g","h","e"), 15, replace=TRUE)

data(crude) # a corpus with 20 docs
meta(crude, type="local", tag="someID") <- someID  # adding some additional IDs to the corpus

mydf <- data.frame(cbind(someTag, someID))  # Creating a dataframe with similar IDs
mydf <- mydf[sample(nrow(mydf)),]  # permutation of elements (rows)
rownames(mydf) <- 1:15  # overwriting the rownames

############################################
# doesn't work - my try - pseudocode

for (i in 1:nrow(mydf)){
          meta(crude[which(crude$someID==mydf$someID[i])], tag="someTag", type="local") <- mydf$someTag[i]
    }

############################################
# How the data looks like:

mydf
# R output:
> mydf
   someTag someID
1        h    l27
2        x    g22
3        h    d19
4        a    e20
5        h    i24
6        x    j25
7        h    o30
8        x    n29
9        e    h23
10       x    m28
11       h    k26
12       e    c18
13       a    a16
14       e    b17
15       x    f21

meta(crude[1], type="local")
# R output:
> meta(crude[1], type="local")
Available meta data pairs are:
  Author       : 
  DateTimeStamp: 1987-02-26 17:00:56
  Description  : 
  Heading      : DIAMOND SHAMROCK (DIA) CUTS CRUDE PRICES
  ID           : 127
  Language     : en
  Origin       : Reuters-21578 XML
User-defined local meta data pairs are:
$TOPICS
[1] "YES"

$LEWISSPLIT
[1] "TRAIN"

$CGISPLIT
[1] "TRAINING-SET"

$OLDID
[1] "5670"

$Topics
[1] "crude"

$Places
[1] "usa"

$People
character(0)

$Orgs
character(0)

$Exchanges
character(0)

$someID
[1] "a16"

Спасибо за любую помощь (;


person alex    schedule 09.09.2013    source источник


Ответы (1)


Согласно ?meta

meta(crude, type="local", tag="someID") <- someID

назначит тег метаданных someID на уровне отдельного документа. Что вы хотите, так это создать теги на уровне коллекции. Для этого вы хотите манипулировать атрибутом DMetaData необработанного корпуса. Вы можете сделать это как:

meta(crude, type="indexed", tag="someID") <- someID

но мне гораздо проще использовать доступ

DMetaData(crude)$someID  <- someID

(по крайней мере, это работает для корпусов типа VCorpus). С этой регулировкой:

library("tm")
someID <- paste(letters[1:15], 16:30, sep="")
someTag <- sample(c("a","x","g","h","e"), 15, replace=TRUE)

data(crude) # a corpus with 20 docs
# Need to be sure to allocate full tag and id set.
DMetaData(crude)$someID <- c(someID,rep(NA,5))
DMetaData(crude)$someTag <- rep(NA,20)

mydf <- data.frame(cbind(someTag, someID), stringsAsFactors=FALSE)  # Creating a dataframe with similar IDs
mydf <- mydf[sample(nrow(mydf)),]  # permutation of elements (rows)
rownames(mydf) <- 1:15  # overwriting the rownames

for (i in 1:nrow(mydf)){
      DMetaData(crude)$someTag[DMetaData(crude)$someID==mydf$someID[i]]<- mydf$someTag[i]
    }

Результат:

> DMetaData(crude)
   MetaID someID someTag  
1       0    a16       a
2       0    b17       h
3       0    c18       g
4       0    d19       a
5       0    e20       e
6       0    f21       a
7       0    g22       x
8       0    h23       g
9       0    i24       h
10      0    j25       e
11      0    k26       x
12      0    l27       a
13      0    m28       a
14      0    n29       h
15      0    o30       a
16      0   <NA>    <NA>
17      0   <NA>    <NA>
18      0   <NA>    <NA>
19      0   <NA>    <NA>
20      0   <NA>    <NA>
person Ryan Walker    schedule 10.09.2013
comment
Благодарю вас! Красиво :) Работает. Только someTag должен быть объявлен ранее как as.character(mydf$someTag[i]). Могу я отредактировать ваш пост? Мы также добавим весь вывод > DMetaData(crude) с новыми буквенными тегами. - person alex; 10.09.2013
comment
Хороший улов. Я исправил это. - person Ryan Walker; 10.09.2013
comment
Благодарю вас! Очень элегантное решение! Хорошего дня! (: - person alex; 10.09.2013