商品标题 内容 向量特征提取

基础

  • 中文分词
  • 关键词提取
  • 词性标注
  • 语意扩展

实现

由于我们商品 只需要填写 名称,没有相关简介内容,故 只标注 商品名称的特征向量化

  • 中文没有空格进行分词 所以需要手动分词,使用TFIDF技术,jieba分词
  • 并且并不是 所有 词要参与特征分析 ,所有要 进行关键词 提取
  • Doc2Vec 平均、加权平均 向量化 只能实现精确匹配 缺少语义扩展
  • Word2vec:语意扩展 ,自己训练,或者 使用 腾讯的 Word2vec 可以得到字面不等、语意相关的词,用于推荐系统有很好的泛化性

使用 jieba 分词 进行 特征提取 实现步骤

普通分词效果

import jieba
s = '(直播样品)【四川名特产】正宗盐帮叶儿粑(10个) 400g/袋'
for x in jieba.cut(s):  #jieba.cut()返回是一个可迭代类型
    print(x,end=' ')
jieba.lcut(s)

# 直播 样品 ) 【 四川 名特产 】 正宗 盐帮 叶儿 粑 ( 10 个 )   400g / 袋 
#['(','直播','样品',')','【','四川','名特产','】','正宗','盐帮','叶儿','粑','(','10','个',')',' ','400g','/','袋']

发现 存在很多干扰特征 ,例如 - (),袋,5,片装 之类的 不属于特征词
**发现 一些特殊名词未 进行正确分词 叶儿 粑 应该是 叶儿粑 **

添加自定义词典

创建一个dict.txt,然后写入你的分词,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。
频率越高,成词的概率就越大

vim dict.txt
叶儿粑 5 n
礼盒装 2 nz

#载入自定义词典
jieba.load_userdict("dict.txt")
#或者 动态修改词典
jieba.add_word("双十一")#添加自定义词
jieba.del_word("双十一")#删除自定义词

进行 词性分析, 过滤掉 不符合 特征匹配的词

先进行 词性分析 除了jieba默认分词模式,提供paddle模式下的词性标注功能。

标签 含义 标签 含义
n 普通名词 vn 名动词
f 方位名词 a 形容词
s 处所名词 ad 副形词
t 时间 an 名形词
nr 人名 d 副词
ns 地名 m 数量词
nt 机构名 q 量词
nw 作品名 r 代词
nz 其他专名 p 介词
v 普通动词 c 连词
vd 动副词 u 助词
xc 其他虚词 w 标点符号
PER 人名 -
查看更多
from jieba import enable_paddle, posseg
s='(直播样品)牛肉馅饼(5片装)450g/袋'

print(posseg.lcut(s, use_paddle=True))

## [pair('(', 'x'), pair('直播', 'vn'), pair('样品', 'n'), pair(')', 'x'), pair('牛肉', 'n'), pair('馅饼', 'n'), pair('(', 'x'), pair('5', 'm'), pair('片', 'q'), pair('装', 'n'), pair(')', 'x'), pair('450', 'm'), pair('g', 'eng'), pair('/', 'x'), pair('袋', 'q')]

发现 () ,5,等 需要过滤的词性, 保留 ,牛肉,馅饼,等 普通名词

关键词提取

关键词抽取从方法来说大致有两种:

第一种是关键词分配,就是有一个给定的关键词库,然后新来一篇文档,从词库里面找出几个词语作为这篇文档的关键词;

第二种是关键词抽取,就是新来一篇文档,从文档中抽取一些词语作为这篇文档的关键词;

从算法的角度来看,关键词抽取算法主要有两类:

有监督学习算法,将关键词抽取过程视为二分类问题,先抽取出候选词,然后对于每个候选词划定标签,要么是关键词,要么不是关键词,然后训练关键词抽取分类器。当新来一篇文档时,抽取出所有的候选词,然后利用训练好的关键词抽取分类器,对各个候选词进行分类,最终将标签为关键词的候选词作为关键词;

