文档相似度之doc2vec、文档聚类

文档相似度之doc2vec、文档聚类

示例代码:

import jieba
import pandas as pd
from gensim import corpora, models
from gensim.models.ldamodel import LdaModel
from gensim import similarities
from gensim.models import doc2vec, Doc2Vec

raw = pd.read_table('./金庸-射雕英雄传txt精校版.txt', names=['txt'], encoding="GBK")


#  章节判断用变量预处理
def m_head(tmpstr):
    return tmpstr[:1]


def m_mid(tmpstr):
    return tmpstr.find("回 ")


raw['head'] = raw.txt.apply(m_head)
raw['mid'] = raw.txt.apply(m_mid)
raw['len'] = raw.txt.apply(len)

#  章节判断
chapnum = 0
for i in range(len(raw)):
    if raw['head'][i] == "第" and raw['mid'][i] > 0 and raw['len'][i] < 30:
        chapnum += 1
    if chapnum >= 40 and raw['txt'][i] == "附录一:成吉思汗家族":
        chapnum = 0
    raw.loc[i, 'chap'] = chapnum

#  删除临时变量
del raw['head']
del raw['mid']
del raw['len']

rawgrp = raw.groupby('chap')
chapter = rawgrp.agg(sum)  # 只有字符串的情况下,sum函数自动转为合并字符串
chapter = chapter[chapter.index != 0]


# print(chapter)

def m_doc(doclist):
    reslist = []
    for i, doc in enumerate(doclist):
        reslist.append(doc2vec.TaggedDocument(jieba.lcut(doc), [i]))
    return reslist


corp = m_doc(chapter.txt)
print(corp[:2])

d2vmodel = Doc2Vec(vector_size=300, window=20, min_count=5)
d2vmodel.build_vocab(corp)

print(d2vmodel.wv.vocab)

#  将新文本转换为相应维度空间下的向量
new_vec = d2vmodel.infer_vector(jieba.lcut(chapter.txt[1]))
print(d2vmodel.docvecs.most_similar([new_vec], topn=10))  # 打印与哪些章节相似

运行结果:

示例代码:

import jieba
import pandas as pd
import jieba.analyse as ana
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.cluster import KMeans

raw = pd.read_table('./金庸-射雕英雄传txt精校版.txt', names=['txt'], encoding="GBK")


#  章节判断用变量预处理
def m_head(tmpstr):
    return tmpstr[:1]


def m_mid(tmpstr):
    return tmpstr.find("回 ")


raw['head'] = raw.txt.apply(m_head)
raw['mid'] = raw.txt.apply(m_mid)
raw['len'] = raw.txt.apply(len)

#  章节判断
chapnum = 0
for i in range(len(raw)):
    if raw['head'][i] == "第" and raw['mid'][i] > 0 and raw['len'][i] < 30:
        chapnum += 1
    if chapnum >= 40 and raw['txt'][i] == "附录一:成吉思汗家族":
        chapnum = 0
    raw.loc[i, 'chap'] = chapnum

#  删除临时变量
del raw['head']
del raw['mid']
del raw['len']

rawgrp = raw.groupby('chap')
chapter = rawgrp.agg(sum)  # 只有字符串的情况下,sum函数自动转为合并字符串
chapter = chapter[chapter.index != 0]
# print(chapter)

#  为章节增加名称标签
print('0' * 30)
print(chapter.head())
print('1' * 30)
print(chapter.index)
print('2' * 30)
chapter.index = [raw.txt[raw.chap == i].iloc[0] for i in chapter.index]
print(chapter.head())
print('3' * 30)
print(chapter.index)


#  设定分词及请理停用词函数
stop_list = list(pd.read_csv('./停用词.txt', names=['w'], sep='aaa', encoding='utf-8').w)
# print(stop_list)


#  jeiba分词
def m_cut(intxt):
    return [w for w in jieba.cut(intxt) if w not in stop_list and len(w) > 1]


cut_txt = lambda x: " ".join(m_cut(x))
clean_chap = chapter.txt.apply(cut_txt)
print('4' * 30)
print(clean_chap[:2])

#  计算TF-IDF矩阵
vectorizer = CountVectorizer()
wordmtx = vectorizer.fit_transform(clean_chap)  # 将文本中的词语转换为词频矩阵

transformer = TfidfTransformer()
tfidf = transformer.fit_transform(wordmtx)  # 基于词频矩阵计算TF-IDF值
print('5' * 30)
print(tfidf)

#  进行聚类分析
clf = KMeans(n_clusters=5)
s = clf.fit(tfidf)
print('6' * 30)
print(s)
print(clf.cluster_centers_)

print('7' * 30)
print(clf.cluster_centers_.shape)
print(clf.labels_)

chapter['clsres'] = clf.labels_
print(chapter.head())

chapter.sort_values('clsres').clsres

chapgrp = chapter.groupby('clsres')
chapcls = chapgrp.agg(sum)  # 只有字符串列的情况下,sum函数自动转为合并字符串

