我想问你,是否有人可以检查我的代码,因为它的行为很奇怪 - 不工作,给我错误,突然工作而没有改变任何东西 - 代码将在底部。
背景:所以我的目标是计算几个国家在联合国大会上发表的年度声明之间的文本相似度 [cosine, for now] 。更具体地说,在给定年份中找到语句 x 和语句 y 之间的相似性,并在所有 45 年中进行。所以我可以为它的演变做一个图表。
我是怎么做的:所以[我是新手]我决定分几个步骤来做这项工作——首先找到 A 国与 B 国的陈述的相似性,然后为其他国家重新做这项工作(A 国留下,一切是A国)。
所以我过滤了 A 国的报表,按年份排列。是否进行了文本预处理(标记化、降级、停用词、字元化、词袋)。然后我从中制作了一个 TF-IDF 矩阵 - 命名为:text.tokens.tfidf
我为 B 国做了同样的过程,得到了text.tokensChina.tfidf - 只是在新纸上将所有 text.tokens 替换为 text.tokensChina。因此,每个矩阵都包含 1971 年至 2005 年的年度报表的 tf-idf,其中行 = 文档(年),列 = 术语。
计算余弦相似度:所以我决定使用此处描述的 Text2Vec -但是,我没有为其定义公共空间和项目文档- 不知道它是否至关重要。然后决定给两个函数sim2 和 psim2 发短信,因为我不知道并行的区别。
一开始出了什么问题:当第一次运行函数时,我收到一个错误,可能告诉我,我在两个 TF-IDF 矩阵中的列长度不匹配:
ncol(x) == ncol(y) 不正确
但是,重新运行我所有步骤的代码,然后再试一次,它起作用了,但我没有改变任何东西......
结果:函数 sim2 的结果是奇怪的表 [1:45, 1:45]。显然不是我想要的——在给定年份 A 国和 B 国的演讲相似的专栏。
函数 psim2 的结果更好 - 一列的结果[不确定,虽然它们有多正确]。
技术问题:使用 Psim2 是我想要的 - 我没有看到 sim2 创建了类似相关热图的东西,我的错。但是为什么即使列的长度不同(图片),Psim2 函数也能正常工作?另外,我没有做错什么吗,尤其是当我没有创建一个公共空间的时候?
代码,图片:
# *** Text Pre-Processing with Quanteda ***
# 1. Tokenization
text.tokens <- tokens(docs$text, what = 'word',
remove_numbers = TRUE,
remove_punct = TRUE,
remove_symbols = TRUE,
remove_hyphens = TRUE)
# 2. Transform words to lower case
text.tokens <- tokens_tolower(text.tokens)
# 3. Removing stop-words (Using quanteda's built-in stopwords list)
text.tokens <- tokens_select(text.tokens, stopwords(),
selection = 'remove')
# 4. Perform stemming on the tokens.
text.tokens <- tokens_wordstem(text.tokens, language = 'english')
# 5. Create bag-of-words model / document feature(frequance)
text.tokens.dfm <- dfm(text.tokens, tolower = FALSE)
# 6. Transform to a matrix to work with and inspect
text.tokens.matrix <- as.matrix(text.tokens.dfm)
dim(text.tokens.matrix)
# *** Doing TF-IDF ***
# Defining Function for calculating relative term frequency (TF)
term.frequency <- function(row) {
row / sum(row)
}
# Defining Function for calculating inverse document frequency (IDF)
inverse.doc.freq <- function(col) {
corpus.size <- length(col)
doc.count <- length(which(col > 0))
log10(corpus.size / doc.count)
}
# Defining function for calculating TD-IDF
tf.idf <- function(tf, idf) {
tf * idf
}
# 1. First step, normalize all documents via TF.
text.tokens.df <- apply(text.tokens.matrix, 1, term.frequency)
dim(text.tokens.df)
# 2. Second step, calculate the IDF vector
text.tokens.idf <- apply(text.tokens.matrix, 2, inverse.doc.freq)
str(text.tokens.idf)
# 3. Lastly, calculate TF-IDF for our corpus
# Apply function on columns, because matrix is transposed from TF function
text.tokens.tfidf <- apply(text.tokens.df, 2, tf.idf, idf = text.tokens.idf)
dim(text.tokens.tfidf)
# Now, transpose the matrix back
text.tokens.tfidf <- t(text.tokens.tfidf)
dim(text.tokens.tfidf)
# Cosine similarity using Text2Vec
similarity.sim2 <- sim2(text.tokensChina.tfidf, text.tokensChina.tfidf, method = "cosine", norm = "none")
similarity.psim2 <- psim2(text.tokensChina.tfidf, text.tokensChina.tfidf, method = "cosine", norm = "none")
similarity.psim2 <- as.data.frame(similarity.psim2)
全球环境图片: 我的屏幕图片与全球环境 + Psim2 结果