无监督学习算法,先抽取出候选词,然后对各个候选词进行打分,然后输出topK个分值最高的候选词作为关键词。根据打分的策略不同,有不同的算法,例如TF-IDF,TextRank等算法;

jieba分词 分别实现了 基于TF-IDF关键词抽取算法和基于TextRank关键词抽取算法,两类算法均是无监督学习的算法

from jieba import analyse
#基于 TextRank 算法的关键词抽取
print('-'*40)
print(' TF-IDF')
print('-'*40)
s = "(直播样品)牛肉馅饼(5片装)450g/袋"

for x, w in jieba.analyse.extract_tags(s, topK=10, withWeight=True,allowPOS=('ns', 'n', 'vn', 'v','nz')):
    print('%s %s' % (x, w))
print('-'*40)
print(' TextRank')
print('-'*40)

for x, w in jieba.analyse.textrank(s, withWeight=True):
    print('%s %s' % (x, w))


#    ----------------------------------------
#     TF-IDF
#    ----------------------------------------
#    馅饼 2.439385731395
#    直播 2.276221776595
#    牛肉 2.10087735667
#    样品 2.092812141115
#    ----------------------------------------
#     TextRank
#    ----------------------------------------
#    馅饼 1.0
#    直播 0.9972550528508957
#    牛肉 0.9942809269900859
#    样品 0.9910584880265131

发现 过滤 了大多数 无效特征 ,但是 还存在 直播 等并不需要的特征,这个时候就需要 自定义个停用词表来过滤掉指定 词

停用词过滤

# 停用词表加载方法
def get_stopword_list():
    # 停用词表存储路径,每一行为一个词,按行读取进行加载
    # 进行编码转换确保匹配准确率
    stop_word_path = './stopword.txt'
    stopword_list = [sw.replace('\n', '') for sw in open(stop_word_path,encoding='utf-8').readlines()]
    return stopword_list


# 去除干扰词
def word_filter(seg_list, pos=False):
    stopword_list = get_stopword_list()
    filter_list = []
    # 根据POS参数选择是否词性过滤
    ## 不进行词性过滤,则将词性都标记为n,表示全部保留
    for seg in seg_list:
        if not pos:
            word = seg
            flag = 'n'
        else:
            word = seg.word
            flag = seg.flag
        if not flag.startswith('n'):
            continue
        # 过滤停用词表中的词,以及长度为<2的词
        if not word in stopword_list and len(word) > 1:
            filter_list.append(word)

    return filter_list

Doc2Vec计算 向量

得到关键词和权重之后,计算文章的数字向量,两种方法:平均、加权平均
平均:[1,0,0,1,0]
加权平均:[0.8, 0.6, 0, 0.3, 0.5]
这样就把多个关键词和权重变成一个向量,这是多个词的组合得到的一个结果
有缺点:只能实现精确匹配。原来的文章中有“牛肉馅饼”关键词,那目标文章中也有“牛肉馅饼”才能被匹配到

Word2vec:语意扩展

可以发现语意的关系

实现:

自己训练一个Word2vec,比如Spark Word2vec,
Spark官网——Programming Guides ——MLlib(Machine Learning)进入spark的机器学习库,点击Extracting,transforming and selecting features进入提取、转换和选择特征,找到Word2vec,看例子
问题:数据量小的话,训练结果不是很好,不能发现相关语意的词

使用开源的,比如腾讯的Word2vec
腾讯AI实验室,根据百度百科、维基百科得到的
数据有两列,一列是词,一列是向量,下载可以直接用
可以得到字面不等、语意相关的词,用于推荐系统有很好的泛化性

具体实现 不在 本次 实现 范围

总结

实现 内容提取 关键词 特征向量 需要注意 几部分

  1. 需要进行中文分词
  2. 需要去除 干扰词
  3. 需要 根据业务 自定义词典
  4. 需要进行 词性分析 剔除不需要的词性
  5. 需要 进行关键词 (核心词抽取)

参考

jieba结巴分词
推荐系统

你可能感兴趣的:(数学建模,python,推荐算法,nlp,中文分词)