Я хотел бы спросить вас, может ли кто-нибудь проверить мой код, потому что он ведет себя странно - не работает, из-за чего я могу неожиданно работать без каких-либо изменений - код будет внизу.
Справочная информация : Таким образом, моя цель состоит в том, чтобы рассчитать сходство текста [на данный момент, косинус] между ежегодными заявлениями, сделанными несколькими странами на Генеральной Ассамблее ООН. В частности, найдите сходство между утверждением x и утверждением y в данном году и делайте это в течение всех 45 лет. Так что я могу сделать график для его эволюции.
Как я это сделал: Итак [я новичок] я решил выполнить работу в несколько этапов - сначала найти сходство утверждений страны А со страной В, а затем заново выполнить работу. для других стран (страна А остается, все для страны А).
Итак, я отфильтровал заявления по стране А, упорядоченные по годам. Делал предварительную обработку текста (токенизация, понижение, стоп-слова, леменизация, мешок слов). И затем я сделал из нее матрицу TF-IDF с именем: text.tokens.tfidf
Я проделал тот же процесс для Страны B и получил text.tokensChina.tfidf - просто заменил все текстовые токены на text.tokensChina на новой бумаге. Таким образом, каждая матрица содержит tf-idf годовых отчетов за 1971 - 2005 гг., Где Rows = документы (годы) и столбцы = сроки.
Расчет косинусного сходства: Поэтому я решил использовать Text2Vec, как описано здесь - , однако я не определил общее пространство и проектные документы для него - не знаю, если это важно. А потом решил написать две функции sim2 и psim2 , так как я не знал разницу параллельно.
Что было не так в начале: При первом запуске функций я получал сообщение об ошибке, вероятно, сообщая, что мои длины столбцов в двух матрицах TF-IDF не совпадают:
ncol (x) == ncol (y) не ИСТИНА
Однако, повторно запустив код для всех моих шагов и затем повторив попытку, это сработало, но я ничего не изменил ...
Результаты: Результат для функции sim2 - странная таблица [1:45, 1:45]. Ясно, что не то, что я хотел - одна колонка со сходством между речью страны А и страны Б в данном году.
Результат для функции 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)
Изображение глобальной окружающей среды:
Изображение моего экрана с результатами Global Environment + Psim2