美文网首页R炒面
111-文本分析之基于文本相似度的聚类

111-文本分析之基于文本相似度的聚类

作者: wonphen | 来源:发表于2022-10-06 19:14 被阅读0次

参考:《文本数据挖掘》

1、相似度计算

p_load(stringdist)

# 越接近1相似度越高
stringsim("hello", "Hello", method = "lv")
## [1] 0.8
# 通过dist函数求iris数据集前四列的相互距离
# 默认为欧式距离
dist(t(iris[, 1:4]))
##              Sepal.Length Sepal.Width Petal.Length
## Sepal.Width      36.15785                         
## Petal.Length     28.96619    25.77809             
## Petal.Width      57.18304    25.86407     33.86473
# 利用Pearson相关系数来表征不同变量之间的相似度
p_load(apcluster)

corSimMat(t(iris[, 1:4]))
##              Sepal.Length Sepal.Width Petal.Length Petal.Width
## Sepal.Length    1.0000000  -0.1175698    0.8717538   0.8179411
## Sepal.Width    -0.1175698   1.0000000   -0.4284401  -0.3661259
## Petal.Length    0.8717538  -0.4284401    1.0000000   0.9628654
## Petal.Width     0.8179411  -0.3661259    0.9628654   1.0000000

2、 聚类方法

划分聚类法:k-means聚类法、k-medoids聚类法等
层次聚类法:合成法(Agglomerative Clustering)和分割法(Divise Clustering)

p_load(tokenizers)
str_vec <- df$sku_name[1:5] %>% 
  paste0(collapse = " ") %>% 
  tokenize_words(strip_punct = T, strip_numeric = T, 
                 simplify = T) 

# Levenshtein距离计算
d <- adist(str_vec)

# 如果量纲不一致或极差很大,还需要提前中心化和标准化
# d_scale <- scale(d)

2.1 K-means聚类

# 确定分类数量
p_load(factoextra)

# method则设定了最小化损失函数的计算方法
fviz_nbclust(d, kmeans, method = "wss")
确定分类数量

k=3以后就很难减少损失函数,因此设定k=3。

km <- kmeans(d, centers = 3)
# 查看分类
km$cluster
##  [1] 1 2 2 1 3 2 2 1 2 2 1 3 2 1 1 1 1 2 2 1 1 3 1 3 3 1 2 2 3 2 2 2 1 2 2 1 2 2 2 3 2 2 2 2
## [45] 2 2 2 2 2 1 2 2 1 2 2 2 2 3 2 1 1 3 1 2 2 2 2 1 1 2 1 2 2 1 3 2 1 1 2
# 查看字符串分别属于哪个类
cbind(class = km$center, string = str_vec)
# 基于PCA的可视化方法呈现分类结果
fviz_cluster(km,
             data = d,
             # 椭圆
             ellipse.type = "euclid",
             # 防止标注交叠
             repel = T,
             # 绘制主题
             ggtheme = theme_minimal())
基于PCA方法呈现分类结果

2.2 PAM算法

可以缓解kmeans聚类的缺点。

p_load(cluster)

# pam算法进行最佳聚类数判断
fviz_nbclust(d, pam, method = "silhouette")
确定最佳分类数

可以看到最佳聚类数为2。

pam <- pam(d, 2)

cbind(class = pam$clustering, string = str_vec)
##       class string       
##  [1,] "1"   "1000pcs"    
##  [2,] "1"   "32mm"       
##  [3,] "1"   "0.5ml"      
##  [4,] "1"   "plastic"    
##  [5,] "2"   "centrifuge" 
##  [6,] "1"   "tube"       
##  [7,] "1"   "test"       
##  [8,] "1"   "tubing"     
##  [9,] "1"   "vial"       
## [10,] "1"   "clear"      
## [11,] (省略。。。)
# 聚类效果
fviz_cluster(pam, ellipse.type = "euclid",
             repel = T,
             ggtheme = theme_classic())
聚类效果
# 使用fpc包高效实现k-medoids方法
p_load(fpc)

# 设置K取值范围为1到10,返回最佳聚类结果
pam2 <- pamk(d, krange = 1:10)

pam2$nc
## [1] 2

PAM算法虽然解决了很多问题,但是它在处理大数据集的时候,对计算机内存要求很高,而且耗费时间也比较长。为了解决这个问题,CLARA(Clustering Large Applications)算法被提了出来。

2.3 CLARA算法

# 判断最佳聚类数
fviz_nbclust(d, clara, method = "silhouette") +
  theme_classic()
确定最佳分类数
# 聚类分析
clara_res <- clara(d, 2, 
                   # 设定子集大小
                   samples = 50, pamLike = T)

# 显示聚类结果
cbind(class = clara_res$clustering, string = str_vec)
##       class string       
##  [1,] "1"   "1000pcs"    
##  [2,] "2"   "32mm"       
##  [3,] "2"   "0.5ml"      
##  [4,] "1"   "plastic"    
##  [5,] "1"   "centrifuge" 
##  [6,] "2"   "tube"       
##  [7,] "2"   "test"       
##  [8,] "2"   "tubing"     
##  [9,] "2"   "vial"       
## (省略。。。)
# 可视化展示
fviz_cluster(clara_res, ellipse.type = "euclid",
             repel = T, ggtheme = theme_classic())

