我想问你,是否有人可以检查我的代码,因为它很奇怪-无法正常工作,使我突然出错而又未做任何更改而出现错误-代码将位于底部。
背景:因此,我的目标是要计算联合国在一些国家/地区发表的年度声明之间的文本相似度(目前为余弦)。更具体地说,找到给定年份中的语句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,其中行=文档(年),列=术语。
计算余弦相似度:因此,我决定按照here所述使用Text2Vec-但是,我没有为其定义公共空间和项目文档-不重要。然后决定输入两个函数 sim2和psim2 ,因为我不知道并行的区别。
开始时出了什么问题:第一次运行函数时,我遇到一个错误,可能是在告诉我,我在两个TF-IDF矩阵中的列长不匹配:< / p>
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)
全球环境图片: Picture of my screen with Global Environment + Psim2 Results
答案 0 :(得分:0)
结果是,整个过程都是完整的BS。没有在一个向量空间中比较事物。更不用说,最好的方法是使用doc2vec,但是不幸的是,我试图弄清楚了几天,却一无所获。