cut_txt = lambda x: " ".join(m_cut(x))
chapclsres = chapcls.txt.apply(cut_txt)
print('8' * 30)
print(chapclsres)

#  列出关键词以刻画类别特征
ana.set_stop_words('./停用词.txt')
for item in chapclsres:
    print(ana.extract_tags(item, topK=10))

运行结果:

000000000000000000000000000000
                                                    txt
chap                                                   
1.0   第一回 风雪惊变    钱塘江浩浩江水,日日夜夜无穷无休的从两浙西路临安府牛家村边绕过,东流...
2.0   第二回 江南七怪    颜烈跨出房门,过道中一个中年士人拖着鞋皮,踢跶踢跶的直响,一路打着哈...
3.0   第三回 黄沙莽莽    寺里僧众见焦木圆寂,尽皆悲哭。有的便为伤者包扎伤处,抬入客舍。  忽...
4.0   第四回 黑风双煞    完颜洪熙笑道:“好,再打他个痛快。”蒙古兵前哨报来:“王罕亲自前来迎...
5.0   第五回 弯弓射雕    一行人下得山来,走不多时,忽听前面猛兽大吼声一阵阵传来。韩宝驹一提缰...
111111111111111111111111111111
Float64Index([ 1.0,  2.0,  3.0,  4.0,  5.0,  6.0,  7.0,  8.0,  9.0, 10.0, 11.0,
              12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 22.0,
              23.0, 24.0, 25.0, 26.0, 27.0, 28.0, 29.0, 30.0, 31.0, 32.0, 33.0,
              34.0, 35.0, 36.0, 37.0, 38.0, 39.0, 40.0],
             dtype='float64', name='chap')
222222222222222222222222222222
                                                        txt
第一回 风雪惊变  第一回 风雪惊变    钱塘江浩浩江水,日日夜夜无穷无休的从两浙西路临安府牛家村边绕过,东流...
第二回 江南七怪  第二回 江南七怪    颜烈跨出房门,过道中一个中年士人拖着鞋皮,踢跶踢跶的直响,一路打着哈...
第三回 黄沙莽莽  第三回 黄沙莽莽    寺里僧众见焦木圆寂,尽皆悲哭。有的便为伤者包扎伤处,抬入客舍。  忽...
第四回 黑风双煞  第四回 黑风双煞    完颜洪熙笑道:“好,再打他个痛快。”蒙古兵前哨报来:“王罕亲自前来迎...
第五回 弯弓射雕  第五回 弯弓射雕    一行人下得山来,走不多时,忽听前面猛兽大吼声一阵阵传来。韩宝驹一提缰...
333333333333333333333333333333
Index(['第一回 风雪惊变', '第二回 江南七怪', '第三回 黄沙莽莽', '第四回 黑风双煞', '第五回 弯弓射雕', '第六回 崖顶疑阵',
       '第七回 比武招亲', '第八回 各显神通', '第九回 铁枪破犁', '第十回 往事如烟', '第十一回 长春服输',
       '第十二回 亢龙有悔', '第十三回 五湖废人', '第十四回 桃花岛主', '第十五回 神龙摆尾', '第十六回 《九阴真经》',
       '第十七回 双手互搏', '第十八回 三道试题', '第十九回 洪涛群鲨', '第二十回 九阴假经', '第二十一回 千钧巨岩',
       '第二十二回 骑鲨遨游', '第二十三回 大闹禁宫', '第二十四回 密室疗伤', '第二十五回 荒村野店', '第二十六回 新盟旧约',
       '第二十七回 轩辕台前', '第二十八回 铁掌峰顶', '第二十九回 黑沼隐女', '第三十回 一灯大师', '第三十一回 鸳鸯锦帕',
       '第三十二回 湍江险滩', '第三十三回 来日大难', '第三十四回 岛上巨变', '第三十五回 铁枪庙中', '第三十六回 大军西征',
       '第三十七回 从天而降', '第三十八回 锦囊密令', '第三十九回 是非善恶', '第四十回 华山论剑'],
      dtype='object')
