人工智能总目录

新闻头条数据进行聚类分析

  • 人工智能总目录
  • 1. 数据集信息
  • 2. 数据预处理
    • 2.1 为向量化表示进行前处理
    • 2.2 TF-IDF
    • 2.3 Stemming
    • 2.4 Tokenizing
    • 2.5 使用停用词、stemming 和自定义的 tokenizing 进行 TFIDF 向量化
  • 3 K-Means 聚类
    • 3.1 使用手肘法选择聚类簇的数量
    • 3.2 Clusters 等于 3
    • 3.3 Clusters 等于 5
    • 3.4 Clusters 等于 6

1. 数据集信息

数据集在个人附件中,名为abcnews-date-text.csv。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn.feature_extraction import text
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.cluster import KMeans
from nltk.tokenize import RegexpTokenizer
from nltk.stem.snowball import SnowballStemmer# 读取数据集
data = pd.read_csv("abcnews-date-text.csv",error_bad_lines=False,usecols =["headline_text"])
data.head()
# 获取部分数据快速运行,你可以尝试修改使用的数据量查看后续的建模效果,不过注意使用的数据越多后续模型训练的时间越长
data = data.head(10000)  # 打印数据信息
data.info()
# 删除重复行
data = data.drop_duplicates('headline_text')

2. 数据预处理

2.1 为向量化表示进行前处理

进行自然语言处理时,必须将单词转换为机器学习算法可以利用的向量。如果目标是对文本数据进行机器学习建模,例如电影评论或推文或其他任何内容,则需要将文本数据转换为数字。此过程称为“嵌入”或“向量化”。
进行向量化时,请务必记住,它不仅仅是将单个单词变成单个数字。单词可以转换为数字,整个文档就可以转换为向量。向量的维度往往不止一个,而且对于文本数据,向量通常是高维的。这是因为特征数据的每个维度将对应一个单词,而我们所处理的文档通常包含数千个单词。

2.2 TF-IDF

在信息检索中,tf–idf 或 TFIDF(term frequency–inverse document frequency)是一种数值统计,旨在反映单词对语料库中文档的重要性。在信息检索,文本挖掘和用户建模的搜索中,它通常用作加权因子。 tf-idf 值与单词在文档中出现的次数成正比,同时被单词在语料库中的出现频率所抵消,这有助于调整某些单词通常会更频繁出现的事实。 如今,tf-idf是最流行的术语加权方案之一。在数字图书馆领域,有83%的基于文本的推荐系统使用tf-idf。

搜索引擎经常使用tf–idf加权方案的变体作为在给定用户查询时对文档相关性进行评分和排名的主要工具。tf–idf可成功用于各种领域的停用词过滤,包括文本摘要和分类。

排名函数中最简单的是通过将每个查询词的tf–idf相加得出,许多更复杂的排名函数是此简单模型的变体。

punc = ['.', ',', '"', "'", '?', '!', ':', ';', '(', ')', '[', ']', '{', '}',"%"]
stop_words = text.ENGLISH_STOP_WORDS.union(punc)
desc = data['headline_text'].values
vectorizer = TfidfVectorizer(stop_words = stop_words)
# X 矩阵含义说明, 一行是对应输入的desc 文本的tf-idf 值,每一列与特征的单词对应vectorizer.get_feature_names(),0 说明 该desc 文本没有此特征词。
# fit 学习里面的参数, tfidf 里为统计词频与逆文档率,归一化为计算均值与方差
# transform 把学习到的参数用到数据中。
# fit_transform 实现这两步,得到了一个矩阵的结果。
X = vectorizer.fit_transform(desc)
word_features = vectorizer.get_feature_names()

2.3 Stemming

stemming 是将单词还原为词干(即词根形式)的过程。 词根形式不一定是单词本身,而是可以通过连接正确的后缀来生成单词。 例如,“fish”,“fishes”和“fishing”这几个词的词干都是“fish”,这是一个正确的单词。 另一方面,“study”,“studies”和“studying”一词源于“studi”,这不是一个正确的英语单词。

2.4 Tokenizing

Tokenization 将句子分解为单词和标点符号。

2.5 使用停用词、stemming 和自定义的 tokenizing 进行 TFIDF 向量化

