Схожесть текста - косинус - контроль - PullRequest
0 голосов
/ 15 ноября 2018

Я хотел бы спросить вас, может ли кто-нибудь проверить мой код, потому что он ведет себя странно - не работает, из-за чего я могу неожиданно работать без каких-либо изменений - код будет внизу.

Справочная информация : Таким образом, моя цель состоит в том, чтобы рассчитать сходство текста [на данный момент, косинус] между ежегодными заявлениями, сделанными несколькими странами на Генеральной Ассамблее ООН. В частности, найдите сходство между утверждением 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

1 Ответ

0 голосов
/ 18 ноября 2018

Ну, в итоге все закончено.Не сравнивать вещи в одном векторном пространстве.Не говоря уже о том, что лучший способ - использовать doc2vec, но я пытался разобраться с этим несколько дней и, к сожалению, ничего не получил.

...