NLP短文本聚类算法(1)

由于工作原因,无监督的将相似句聚类,所以需要对聚类算法有比较深入的研究,单纯的调用sklearn无法满足工作需求,故对其进行深入研究及工程实现。

NLP短文本聚类算法(一:引言及数据)

引言

聚类算法对于NLP处理各个方向都有着非常重要的地位。
既能作为一个单独过程,用于找寻数据内在的分布结构,也可作为分类等其他学习任务的前驱过程.

  1. 比如智能客服中就需要对大量的用户未知问题进行聚类,减少FAQ知识库构建的复杂度。在这个任务下,需要对文本进行细粒度的聚类。
  2. 将文本聚类应用于大数据中热点话题或事件的发现。这个任务下,聚类算法需要聚出主题或话题。
    本文会从这两个角度对短文本聚类进行尝试

大纲

本文会对文本Embedding,常用的聚类算法,聚类指标,聚类距离度量等方向对非监督聚类做尽可能全面的分析。

目的是可以针对不同场景及任务选择较优的聚类模型进行实现。

大致会分为以下几部分

  1. 数据集选择
  2. Doc Embedding
  3. 文本聚类距离度量及常用聚类算法详细介绍及实现
  4. 聚类指标与人工分析
  5. 整体分析

数据集选取及预处理

选用两种类型的数据集测试聚类算法。首先使用通用数据集
选择小说《三体》与《天龙八部》作为短文本聚类数据集,数据集的简单预处理流程

  1. 将句子按照逗号和句子结尾符号划分
  2. 选取去除停用词及标点后剩长度大于5小于20的句子5000条
    另外,选取CCKS 2018 微众银行智能客服问句匹配客服问答数据作为特定领域数据集进行测试
    说明:小说数据集不进行标注,只显示最终结果及结果分析。

特定领域的数据集选取300条标注数据计算结果作为量化标准

量太大了我一个人标不动,由于使用问句匹配的训练集是有匹配标注的,后续可能利用这一特点作另外的分析

# 导入需要的库
import jieba
import numpy as np
import sys
import re
import random
# 去停用词,按照符号划分
with open("stopword.txt", encoding="utf-8") as fin:    
    stopwords = {i.strip("\n") for i in fin}
punc = {i for i in "\"‘’“”,。!@#%……&*()、\{\}\(\)"}
print(list(stopwords)[:10])
['屡次', '每逢', '那时', '哦', '什么样', '近年来', '不大', '分期分批', '忽然', '腾']
def move_stopwords(sentence):
    '''去停用词与无用标点'''
    return "".join([i for i in jieba.cut(sentence) if i not in stopwords and i not in punc])
import re
#这里希望选取的为有意义的句子,而不是诸如:"1967年"这种,所以选取去除英文和数字后长度依旧大于5的句子
def get_train(file_in, file_out):
    result = []
    with open(file_in, encoding='utf-8') as fin:
        for line in fin:
            line_choose = re.split("[,,。!;?]", line.strip("\n"))
            for sentence in line_choose:
                final_sentence = re.sub("[0-9a-zA-Z]","",move_stopwords(sentence))
                sentence = re.sub("[''“”]","",sentence)
                if 5 <= len(final_sentence) <= 20:
                    result.append(sentence)
    #从result中随机抽取5000条
    random.shuffle(result)                                    
    result = result[:5000]                                    
    for i in result[:10]:
        print(i)
    with open(file_out, 'w', encoding='utf-8') as fout:
        for i in result:
            fout.write(i+"\n")
get_train("santi.txt", "santi_short.txt")
print("*"*50)
get_train("tlbb.txt", "tlbb_short.txt")
说完他砰一声撑开了伞
因为前一只已经烙上了时间的印痕
罗辑仍捧着那个杯子不放
从某种意义上说
因为这伞年代已久
PIA第一次全体会议召开
工厂已经搬迁
还有安装了远程视频会议系统的会议室
这个球体中的光速为每秒16.7千米
科研管理却移交到中科院天文所
**************************************************
但觉右掌和右臂隐隐发胀
却又生怕震落了花瓣
眼见苏星河是赢了
十多块大石都掀在一旁
自言自语:都到那里去啦
姥姥独力难支
生来无拳无勇
不料第四句突然急转直下
灰衣僧道:你高祖有儿子
太后、皇后以下
# 通用数据集展示
def get_pro_train(file_in, file_out):
    result = []
    with open(file_in, encoding='utf-8') as fin:
        for line in fin:
            line_choose = line.split("\t")[0]
            final_sentence = re.sub("[0-9a-zA-Z]","",move_stopwords(line_choose))
            if 5 <= len(final_sentence) <= 20:
                result.append(line_choose)
    #从result中随机抽取5000条
    random.shuffle(result)                                    
    result = result[:5000]                                    
    for i in result[:10]:
        print(i)
    with open(file_out, 'w', encoding='utf-8') as fout:
        for i in result:
            fout.write(i+"\n")
print("客服数据集:")
get_pro_train("kefu.txt", "kefu_short_5000.txt")
客服数据集
提醒输入身份证信息错误次数过多无法借款
l为什么收到借款申请通过,可银行卡余额没有变
为什么微粒贷必须分期付款啊
微粒贷图标消失了
一次性借款还清,能否继续再借款
多久算逾期
亲几时可以开放微粒贷
一般什么时间播打电话
你好,我的账户怎么会还款失败
21号没有还款记录
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值