# 设置停用词
punc = ['.', ',', '"', "'", '?', '!', ':', ';', '(', ')', '[', ']', '{', '}',"%"]
stop_words = text.ENGLISH_STOP_WORDS.union(punc)
# 处理词根的方法
stemmer = SnowballStemmer('english')
# 使用正则表达式匹配单词,
tokenizer = RegexpTokenizer(r'[a-zA-Z\']+')def tokenize(text):# 相当于对输入的字符串"aba decides against community broadcasting licence" 进行re.findall匹配# stemmer.stem 对每一个单词进行词根处理return [stemmer.stem(word) for word in tokenizer.tokenize(text.lower())]# 使用最多1000特征,停用词及处理函数
vectorizer3 = TfidfVectorizer(stop_words = stop_words, tokenizer = tokenize, max_features = 1000)
# desc 是列表形式
desc = data['headline_text'].values
# 计算TF-IDF矩阵
X3 = vectorizer3.fit_transform(desc)
words = vectorizer3.get_feature_names()

3 K-Means 聚类

3.1 使用手肘法选择聚类簇的数量

随着聚类数k的增大,样本划分会更加的精细,每个簇的聚合程度会逐渐提高,那么误差平方和SSE自然会逐渐变小,并且当k小于真实的簇类数时,由于k的增大会大幅增加每个簇的聚合程度,因此SSE的下降幅度会很大,而当k到达真实聚类数时,再增加k所得到的聚合程度回报会迅速变小,所以SSE的下降幅度会骤减,然后随着k值的继续增大而趋于平缓,也就是说SSE和k的关系类似于手肘的形状,而这个肘部对应的k值就是数据的真实聚类数.因此这种方法被称为手肘法.

