当前位置:   article > 正文

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

d2v_model

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

示例代码:

  1. import jieba
  2. import pandas as pd
  3. from gensim import corpora, models
  4. from gensim.models.ldamodel import LdaModel
  5. from gensim import similarities
  6. from gensim.models import doc2vec, Doc2Vec
  7. raw = pd.read_table('./金庸-射雕英雄传txt精校版.txt', names=['txt'], encoding="GBK")
  8. # 章节判断用变量预处理
  9. def m_head(tmpstr):
  10. return tmpstr[:1]
  11. def m_mid(tmpstr):
  12. return tmpstr.find("回 ")
  13. raw['head'] = raw.txt.apply(m_head)
  14. raw['mid'] = raw.txt.apply(m_mid)
  15. raw['len'] = raw.txt.apply(len)
  16. # 章节判断
  17. chapnum = 0
  18. for i in range(len(raw)):
  19. if raw['head'][i] == "第" and raw['mid'][i] > 0 and raw['len'][i] < 30:
  20. chapnum += 1
  21. if chapnum >= 40 and raw['txt'][i] == "附录一:成吉思汗家族":
  22. chapnum = 0
  23. raw.loc[i, 'chap'] = chapnum
  24. # 删除临时变量
  25. del raw['head']
  26. del raw['mid']
  27. del raw['len']
  28. rawgrp = raw.groupby('chap')
  29. chapter = rawgrp.agg(sum) # 只有字符串的情况下,sum函数自动转为合并字符串
  30. chapter = chapter[chapter.index != 0]
  31. # print(chapter)
  32. def m_doc(doclist):
  33. reslist = []
  34. for i, doc in enumerate(doclist):
  35. reslist.append(doc2vec.TaggedDocument(jieba.lcut(doc), [i]))
  36. return reslist
  37. corp = m_doc(chapter.txt)
  38. print(corp[:2])
  39. d2vmodel = Doc2Vec(vector_size=300, window=20, min_count=5)
  40. d2vmodel.build_vocab(corp)
  41. print(d2vmodel.wv.vocab)
  42. # 将新文本转换为相应维度空间下的向量
  43. new_vec = d2vmodel.infer_vector(jieba.lcut(chapter.txt[1]))
  44. print(d2vmodel.docvecs.most_similar([new_vec], topn=10)) # 打印与哪些章节相似

运行结果:

示例代码:

  1. import jieba
  2. import pandas as pd
  3. import jieba.analyse as ana
  4. from sklearn.feature_extraction.text import TfidfTransformer
  5. from sklearn.feature_extraction.text import CountVectorizer
  6. from sklearn.cluster import KMeans
  7. raw = pd.read_table('./金庸-射雕英雄传txt精校版.txt', names=['txt'], encoding="GBK")
  8. # 章节判断用变量预处理
  9. def m_head(tmpstr):
  10. return tmpstr[:1]
  11. def m_mid(tmpstr):
  12. return tmpstr.find("回 ")
  13. raw['head'] = raw.txt.apply(m_head)
  14. raw['mid'] = raw.txt.apply(m_mid)
  15. raw['len'] = raw.txt.apply(len)
  16. # 章节判断
  17. chapnum = 0
  18. for i in range(len(raw)):
  19. if raw['head'][i] == "第" and raw['mid'][i] > 0 and raw['len'][i] < 30:
  20. chapnum += 1
  21. if chapnum >= 40 and raw['txt'][i] == "附录一:成吉思汗家族":
  22. chapnum = 0
  23. raw.loc[i, 'chap'] = chapnum
  24. # 删除临时变量
  25. del raw['head']
  26. del raw['mid']
  27. del raw['len']
  28. rawgrp = raw.groupby('chap')
  29. chapter = rawgrp.agg(sum) # 只有字符串的情况下,sum函数自动转为合并字符串
  30. chapter = chapter[chapter.index != 0]
  31. # print(chapter)
  32. # 为章节增加名称标签
  33. print('0' * 30)
  34. print(chapter.head())
  35. print('1' * 30)
  36. print(chapter.index)
  37. print('2' * 30)
  38. chapter.index = [raw.txt[raw.chap == i].iloc[0] for i in chapter.index]
  39. print(chapter.head())
  40. print('3' * 30)
  41. print(chapter.index)
  42. # 设定分词及请理停用词函数
  43. stop_list = list(pd.read_csv('./停用词.txt', names=['w'], sep='aaa', encoding='utf-8').w)
  44. # print(stop_list)
  45. # jeiba分词
  46. def m_cut(intxt):
  47. return [w for w in jieba.cut(intxt) if w not in stop_list and len(w) > 1]
  48. cut_txt = lambda x: " ".join(m_cut(x))
  49. clean_chap = chapter.txt.apply(cut_txt)
  50. print('4' * 30)
  51. print(clean_chap[:2])
  52. # 计算TF-IDF矩阵
  53. vectorizer = CountVectorizer()
  54. wordmtx = vectorizer.fit_transform(clean_chap) # 将文本中的词语转换为词频矩阵
  55. transformer = TfidfTransformer()
  56. tfidf = transformer.fit_transform(wordmtx) # 基于词频矩阵计算TF-IDF值
  57. print('5' * 30)
  58. print(tfidf)
  59. # 进行聚类分析
  60. clf = KMeans(n_clusters=5)
  61. s = clf.fit(tfidf)
  62. print('6' * 30)
  63. print(s)
  64. print(clf.cluster_centers_)
  65. print('7' * 30)
  66. print(clf.cluster_centers_.shape)
  67. print(clf.labels_)
  68. chapter['clsres'] = clf.labels_
  69. print(chapter.head())
  70. chapter.sort_values('clsres').clsres
  71. chapgrp = chapter.groupby('clsres')
  72. chapcls = chapgrp.agg(sum) # 只有字符串列的情况下,sum函数自动转为合并字符串
  73. cut_txt = lambda x: " ".join(m_cut(x))
  74. chapclsres = chapcls.txt.apply(cut_txt)
  75. print('8' * 30)
  76. print(chapclsres)
  77. # 列出关键词以刻画类别特征
  78. ana.set_stop_words('./停用词.txt')
  79. for item in chapclsres:
  80. print(ana.extract_tags(item, topK=10))

运行结果:

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/357783
推荐阅读
相关标签
  

闽ICP备14008679号