需求是在48万条中文新闻标题里,给测试集中50条标题的每一条找出最相近的20条新闻。拿到这个需求第一反应当然是计算词向量,生成每句话的语义向量然后计算相似度啦,也想过TFIDF来提取每条新闻的关键字,但是原始数据集是没有分类标签的,所以这一步比较难做。在下一步打算计算每条新闻的语义向量以后对新闻进行聚类,然后再应用TFDF提取关键字,直觉上这样可以提升准确度同时降低运算量。完整代码可以从这个github链接上找到

先说说目前已经做到的程度吧。首先所给的训练集是一条一条的新闻,需要对新闻进行分词来构建语料库,这里用了常用的结巴库来进行分词,同时删除stopwords,也就是去掉文本中没有意义的一些词来提升对语义的理解。

先定义一些小工具函数来帮助我们构建语料库。其中的clear_list用来清除列表中不在语料字典里的词这个后边会说到。

import jieba
from logs.config import cfgdef stop_words():#获取stopwords,返回列表stop_words_file = open(cfg.stop_words_path, 'r')stopwords_list = []for line in stop_words_file.readlines():stopwords_list.append(line[:-1])#print(type(stopwords_list[-1]))return stopwords_listdef jieba_fenci(raw, stopwords_list):#返回结巴切分过的单词列表word_list =list(jieba.cut(raw, cut_all=False))#print(type(word_list))for word in word_list:if word in stopwords_list:word_list.remove(word)#word_list.remove('\n')#word_list = ' '.join(word_list)#print(type(word_list))return word_listdef clear_list(l,vocab):#删除不在词典内的单词,返回列表#print(l)l1 = []for word in l:if word in vocab:l1.append(word)else:l.remove(word)#print(word)return l1

有了工具们就可以轻松构建语料库啦

from utils import handle_words as hw
import pandas as pdstopwords_list = hw.stop_words()#加载stop_words
def get_words(words_path,df_path):#用df_path文件中的句子来构建语料库df = pd.read_csv(df_path)with open(words_path,'wb') as y:for i in range(df.shape[0]):w_l = hw.jieba_fenci(df['title'][i],stopwords_list)#进行分词#print(w_l)for n in range(len(w_l)):y.write(w_l[n].encode('utf-8'))#删除stopwordsy.write('\n'.encode('utf-8'))if (i+1)%10000==0:#breakprint(i)print('words prepared')return words_path

构建完语料库以后就可以在语料中进行学习,这里使用了gensim库,用来构建语义模型,这个库用来处理自然语言十分强大,这里只用到了word2vec模型。关于word2vec模型也十分厉害厉害厉害,细节的可以看看 这篇博客,总之呢就是给每个分词构建一个特征向量来表示词义,将词义表示成了向量之后我们就大有可为了,通过向量的加减、距离等方式我们就可以得到词语意义上的转移、区别,我觉得这可以说是NLP的敲门砖喽。关于word2vec的参数前边的博客里也都有,就不多写了,下面是训练过程。

from gensim.models import Word2Vec
from gensim.models.word2vec import LineSentence
from utils.get_words import get_words
from logs.config import cfg
def train_model():words_path = cfg.words_pathtrain_df_path = cfg.train_df_pathmodel_output_path = cfg.model_output_pathprint('preparing words')get_words(words_path,train_df_path)#准备语料print('train model using {}'.format(train_df_path))model_output_path = cfg.model_output_pathmodel = Word2Vec(LineSentence(words_path),size=cfg.train_size, window=cfg.train_window, min_count=cfg.train_min_count, workers=cfg.train_workers)#训练model.save(model_output_path)print('training done,saving model as {}'.format(model_output_path))

训练之后就可以在我们的数据上应用模型计算语义向量了。因为需求时间比较紧张(其实就是不会),这里用了十分暴力的办法,遍历所有的新闻,计算训练集和测试集新闻两两之间的相似度,复杂度爆棚,运行速度更是令人发指,不过贵在简单..值得一提的是这里删除了测试集里标题分词后不在语料字典里的词,因为不在语料字典里的词对寻找寻找训练集中的相似标题肯定一点作用都没有,还顺带解决了模型报错的问题,最后将相似度排序,取了每个测试标题最相似的前20个训练集标题的索引保存下来。

