短文本标题相似度检测及计算----word2vec学习笔记


注:此笔记为《短文本标题相似度检测及计算》课程学习笔记。笔记顺序为编写代码顺序。
  本project分析一些新闻条目,并输出最相似的新闻标题组。

GlobalParameter.py

  首先对于project中的各种文件路径和训练参数进行设置,该文件中的所有代码如下:

# 各种设置
encoding = "utf-8"  # 文件编码设置,utf-8为中文
stop_word_dir = "data/stop_words.txt"  # 停止词的文件路径
train_set_dir = "data/train.csv"  # 原始训练集路径
train_after_process_text_dir = "data/train_after_process.csv"  # 处理后训练集路径
test_set_dir = "data/test.csv"  # 原始测试集路径
test_after_process_text_dir = "data/test_after_process.csv"  # 处理后测试集路径
model_output_path = "model\word2vec_news.model"  # 训练好的word2vec模型的路径;win系统下/和\没有本质区别

train_num = 485686
test_num = 50

result_out_path = "data/sim_result.csv"
sim_result_path = "data/result.txt"

# word2vec参数
train_size = 150
train_window = 5

utils.py

  编写一些对于数据集的处理函数(预处理 + 分词)。
拿test.csv举例,原始数据的样子:

id,title
2784,美国地质勘探局:印度莫黑安东南部151公里处发生5.1级地震
12057,美国MBA抵押贷款申请指数上周上升2.7%19620,美国德州市长:预计将向印度供应更多的原油和液化天然气。
23768,欧洲央行月报:仍需要足够程度的货币宽松。
23814,IMF:201711月委内瑞拉黄金持有量下降6.373吨至184.939吨。
28091,YTN:朝鲜金正恩称,他将会和美国举行峰会
34581,美国副总统彭斯:(就朝鲜问题)为所有可能的结果做好准备将对任何核武器的使用进行快速应对
46930,香港财政司长陈茂波:需要继续留意全球货币环境和地缘政治的变化与政策风险。

读取stop_words

  stop_words是停止词,一般是类似于“的”、“地”等出现次数极高但无太大语义的词语。在干任何事情之前,应该先处理下载的stop_words文档,提取出所有停止词。

def get_stop_words(stop_words_dir):
    stop_words = []  # 保存所有停止词在stop_words的list中

    with open(stop_words_dir, "r", encoding=GlobalParameter.encoding) as f_reader:  # 打开stop_words文件
        for line in f_reader:
            line = delete_r_n(line)  # 最简单的处理方式,去掉回车和换行
            stop_words.append(line)

    stop_words = set(stop_words)  # 以防有重复词
    return stop_words

def delete_r_n(line):
    return line.replace("\r", "").replace("\n", "").strip()

对训练集进行分词

  接下来对于训练集中的完整的句子,用停止词和jieba包进行分词。jieba 是目前最好的 Python 中文分词组件,支持三种模式(精确模式、全模式、搜索引擎模式)。可使用 jieba.cut ()和 jieba.cut_for_search ()方法进行分词,两者所返回的结构都是一个可迭代的 generator,可以使用 for 循环来获得分词后得到的每一个词语。

对“我就读于北京航空航天大学,现是一名大三学生。”进行分词:

jieba,cut(): [‘就读于’, ‘北京航空航天大学’, ‘现是’, ‘一名’, ‘大三’, ‘学生’]
jieba.cut_for_search (): [‘就读’, ‘就读于’, ‘北京’, ‘航空’, ‘空航’, ‘航天’, ‘天大’, ‘大学’, ‘北京航空航天大学’, ‘现是’, ‘一名’, ‘大三’, ‘学生’]

两种分词方式的代码,返回对都是word_list,即处理后的所有词。

# jieba精确分词
def jieba_cut(content, stop_words):
    word_list = []

    if content != "" and content is not None:
        seg_list = jieba.cut(content)
        for word in seg_list:
            if word not in stop_words:
                word_list.append(word)

    return word_list

# jieba搜索引擎分词
def jieba_cut_for_search(content, stop_words):
    word_list = []
    if content != "" and content is not None:
        seg_list = jieba.cut_for_search(content)
        for word in seg_list:
            if word not in stop_words:
                word_list.append(word)

    return word_list

由于还有后续步骤,对训练集分词后的结果不在此展示了。

对训练集进行预处理的整个过程

  写好了前面几个处理函数之后,编写整个处理训练集的过程。
第一种处理函数:

def preprocessing_text_pd(text_dir, after_process_text_dir, stop_words_dir):
    stop_words = get_stop_words(stop_words_dir)  # 读取停用词
    
    sentences = []
    df = pd.read_csv(text_dir)  # 读取原始数据集
    for index, row in df.iterrows():  # df.iterrows为在pandas中遍历DataFrame行;index是编号;row是title项的内容
        title = delete_r_n(row['title'])  # title为初处理之后的一个string
        word_list = jieba_cut(title, stop_words)  # 对于每个句子进行处理,保存入word_list中
        df.loc[index, 'title'] = " ".join(word_list)  # df.loc[]是数据选取函数,有多种选取方法
        sentences.append(word_list)
        
    df.to_csv(after_process_text_dir, encoding
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值