444444444444444444444444444444
第一回 风雪惊变    第一回 风雪 惊变 钱塘江 浩浩 江水 日日夜夜 无穷 无休 浙西 临安 牛家村 绕过 流入...
第二回 江南七怪    第二回 江南七怪 颜烈 跨出 房门 过道 一个 中年 士人 直响 一路打 哈欠 迎面 士人 ...
Name: txt, dtype: object
555555555555555555555555555555
  (0, 43933)	0.006457785610768902
  (0, 43900)	0.005344421721247819
  (0, 43894)	0.005806509485742016
  (0, 43893)	0.0078196129731351
  (0, 43889)	0.0033321780154806882
  (0, 43867)	0.005806509485742016
  (0, 43853)	0.016033265163743454
  (0, 43846)	0.005806509485742016
  (0, 43823)	0.0037195432578317456
  (0, 43817)	0.0037195432578317456
  (0, 43807)	0.0034512135427621155
  (0, 43804)	0.01741952845722605
  (0, 43795)	0.04064556640019411
  (0, 43794)	0.01778216762000709
  (0, 43791)	0.004041869471194046
  (0, 43785)	0.006457785610768902
  (0, 43761)	0.0035797817066998473
  (0, 43759)	0.006457785610768902
  (0, 43735)	0.006457785610768902
  (0, 43564)	0.004231057831726734
  (0, 43558)	0.006457785610768902
  (0, 43552)	0.005344421721247819
  (0, 43530)	0.006457785610768902
  (0, 43521)	0.004445541905001772
  (0, 43519)	0.006457785610768902
  :	:
  (39, 249)	0.007363892219505564
  (39, 243)	0.002661190169191508
  (39, 241)	0.0029348179528258193
  (39, 239)	0.003881818699411122
  (39, 237)	0.0246660951449147
  (39, 235)	0.017282292487475925
  (39, 229)	0.004213809881329308
  (39, 199)	0.004734964104017336
  (39, 183)	0.004734964104017336
  (39, 177)	0.006013956032520825
  (39, 164)	0.004334625242694368
  (39, 160)	0.010489088265541683
  (39, 153)	0.006261482471574542
  (39, 133)	0.0034963627551805616
  (39, 130)	0.0027944020310634574
  (39, 123)	0.0058696359056516385
  (39, 121)	0.006261482471574542
  (39, 111)	0.01044129239492948
  (39, 102)	0.01596714101514905
  (39, 91)	0.010081707882709857
  (39, 84)	0.006013956032520825
  (39, 72)	0.005580106229793086
  (39, 56)	0.054538300429186476
  (39, 54)	0.01044129239492948
  (39, 33)	0.007187789388150439
666666666666666666666666666666
KMeans(n_clusters=5)
[[0.         0.         0.         ... 0.00258824 0.         0.        ]
 [0.         0.         0.         ... 0.         0.         0.        ]
 [0.00056294 0.00044564 0.00044564 ... 0.         0.00046898 0.00056294]
 [0.         0.         0.         ... 0.         0.         0.        ]
 [0.         0.         0.         ... 0.         0.         0.        ]]
777777777777777777777777777777
(5, 43955)
[3 3 3 3 3 3 4 4 4 2 3 0 4 2 0 2 2 0 0 0 0 0 2 2 2 2 1 1 2 2 2 1 2 2 2 2 2
 2 2 0]
                                                        txt  clsres
第一回 风雪惊变  第一回 风雪惊变    钱塘江浩浩江水,日日夜夜无穷无休的从两浙西路临安府牛家村边绕过,东流...       3
第二回 江南七怪  第二回 江南七怪    颜烈跨出房门,过道中一个中年士人拖着鞋皮,踢跶踢跶的直响,一路打着哈...       3
第三回 黄沙莽莽  第三回 黄沙莽莽    寺里僧众见焦木圆寂,尽皆悲哭。有的便为伤者包扎伤处,抬入客舍。  忽...       3
第四回 黑风双煞  第四回 黑风双煞    完颜洪熙笑道:“好,再打他个痛快。”蒙古兵前哨报来:“王罕亲自前来迎...       3
第五回 弯弓射雕  第五回 弯弓射雕    一行人下得山来,走不多时,忽听前面猛兽大吼声一阵阵传来。韩宝驹一提缰...       3
888888888888888888888888888888
clsres
0    第十二回 亢龙有悔 黄蓉正 撕开 身后 有人 说道 撕作 三份 鸡屁股 两人 一惊 怎地 背...
1    第二十七回 轩辕台 两人 正闹间 楼梯 声响 适才 随杨康 丐帮 长老 走到 黄二人 桌边 ...
2    第十回 往事如烟 完颜康 见到 杨铁心 惊诧 之下 认出 大叫 提起 铁枪 行步 朝天 一炷...
3    第一回 风雪 惊变 钱塘江 浩浩 江水 日日夜夜 无穷 无休 浙西 临安 牛家村 绕过 流入...
4    第七回 比武招亲 江南 六怪 郭靖 晓行夜宿 东南 进发 非止 一日 大漠 草原 这天 张家...
Name: txt, dtype: object
['洪七公', '郭靖', '欧阳锋', '黄蓉', '黄药师', '欧阳克', '周伯通', '叫化', '武功', '黄蓉道']
['黄蓉', '郭靖', '裘千仞', '帮主', '丐帮', '杨康', '铁掌', '简长老', '鲁有脚', '群丐']
['郭靖', '黄蓉', '黄药师', '周伯通', '欧阳锋', '师父', '黄蓉道', '梅超风', '郭靖道', '武功']
['郭靖', '丘处机', '铁木真', '柯镇恶', '杨铁心', '韩小莹', '梅超风', '包惜弱', '朱聪', '韩宝驹']
['郭靖', '完颜康', '黄蓉', '王处一', '陆庄主', '陆冠英', '小王爷', '穆易', '那公子', '穆念慈']

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值