添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
温柔的拐杖  ·  customer_v2·  3 月前    · 
苦闷的鞭炮  ·  Temporal + Selenium ...·  5 月前    · 
严肃的打火机  ·  TypeScript static ...·  6 月前    · 
呐喊的乌冬面  ·  Unavailable - ...·  8 月前    · 


1. 文本聚类概述

一个好的聚类要保证簇内点的距离尽量的近,但簇与簇之间的点要尽量的远。

整个过程分为以下几个步骤:

  • 语料加载
  • 分词
  • 去停用词
  • 抽取词向量特征
  • 实战 TF-IDF 的中文文本 K-means 聚类
  • 实战 word2Vec 的中文文本 K-means 聚类
import random
import jieba
import pandas as pd
import numpy as np
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import TfidfVectorizer
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
import gensim
from gensim.models import Word2Vec
from sklearn.preprocessing import scale
import multiprocessing

import warnings

warnings.filterwarnings('ignore')

import os

2.加载数据

ch_path = '动手实战基于ML的中文短文本分类/data/'
#加载停用词
stopwords=pd.read_csv(ch_path+'stopwords.txt',index_col=False,quoting=3,sep="\t",names=['stopword'], encoding='utf-8')
stopwords=stopwords['stopword'].values
stopwords
#加载语料
laogong_df = pd.read_csv(ch_path+'beilaogongda.csv', encoding='utf-8', sep=',')
laopo_df = pd.read_csv(ch_path+'beilaopoda.csv', encoding='utf-8', sep=',')
erzi_df = pd.read_csv(ch_path+'beierzida.csv', encoding='utf-8', sep=',')
nver_df = pd.read_csv(ch_path+'beinverda.csv', encoding='utf-8', sep=',')

#删除语料的nan行
laogong_df.dropna(inplace=True)
laopo_df.dropna(inplace=True)
erzi_df.dropna(inplace=True)
nver_df.dropna(inplace=True)

#转换
laogong = laogong_df.segment.values.tolist()
laopo = laopo_df.segment.values.tolist()
erzi = erzi_df.segment.values.tolist()
nver = nver_df.segment.values.tolist()

3.分词、停止词

#定义分词函数preprocess_text
#参数content_lines即为上面转换的list
#参数sentences是定义的空list,用来储存分词后的数据

def preprocess_text(content_lines, sentences):
for line in content_lines:
try:
segs=jieba.lcut(line)
segs = [v for v in segs if not str(v).isdigit()]#去数字
segs = list(filter(lambda x:x.strip(), segs)) #去左右空格
segs = list(filter(lambda x:len(x)>1, segs)) #长度为1的字符
segs = list(filter(lambda x:x not in stopwords, segs)) #去掉停用词
sentences.append(" ".join(segs))
except Exception:
print(line)
continue
# 调用函数,得到一个数据集sentences。
"""
调用函数、生成训练数据,根据我提供的司法语料数据,
分为报警人被老公打,报警人被老婆打,报警人被儿子打,报警人被女儿打,标签分别为0、1、2、3
"""
sentences = []
preprocess_text(laogong, sentences)
preprocess_text(laopo, sentences)
preprocess_text(erzi, sentences)
preprocess_text(nver, sentences)
random.shuffle(sentences)
# 观察前10条数据
for sentence in sentences[:10]:
print(sentence)

4. 抽取TF-IDF词向量特征。

抽取特征,将文本中的词语转换为词频矩阵,统计每个词语的 tf-idf 权值,获得词在对应文本中的 tf-idf 权重:

#将文本中的词语转换为词频矩阵 矩阵元素a[i][j] 表示j词在i类文本下的词频
vectorizer = TfidfVectorizer(sublinear_tf=True, max_df=0.5)

#统计每个词语的tf-idf权值
transformer = TfidfTransformer()

# 第一个fit_transform是计算tf-idf 第二个fit_transform是将文本转为词频矩阵
tfidf = transformer.fit_transform(vectorizer.fit_transform(sentences))

# 获取词袋模型中的所有词语
word = vectorizer.get_feature_names()

# 将tf-idf矩阵抽取出来,元素w[i][j]表示j词在i类文本中的tf-idf权重
weight = tfidf.toarray()

#查看特征大小
print ('Features length: ' + str(len(word)))

5.训练聚类模型

