quanteda: вычисление сходства текста по строкам между двумя DFM - PullRequest
1 голос
/ 11 апреля 2019

У меня есть фрейм данных с 2 текстовыми полями: комментарий и основной пост

в основном это структура

         id  comment                        post_text
          1   "I think that blabla.."        "Why is blabla.."
          2   "Well, you should blabla.."    "okay, blabla.."
          3    ...

Я хочу вычислить сходство между текстом в комментариив первой строке и текст в post_text в первой строке, и сделайте это для всех строк.насколько я знаю, я должен создать отдельные объекты dfm для двух типов текстов

          corp1 <- corpus(r , text_field= "comment")
          corp2 <- corpus(r , text_field= "post_text")
          dfm1 <- dfm(corp1)
          dfm2 <- dfm(corp2)

, в конце концов, я хочу получить что-то вроде этого:

id  comment                     post_text          similarity
1   "I think that blabla.."     "Why is blabla.."  *similarity between comment1 and post_text1
2   "Well, you should blabla.." "okay, blabla.."  *similarity between comment2 and post_text2
3    ...

IЯ не уверен, как поступить, я нашел это в StackOverflow Попарное расстояние между документами , но они вычисляют кросс-сходство между dfm, в то время как мне нужно сходство по строке,

, так что в основном то, что я думал, былосделать следующее:

      dtm <- rbind(dfm(corp1), dfm(corp2))
      d2 <- textstat_simil(dtm, method = "cosine", diag = TRUE)
      matrixsim<- as.matrix(d2)[docnames(corp1), docnames(corp2)]
      diagonale <- diag(matrixsim)

но диагональ - это просто список 1 1 1 1 ..

Есть идеи, как решить эту проблему?заранее благодарю за помощь,

Карло

1 Ответ

1 голос
/ 11 апреля 2019

Я бы сделал это, создав один столбец документов, но различал их, используя имена документов, указывающие тип документа.

df <- data.frame(
  id = c(1, 2),
  comment = c(
    "I think that blabla..",
    "Well, you should blabla"
  ),
  post_text = c(
    "Why is blabla",
    "okay, blabla"
  ),
  stringsAsFactors = FALSE
)

# stack these into a single "document" column, plus a docvar
# identifying the document type
df <- tidyr::gather(df, "source", "text", -id)
df
##   id    source                    text
## 1  1   comment   I think that blabla..
## 2  2   comment Well, you should blabla
## 3  1 post_text           Why is blabla
## 4  2 post_text            okay, blabla

library("quanteda")
## Package version: 1.4.3
## Parallel computing: 2 of 12 threads used.
## See https://quanteda.io for tutorials and examples.
## 
## Attaching package: 'quanteda'
## The following object is masked from 'package:utils':
## 
##     View

corp <- corpus(df)
docnames(corp) <- paste(df$id, df$source, sep = "_")
dfm(corp) %>%
  textstat_simil()
##               1_comment   2_comment 1_post_text
## 2_comment   -0.39279220                        
## 1_post_text -0.14907120 -0.09759001            
## 2_post_text -0.14907120  0.29277002  0.11111111

Теперь вы можете вырезать то, что вы хотите, используя подмножество матриц.(Используйте as.matrix(), чтобы преобразовать вывод из textstat_simil() в матрицу.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...