2.4 层次聚类法

2.4.1 合成法

p_load(cluster)

# 为距离矩阵的行进行命名,方便显示结果
rownames(d) <- str_vec

# 聚类
# stand参数控制是否进行标准化(默认为FALSE),用metric参数控制样本距离的计算方法(默认为“euclidean”,即欧式距离)
# 用method参数设置聚类方法(默认为“average”)
res_agnes <- agnes(d)

# 查看分类结果
res_agnes
## Call:     agnes(x = d) 
## Agglomerative coefficient:  0.8408839 
## Order of objects:
##  [1] 1000pcs     1000pcs     plastic     plastic     plastic     plastic     nonstick   
##  [8] 32mm        22mm        33mm        50ml        26ml        0.5ml       0.2ml      
## [15] tube        tube        style       size        hinge       with        mini       
## [22] tin         test        case        pcr         dab         jars        jars       
## [29] home        cork        gold        lot         x           box         box        
## [36] box         boxes       vial        vials       vials       small       small      
## [43] glass       glass       clear       candy       zakka       empty       metal      
## [50] 12pcs       10pcs       tubing      design      wedding     garden      casket     
## [57] silver      novelty     newest      bottles     bottles     bottles     storage    
## [64] storage     storage     storage     protable    centrifuge  centrifuge  container  
## [71] container   containers  organizer   gardening   capacity    silicone    households 
## [78] transparent transparent
## Height (summary):
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   2.000   8.570   8.552  12.258  31.678 
## 
## Available components:
## [1] "order"     "height"    "ac"        "merge"     "diss"      "call"      "method"   
## [8] "order.lab" "data"

通过agnes函数求得的是样本之间的亲疏关系,而没有直接进行分类。如果要进行分类,可以指定分类的数量,然后用cutree函数实现

group_info <- cutree(res_agnes, k = 2)
group_info
##  [1] 1 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 2 1 2 2 1 1 1 2 1 1 1 2 1 1 1 1 1 1 2 1 1 1 1
## [45] 1 1 1 1 1 1 1 1 1 1 1 1 1 2 1 1 1 2 1 1 1 1 1 1 1 1 2 1 1 1 2 1 1 1 1
# 不进行分类
fviz_dend(res_agnes)
为分类结果
# 进行分类
fviz_dend(res_agnes, k = 2, 
          # 标志大小
          cex = 0.5,
          # 设定类别颜色
          k_colors = c("#FC4E07", "#00AFBB"),
          # 设定标志颜色
          color_labels_by_k = T,
          # 设定矩形边框
          rect = T)
分类后结果
# 使用PCA方法对结果进行可视化

fviz_cluster(list(data = as_tibble(d), cluster = group_info),
             palette = c("#FC4E07", "#00AFBB"),
             ellipse.type = "convex",
             repel = T,
             show.clust.cent = F,
             ggtheme = theme_minimal())
PCA方法可视化

2.4.2 分割法

只需要将agnes函数换为diana函数即可。

相关文章

  • 111-文本分析之基于文本相似度的聚类

    参考:《文本数据挖掘》 1、相似度计算 2、 聚类方法 划分聚类法:k-means聚类法、k-medoids聚类法...

  • NLP之文本聚类

    一 文本聚类简介 1.1、定义 文本聚类主要是依据著名的聚类假设:同类的文档相似度较大,而不同类的文档相似度较小。...

  • 2018-06-23NLP知识体系

    NLP 自然语言处理的大致知识领域如下 语法分析 句法分析 情感分析 句子生成 句子相似度 文本分类/聚类 文本表...

  • 文本相似度-simhash

    之前流量检测项目针对恶意请求文本做过聚类 , 其中用到计算文本的相识度,文本相似度曾经尝试过用simhash,虽然...

  • 2018-12-19

    文本聚类算法之K-means算法的python实现 一、文本聚类定义 文本聚类主要是依据著名的聚类假设:同类...

  • 2018-05-04 python实现brich文本层次聚类

    利用brich实现文本层次聚类,将文本内容分类 将相似的文本进行聚类 然后选出同类中最具有代表的一条数据输入数据:...

  • pyhanlp文本聚类详细介绍

    文本聚类 文本聚类简单点的来说就是将文本视作一个样本,在其上面进行聚类操作。但是与我们机器学习中常用的聚类操作不同...

  • 1.层次聚类

    1.定义 层次聚类(hierarchical clustering)基于簇间的相似度在不同层次上分析数据,从而形成...

  • 文本聚类

    背景介绍 由于项目需要,需要对旅游游记文本进行聚类,为打标签做指导,所以调研了主流的短文本聚类方法,文本聚类主要还...

  • 余弦相似度理解及shengxin中应用

    cosin similarity(余弦相似度) 1,它最常见的应用是计算文本相似度。将文本转换为向量 2,余弦相似...

网友评论

    本文标题:111-文本分析之基于文本相似度的聚类

    本文链接:https://www.haomeiwen.com/subject/nvnmartx.html