Quanteda Textstat_simil距离仅用于相邻文本

问题描述 投票:1回答:1

我有一个历时性语料库,其中包含不同组织的文本,每个文本的年龄为1969年至2019年。对于每个组织,我想比较1969年的文字和1970、1970和1971等的文字。几年的文本丢失了。

换句话说,

我有一个语料库cc,我将其转换为dfm现在我要使用textstat_simil

ncsimil <- textstat_simil(dfm.cc, 
                           y = NULL,
                           selection = NULL,
                           margin = "documents",
                           method = "jaccard",
                           min_simil = NULL)

这会将每个文本与其他每个文本进行比较,从而产生2.6+万行。我真的只需要将某些文本与上面的文本进行比较,就像这样:

TextA

TextB

TextC

TextD(有NA)

TextE

所以,我希望A和B

B和C,并且(因为有些具有NA值)

D和E

我对textstat_simil中的y =感到好奇

Quanteda包裹说

“ y是一个可选目标矩阵,与x的边距匹配,相似度或距离将被计算。“

我不清楚这是什么意思。

这是否意味着我可以创建两个不同的数据帧

A

B

C

D

E

B

C

D

E

F

这样我将获得[]的相似度统计信息>

A和B

B和C

依此类推?

或者还有更好的方法吗?

编辑从这里开始...我转换为data.frame:

df <- convert(dfm.cc, to = "data.frame")

我做了bind_cols来添加docvar和令牌计数(2,405列-短文本)。

我已经隔离了系列中的初始文本,例如

OrgA 1970,1st_in_Series_Yes,TokCount 1 ...等。>

OrgA 1971,1st_in_Series_No,TokCount 1 ...等。>

OrgA 1972,1st_in_Series_No,TokCount 1 ...等。>

OrgA 1973,NA

OrgA 1974,1st_in_Series_Yes,TokCount 1 ...等。>

OrgZ 1975,1st_in_Series_No,TokCount 1 ...等。>

以免比较

[OrgA 1973不适用,OrgA 1972不适用

OrgA 1974和OrgA 1973

手动计算Jaccard应该可以在这里工作,但是可能有更聪明的方法。请分享解决方案。谢谢。

我有一个历时性语料库,其中包含不同组织的文本,每个文本的期限为1969年至2019年。对于每个组织,我想比较1969年的文本和1970、1970和1971年的文本等。文本...

] >

有趣的问题。我没有可复制的示例,但是我想我可以使用内置的第一语言集数据集创建一个示例。在这里,我将文档变量Year用作时间变量,并将唯一的总裁(全名)姓名用作您的组织的类比(因为您不希望对不同组织进行年度比较。因此,如果将您的组织和时间变量替换为下面的变量应该起作用。

请注意,我将外部的“循环”设置为lapply,而内部的则为实际的循环,但是有一些巧妙的方法可以使内部的部分也变为lapply。为了简单起见,这里将其保留为for循环。

[首先,请使用唯一的名称,因为有些(不同的)总裁共享相同的姓氏。

library("quanteda")
## Package version: 2.0.1

data_corpus_inaugural$president <- paste(data_corpus_inaugural$President,
  data_corpus_inaugural$FirstName,
  sep = ", "
)
head(data_corpus_inaugural$president, 10)
##  [1] "Washington, George" "Washington, George" "Adams, John"       
##  [4] "Jefferson, Thomas"  "Jefferson, Thomas"  "Madison, James"    
##  [7] "Madison, James"     "Monroe, James"      "Monroe, James"     
## [10] "Adams, John Quincy"

simpairs <- lapply(unique(data_corpus_inaugural$president), function(x) {
  dfmat <- corpus_subset(data_corpus_inaugural, president == x) %>%
    dfm(remove_punct = TRUE)
  df <- data.frame()
  years <- sort(dfmat$Year)
  for (i in seq_along(years)[-length(years)]) {
    sim <- textstat_simil(
      dfm_subset(dfmat, Year %in% c(years[i], years[i + 1])),
      method = "jaccard"
    )
    df <- rbind(df, as.data.frame(sim))
  }
  df
})

现在,当我们加入他们时,您可以看到我们只计算了我们需要的。

do.call(rbind, simpairs)
##          document1       document2    jaccard
## 1  1789-Washington 1793-Washington 0.09250399
## 2   1801-Jefferson  1805-Jefferson 0.20512821
## 3     1809-Madison    1813-Madison 0.20138889
## 4      1817-Monroe     1821-Monroe 0.29436202
## 5     1829-Jackson    1833-Jackson 0.20693928
## 6     1861-Lincoln    1865-Lincoln 0.14055885
## 7       1869-Grant      1873-Grant 0.20981595
## 8   1885-Cleveland  1893-Cleveland 0.23037543
## 9    1897-McKinley   1901-McKinley 0.25031211
## 10     1913-Wilson     1917-Wilson 0.21285564
## 11  1933-Roosevelt  1937-Roosevelt 0.20956522
## 12  1937-Roosevelt  1941-Roosevelt 0.20081549
## 13  1941-Roosevelt  1945-Roosevelt 0.18740157
## 14 1953-Eisenhower 1957-Eisenhower 0.21566976
## 15      1969-Nixon      1973-Nixon 0.23451777
## 16     1981-Reagan     1985-Reagan 0.24381368
## 17    1993-Clinton    1997-Clinton 0.24199623
## 18       2001-Bush       2005-Bush 0.24170616
## 19      2009-Obama      2013-Obama 0.24739195

为了计算相似性,您可能想在dfm创建行中添加更多选项-我只在这里删除了标点符号,但如果需要的话,您也可以删除停用词,数字等。

r corpus quanteda
1个回答
0
投票

有趣的问题。我没有可复制的示例,但是我想我可以使用内置的第一语言集数据集创建一个示例。在这里,我将文档变量Year用作时间变量,并将唯一的总裁(全名)姓名用作您的组织的类比(因为您不希望对不同组织进行年度比较。因此,如果将您的组织和时间变量替换为下面的变量应该起作用。

请注意,我将外部的“循环”设置为lapply,而内部的则为实际的循环,但是有一些巧妙的方法可以使内部的部分也变为lapply。为了简单起见,这里将其保留为for循环。

[首先,请使用唯一的名称,因为有些(不同的)总裁共享相同的姓氏。

library("quanteda")
## Package version: 2.0.1

data_corpus_inaugural$president <- paste(data_corpus_inaugural$President,
  data_corpus_inaugural$FirstName,
  sep = ", "
)
head(data_corpus_inaugural$president, 10)
##  [1] "Washington, George" "Washington, George" "Adams, John"       
##  [4] "Jefferson, Thomas"  "Jefferson, Thomas"  "Madison, James"    
##  [7] "Madison, James"     "Monroe, James"      "Monroe, James"     
## [10] "Adams, John Quincy"

simpairs <- lapply(unique(data_corpus_inaugural$president), function(x) {
  dfmat <- corpus_subset(data_corpus_inaugural, president == x) %>%
    dfm(remove_punct = TRUE)
  df <- data.frame()
  years <- sort(dfmat$Year)
  for (i in seq_along(years)[-length(years)]) {
    sim <- textstat_simil(
      dfm_subset(dfmat, Year %in% c(years[i], years[i + 1])),
      method = "jaccard"
    )
    df <- rbind(df, as.data.frame(sim))
  }
  df
})

现在,当我们加入他们时,您可以看到我们只计算了我们需要的。

© www.soinside.com 2019 - 2024. All rights reserved.