from sklearn.cluster import KMeans
wcss = []
for i in range(1,11):kmeans = KMeans(n_clusters=i,init='k-means++',max_iter=300,n_init=10,random_state=0)kmeans.fit(X3)wcss.append(kmeans.inertia_)
plt.plot(range(1,11),wcss)
plt.title('The Elbow Method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.savefig('elbow.png')
plt.show()

由于可能产生多个肘点,所以有时候不得不通过反复试验来选择合适数量的簇。下面展示不同数量簇的结果,以找出合适数量的簇。

3.2 Clusters 等于 3

kmeans = KMeans(n_clusters = 3, n_init = 20, n_jobs = 1) # n_init(number of iterations for clsutering) n_jobs(number of cpu cores to use)
kmeans.fit(X3)
# We look at 3 the clusters generated by k-means.
# argsort 使用方法详见: https://numpy.org/doc/stable/reference/generated/numpy.argsort.html
common_words = kmeans.cluster_centers_.argsort()[:,-1:-26:-1]
for num, centroid in enumerate(common_words):print(str(num) + ' : ' + ', '.join(words[word] for word in centroid))

3.3 Clusters 等于 5

# 重复上面的做法,仅改变聚类簇的数量 (尝试将上述过程封装成一个函数,减少代码的重读性,方便传参调用)
kmeans = KMeans(n_clusters = 5, n_init = 20, n_jobs = 1)
kmeans.fit(X3)
# We look at 5 the clusters generated by k-means.
common_words = kmeans.cluster_centers_.argsort()[:,-1:-26:-1]
for num, centroid in enumerate(common_words):print(str(num) + ' : ' + ', '.join(words[word] for word in centroid))

3.4 Clusters 等于 6

优质参考内容:

  1. CountVectorizer与TfidfVectorizer https://blog.csdn.net/The_lastest/article/details/79093407

机器学习 K-Means 实现文本聚类 2021-10-30相关推荐

  1. 2021/10/30的1+X大数据Java答案

    2021/10/30 步骤二 public Member() { }public Member(String name,String pwd,float score,int rank) {this.n ...

  2. 基于K-Means的文本聚类

    何为聚类 "聚类是把相似的对象通过静态分类的方法分成不同的组别或者更多的子集(subset),这样让在同一个子集中的成员对象都有相似的一些属性."                 ...

  3. 2021卓见杯第三届CCPC河南省省赛所有题超详细题解附加榜单真题解析,简单代码+详细注释+思想,要看的,补题的速速点进来 2021 10.30

    本人现在比较菜,所以难免出现错误,文章中有不太恰当地方,还请大家指正. 是否因为出题人的简短题解而发愁?,是否看不懂出题人的变态模板标程?是否因为自己是小白而苦恼?来看这片文章,帮助你解决这些问题 题 ...

  4. [2021.10.30][uml]UML顺序图规范

    1 生命线 一般为虚线 2 消息 (1)创始消息 实心圆开头,实心箭头 (2)同步消息 实心箭头 3 控制期 表示阻塞调用 4 返回值 5 自身消息 6 创建实例 虚线实心箭头,新创建的对象实例画在创 ...

  5. 第31课 3721数-2021.10.30 《小学生C++趣味编程》

    /* 试编一程序,输出200以内所有的"3721"数. 除以3余2 同时除以7余1的数叫"3721" */ #include<iostream> # ...

  6. 为了联盟还是为了部落 | K means

    1. 问题 人类有个很有趣的现象,一群人在一起,过一段时间就会自发的形成一个个的小团体.好像我们很擅长寻找和自己气质接近的同类.其实不只是人类,数据也有类似情况,这就是聚类(Clustering)的意 ...

  7. k均值聚类算法(K Means)及其实战案例

    算法说明 K均值聚类算法其实就是根据距离来看属性,近朱者赤近墨者黑.其中K表示要聚类的数量,就是说样本要被划分成几个类别.而均值则是因为需要求得每个类别的中心点,比如一维样本的中心点一般就是求这些样本 ...

  8. OpenCV的k - means聚类 -对图片进行颜色量化

    OpenCV的k - means聚类 目标 学习使用cv2.kmeans()数据聚类函数OpenCV 理解参数 输入参数 样品:它应该的np.float32数据类型,每个特性应该被放在一个单独的列. ...

  9. OpenCV官方文档 理解k - means聚类

    理解k - means聚类 目标 在这一章中,我们将了解k - means聚类的概念,它是如何工作等. 理论 我们将这个处理是常用的一个例子. t恤尺寸问题 考虑一个公司要发布一个新模型的t恤. 显然 ...

  10. hanlp 词频统计_10.HanLP实现k均值--文本聚类

    AI 人工智能 10.HanLP实现k均值--文本聚类 10. 文本聚类 正所谓物以类聚,人以群分.人们在获取数据时需要整理,将相似的数据归档到一起,自动发现大量样本之间的相似性,这种根据相似性归档的 ...

最新文章

  1. 如何识别 Linux 上的文件分身
  2. 大整数减法(超过整型的表示范围)
  3. 服务器开发修改用户密码功能,更改服务器用户密码
  4. FTP软件VSFTP配置文件详解
  5. Clipboard还能玩出花
  6. latex 数学公式_技能分享——LaTeX篇I
  7. Memory存储引擎
  8. sql相同顺序法和一次封锁法_不到75行代码,导出最高法指导案例到excel(一)...
  9. [转载] Python3 * 和 ** 运算符
  10. 牛客编程巅峰赛S2第6场 - 钻石王者
  11. Message no. C6015--No valuation variant found for valuation area xxxx
  12. 路由器装mentohust插件破解锐捷认证(Pandorabox固件)
  13. 【金融市场基础知识】——金融市场体系
  14. Becky!客户端Hotmail/outlook邮箱设置方法
  15. 一年级下册计算机教学计划,人教版一年级数学下册教学计划
  16. 深入学习Docker网络(看这篇就完全够了)
  17. php liger 表格排序,LigerUI之grid表格点击表头标题排序实现
  18. 大白菜安装linux系统安装教程
  19. 计算机接口电路的种类,接口电路的分类_接口电路的功能_接口电路的作用是什么...
  20. 基于Cellar的交互式单细胞数据分析

热门文章

  1. 商机网海量资源,帮助企业高效采购
  2. 从.gdf格式的脑电数据中获得脑电数据,通道名称,采用频率。
  3. 局域网、广域网、互联网三者的区别以及应用领域
  4. 【Proteus仿真】【51单片机】竞赛抢答器设计
  5. 一个将数字转换为文本的VBA宏
  6. Jetson基本笔录2 -- 源码编译与KO生成
  7. 20以内分数化小数表_初等数学33-百分数
  8. 有望成为“美容院第一股”美丽田园通过港交所上市ipo聆讯
  9. Orange与中兴通讯完成欧洲首个100% 5G通话
  10. Faces la Carte: 根据目击者描述自动生成目标人脸图像