import numpy as np
import pandas as pd
import heapq
from gensim.models import Word2Vec
from logs.config import cfg
from utils import handle_words as hw
def calc_test_data():model_path = cfg.model_output_pathprint('loading model from {}'.format(model_path))model = Word2Vec.load(model_path)#加载模型vocab = list(model.wv.vocab.keys())#获得语料字典test_data_path = cfg.test_df_pathprint('loading test data from {}'.format(test_data_path))        test = pd.read_csv(test_data_path,encoding='gbk')test['top20'] = np.zeros(test.shape[0])train_data_path = cfg.train_df_pathprint('loading train data from {}'.format(train_data_path))train = pd.read_csv(train_data_path)stopwords_list = hw.stop_words()test_words = []for i in range(test.shape[0]):raw = test['title'][i]l1 = hw.jieba_fenci(raw,stopwords_list)l1 = hw.clear_list(l1,vocab)#清洗列表,确保列表里的词都在字典里test_words.append(l1)anss = np.zeros((50,485686))print(anss.shape)for i in range(train.shape[0]):    raw = train['title'][i]    l1 = hw.jieba_fenci(raw,stopwords_list)    l1 = hw.clear_list(l1,vocab)#print('test',l1)for j in range(test.shape[0]):l2 = test_words[j]try:anss[j,i] = model.n_similarity(l1,l2)except:anss[j,i] = 0if i%1000==0:print('{} words done'.format(i))print('all done')top20_path = cfg.top20_pathprint('saving result as {}'.format(top20_path))# for i in range(50):#     ans = anss[i,:]#     top = heapq.nlargest(20,range(len(ans)),ans.__getitem__)#     test['top20'][i] = str(top)for i in range(50):ans = anss[i,:]top = heapq.nlargest(20,range(len(ans)),ans.__getitem__)#获得相似度排名前20的标题的索引an['top20'][i] = toptest.to_csv(cfg.top20_path,mode='a')#保存结果

最后按条目保存了运行的结果顺便打印了一下结果看看,效果好像还不错。

import pandas as pd
from logs.config import cfg
def write_result():result_path = cfg.top20_pathtrain_data_path = cfg.train_df_pathprint('loading result from {}'.format(result_path))result = pd.read_csv(result_path,encoding='gbk')print('loading train data from {}'.format(train_data_path))train_data = pd.read_csv(train_data_path)for i in range(50):print('=========================================')print(result['title'][i])print('_________________________________________')to = result['top20'][i]l = to.split(',')with open('output/{}.txt'.format(i+1),'w',encoding='utf-8') as f:for j in range(0,20):if j==0:print('st')f.write(train_data['title'][int(l[j][1:])])f.write('\n')print(train_data['title'][int(l[j][1:])],'\n')elif j==19:f.write(train_data['title'][int(l[j][:-1])])f.write('\n')print(train_data['title'][int(l[j][:-1])],'\n')print('en')else:   f.write(train_data['title'][int(l[j])])f.write('\n')print(train_data['title'][int(l[j])],'\n')

下面是一部分运行结果,单横线上是测试集,下边是找到的相似标题。

