rlads2021 / hw10

HW 10: Vector representations of text
https://rlads2021.github.io/hw10/
0 stars 0 forks source link

第一題檢驗碼問題 #3

Open patricia40719 opened 3 years ago

patricia40719 commented 3 years ago

請問針對最後面的檢驗碼encode_document(docs = c(doc1, doc2), dtm = q_dfm, lsa = lsa_model)出現錯誤: features must be coercible to character,這是什麼意思?

liao961120 commented 3 years ago

我看了你的程式碼,應該是因為斷詞那邊的寫法,造成斷詞後的資料結構與後續函數所要求的不一樣。 記得餵給 tokens() 的結構要是個 list,裡面的每個元素是一篇斷好詞的文章 (character vector):

library(dplyr)
library(quanteda)

segged_docs <- list(
   c("這是", "第一篇", "文章" ),
   c("那", "是", "第二篇", "文章")
)
segged_docs
#> [[1]]
#> [1] "這是"   "第一篇" "文章"  
#> 
#> [[2]]
#> [1] "那"     "是"     "第二篇" "文章"
segged_docs %>% tokens()
#> Tokens consisting of 2 documents.
#> text1 :
#> [1] "這是"   "第一篇" "文章"  
#> 
#> text2 :
#> [1] "那"     "是"     "第二篇" "文章"
segged_docs %>% tokens() %>% dfm()
#> Document-feature matrix of: 2 documents, 6 features (41.67% sparse) and 0 docvars.
#>        features
#> docs    這是 第一篇 文章 那 是 第二篇
#>   text1    1      1    1  0  0      0
#>   text2    0      0    1  1  1      1
patricia40719 commented 3 years ago

但使用函數segment(docs, worker() )處理過後的檔案就已經是一個「每個元素是一篇斷好詞的文章」的list了不是嗎,為什麼我將segment()處理後的檔案丟進tokens()還是不行呢? 然後如果寫成list( segment(docs, seg ) ),這樣text1和text2都會被丟進list的第一個元素,這樣也沒辦法跑tokens(),還是有沒有什們辦法把text1和text2拆成兩個元素呢?

liao961120 commented 3 years ago

嗯沒錯 你要研究看看 worker() bylines 的設定對於輸出的資料結構的影響

liao961120 commented 3 years ago

但使用函數segment(docs, worker() )處理過後的檔案就已經是一個「每個元素是一篇斷好詞的文章」的list了不是嗎

這個不正確喔,worker() 預設的情形下會讓 segment() 將所有傳入的 vector 元素當成「一篇」文章:

library(jiebaR)

docs <- c(
   "這是第一篇文章",
   "那是第二篇文章"
)
seg1 <- worker()
seg2 <- worker(bylines = T)

segment(docs, seg1)
#> [1] "這是"   "第一篇" "文章"   "那"     "是"     "第二篇" "文章"
segment(docs, seg2)
#> [[1]]
#> [1] "這是"   "第一篇" "文章"  
#> 
#> [[2]]
#> [1] "那"     "是"     "第二篇" "文章"