我有一個非常大的資料集,看起來像這樣。
我有兩種型別的資料框
- 我的參考資料框
ref=c("cake","brownies")
和我的實驗 data.frame
expr=c("cak","cakee","cake", "rownies","browwnies")
我想匹配的裁判和EXPR data.frames并找到它們之間的編輯距離。輸出可能是這樣的......
ref expr distance
cake cak 1
cake cakee 1
cake cake 0
cake rownies ...
在我測量了它們的 levenstein 距離之后,我想將距離小于 3 的任何字串聚類到一個簇中,并且我的資料可能看起來像
ref expr distance cluster
cake cak 1 1
cake cakee 1 1
cake cake 0 1
brownies rownies 1 2
brownies browwnies 1 2
任何有關如何繼續前進的幫助或建議都值得感謝。目前我正在嘗試很多 R 包來找到 data.frame 之間的距離,例如
library("DescTools")
但它們似乎效果不佳。
uj5u.com熱心網友回復:
這是我處理它的兩種方法,一種是嚴格監督和更多手動操作,另一種是采用較少監督的方法。這個包stringdist有一堆不同的距離度量,"lv"Levenshtein在哪里。我添加了一個額外的觀察“poundcake”來測驗一個與參考詞相差太遠的詞。
選項1
獲取每個實驗字串與參考字串之一之間的距離矩陣。如果您有 2 個相似的參考字串,或者一個實驗詞同樣接近 2 個參考,這可能會出現問題,但它適用于這個簡單的情況。然后將矩陣重新整形為資料框,并沿參考詞計數以獲得聚類數。過濾距離小于閾值的情況。
library(dplyr)
library(stringdist)
max_dist <- 3
ref <- c("cake", "brownies")
expr <- c("cak", "cakee", "cake", "poundcake", "rownies","browwnies")
mtx <- stringdistmatrix(ref, expr, method = "lv", useNames = "strings")
mtx
#> cak cakee cake poundcake rownies browwnies
#> cake 1 1 0 5 6 8
#> brownies 8 7 7 8 1 1
df1 <- as.data.frame(mtx) %>%
tibble::rownames_to_column("ref") %>%
tidyr::pivot_longer(-ref, names_to = "expr", values_to = "dist") %>%
mutate(clust = as.numeric(forcats::as_factor(ref))) # could also use data.table::rleid
df1 %>%
filter(dist <= max_dist)
#> # A tibble: 5 × 4
#> ref expr dist clust
#> <chr> <chr> <dbl> <dbl>
#> 1 cake cak 1 1
#> 2 cake cakee 1 1
#> 3 cake cake 0 1
#> 4 brownies rownies 1 2
#> 5 brownies browwnies 1 2
選項 2
這可能適用于更復雜的情況。我用它來糾正人名的拼寫,我有一套不完整的正確標簽可供使用。將所有的詞組合成1個向量,得到一個距離矩陣(這次是正方形),然后使用閾值作為高度來從層次聚類中創建聚類來切割樹。然后,您可以匹配每個單詞的參考以獲取集群的標簽。
這里的缺點是,您有一些用于非實驗性參考詞的行——請注意,例如,“brownies”在實驗性字串中的拼寫從未正確,但現在您有了觀察結果。
all_words <- c(ref, expr)
hc <- hclust(stringdistmatrix(all_words, method = "lv", useNames = "strings"))
df2 <- data.frame(word = c(ref, expr),
clust = cutree(hc, h = max_dist)) %>%
mutate(r = ref[clust])
df2 %>%
filter(!is.na(r))
#> word clust r
#> 1 cake 1 cake
#> 2 brownies 2 brownies
#> 3 cak 1 cake
#> 4 cakee 1 cake
#> 5 cake 1 cake
#> 6 rownies 2 brownies
#> 7 browwnies 2 brownies
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/383104.html
上一篇:改變小標題串列中的所有列
下一篇:將7列的資料分類為2