word2vec利用词向量进行中文新闻标题相似度分析相关推荐

  1. 利用word2vec训练词向量

    利用word2vec训练词向量 这里的代码是在pycharm上运行的,文件列表如下: 一.数据预处理 我选用的数据集是新闻数据集一共有五千条新闻数据,一共有四个维度 数据集:https://pan.b ...

  2. 【Gensim + TSNE使用】word2vec词向量处理中文小说 (词嵌入、高维数据降维)

    [Gensim + TSNE使用]word2vec词向量处理中文小说 本文使用Gensim对小说斗破苍穹进行词嵌入可视化 流程 数据预处理,将小说数据滤除停止词,分词book_loader(). 调用 ...

  3. 自然语言处理之使用gensim.Word2Vec训练词向量进行词义消歧

    自然语言处理之使用gensim.Word2Vec训练词向量进行词义消歧 NLP中进行词义消歧的一个非常方便且简单的方法就是训练词向量,通过词向量计算余弦值,来推断某个词在句子中的含义.python中的 ...

  4. word2vec的词向量神经网络的embedding层的关系

    自己之前学习了一波word2vec的词向量&&神经网络的embedding,关于这2者的原理和实践,可以参看我之前的博客: 利用神经网络的embedding层处理类别特征 (一)理解w ...

  5. python加载谷歌word2vec现成词向量

    第一步,下载谷歌word2vec现成词向量   在以下网址下载即可,大小~1.5G https://drive.google.com/file/d/0B7XkCwpI5KDYNlNUTTlSS21pQ ...

  6. 使用jieba对新闻标题进行切词,然后使用word2vec训练词向量及相似词计算的一个小例子

    这个主要是我想记下来方便以后用的时候好直接copy 这个例子就是跑流程的,里面的参数都是随便设的,效果不怎么好,但是流程总得跑通吧. 首先是停用词表见 https://blog.csdn.net/qq ...

  7. 【python gensim使用】word2vec词向量处理中文语料

    word2vec介绍 word2vec官网:https://code.google.com/p/word2vec/ word2vec是google的一个开源工具,能够根据输入的词的集合计算出词与词之间 ...

  8. word2vec python 代码实现_python gensim使用word2vec词向量处理中文语料的方法

    word2vec介绍 word2vec是google的一个开源工具,能够根据输入的词的集合计算出词与词之间的距离. 它将term转换成向量形式,可以把对文本内容的处理简化为向量空间中的向量运算,计算出 ...

  9. 【NLP】基于Word2Vec词向量的中文文本相似度匹配

    Word2Vec 词向量可以用于测量单词之间的相似度,相同语义的单词,其词向量也应该是相似的.对词向量做降维并可视化,可以看到如下图所示的聚类效果,即相近语义的词会聚在一.     文本或句子相似度问 ...

最新文章

  1. 如果中国要做自己的GPT-3,一定离不开这家公司的算力
  2. 《新一代人工智能伦理规范》发布
  3. mysql下载之后找不见_Win7系统中安装mysql后找不到服务或出现找不到指定文件怎么办?...
  4. 前出塞数据挖掘的一些必须了解的概念
  5. 秦汉考场科目三路线图_海淀驾校科目三校内考场总结
  6. mysql sign_mysql - 随笔分类 - signheart - 博客园
  7. python列表_Python列表列表的所有组合
  8. C#导入导出Excele数据
  9. JXSE 2.5 : What's Cool #5 -- java.util.concurrent
  10. IP地址规划的重要性
  11. PLSQL Developer多 表 查 询
  12. 51单片机(郭天祥版)——键盘检测原理及应用实现
  13. MATLAB-非线性回归
  14. QQ动态表情包如何制作 堪比沙漠骆驼gif
  15. 三菱凌云3故障代码_上海三菱凌云2故障代码
  16. ABAP里面的OCCURS与HEADER LINE之间的一些区别
  17. canvas画不规则图形
  18. 1.1什么是DHTML
  19. Catalan 数之Python演示
  20. 服务器硬件基础设施,【通讯技术】细节定成败,NFV中的硬件基础设施管理

热门文章

  1. 任建新照常去办公室领取工资
  2. 十九、 指派问题 - 匈牙利法 (0-1 整数规划)
  3. 怎么让搜狗收录-如何加快搜狗收录
  4. html5诊断报告,放射科诊断报告模板.docx
  5. 苹果从中国赚六百多亿美元,却在转移生产线,该减轻对它的依赖了
  6. 斐尔可(FILCO)67键迷你机械键盘 如何使用快捷键
  7. 《和沐阳一起学POST+JS逆向》视频教程
  8. 买好了虚拟服务器后怎么办,购买虚拟主机后应该怎么操作?
  9. python|面向对象(一)
  10. 去除csdn博客上的图片水印