'''
使用 k-means++ 来初始化模型,当然也可以选择随机初始化,即 init="random",然后通过 PCA 降维把上面的权重 weight 降到10维,进行聚类模型训练:

'''

numClass=4 #聚类分几簇
clf = KMeans(n_clusters=numClass, max_iter=10000, init="k-means++", tol=1e-6) #这里也可以选择随机初始化init="random"
pca = PCA(n_components=10) # 降维
TnewData = pca.fit_transform(weight) # 载入N维
s = clf.fit(TnewData)
# 查看聚类的可视化效果

"""
第二步,定义聚类结果可视化函数 plot_cluster(result,newData,numClass),该函数包含3个参数,其中 result 表示聚类拟合的结果集;
newData 表示权重 weight 降维的结果,这里需要降维到2维,
即平面可视化;numClass 表示聚类分为几簇,绘制代码第一部分绘制结果 newData,第二部分绘制聚类的中心点:
"""

def plot_cluster(result,newData,numClass):
plt.figure(2)
Lab = [[] for i in range(numClass)]
index = 0
for labi in result:
Lab[labi].append(index)
index += 1
color = ['oy', 'ob', 'og', 'cs', 'ms', 'bs', 'ks', 'ys', 'yv', 'mv', 'bv', 'kv', 'gv', 'y^', 'm^', 'b^', 'k^',
'g^'] * 3
for i in range(numClass):
x1 = []
y1 = []
for ind1 in newData[Lab[i]]:
# print ind1
try:
y1.append(ind1[1])
x1.append(ind1[0])
except:
pass
plt.plot(x1, y1, color[i])

#绘制初始中心点
x1 = []
y1 = []
for ind1 in clf.cluster_centers_:
try:
y1.append(ind1[1])
x1.append(ind1[0])
except:
pass
plt.plot(x1, y1, "rv") #绘制中心
plt.show()
# 对数据降维到2维,然后获得结果,最后绘制聚类结果图:4个中心点和4个簇

pca = PCA(n_components=2) # 输出两维
newData = pca.fit_transform(weight) # 载入N维
result = list(clf.predict(TnewData))
plot_cluster(result,newData,numClass)

11.基于ML的中文短文本聚类_开发语言

"""
因为原理不同,导致 TSNE 保留下的属性信息,更具代表性,也即最能体现样本间的差异,
但是 TSNE 运行极慢,PCA 则相对较快,TSNE可视化结果:

from sklearn.manifold import TSNE
ts =TSNE(2)
newData = ts.fit_transform(weight)
result = list(clf.predict(TnewData))
plot_cluster(result,newData,numClass)


"""

# 为了更好的表达和获取更具有代表性的信息,在展示(可视化)高维数据时,更为一般的处理,常常先用 PCA 进行降维,再使用 TSNE:
from sklearn.manifold import TSNE
newData = PCA(n_components=4).fit_transform(weight) # 载入N维
newData =TSNE(2).fit_transform(newData)
result = list(clf.predict(TnewData))
plot_cluster(result,newData,numClass)

11.基于ML的中文短文本聚类_聚类_02


java 抽取 类 java抽取数据

使用POI读取excel,并输出为sql语句一、准备工作二、编写代码(Transform.java)三、完整代码四、POI所有常用方法参考 一、准备工作1.1.新建一个普通的Maven项目1.2.使用Maven导入POI依赖POI包提供了大量的方法,可以使Java对Microsoft Office格式文档进行读/写的操作<dependencies>

用python做计量经济学 python经济学应用

原标题:【经济金融及Python应用讲义】数据管理专题(一)【经济金融及Python应用讲义】 数据管理——获取数据源 1、导入外部数据导入数据主要用到Pandas里面的read_x方法,其中x表示导入文件的格式1、导入Excel格式数据#首先生成数据 #stata导出数据 . sysuse auto . dta ( 1978 Automobile Data ) . export excel C

java开发esb适配器 esb java

用JAVA实现ESB Jeff Hanson 用SOA集成新老组件和服务需要一个能够连接任意组件或服务的基础设施,通过这个基础设施就不需要考虑组件和服务的位置、消息协议和消息格式。为了能够通过这个基础设施串联起这些服务和组件,必须作很多的客户化定制。满足上述需求的SOA基础设施我们称为“ESB”。 本文讨论的机制使得ESB的跨协议消息、消息传输、消息安全和其他面向服务的消息基础设施