由于我们商品 只需要填写 名称,没有相关简介内容,故 只标注 商品名称的特征向量化
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
得到关键词和权重之后,计算文章的数字向量,两种方法:平均、加权平均
平均:[1,0,0,1,0]
加权平均:[0.8, 0.6, 0, 0.3, 0.5]
这样就把多个关键词和权重变成一个向量,这是多个词的组合得到的一个结果
有缺点:只能实现精确匹配。原来的文章中有“牛肉馅饼”关键词,那目标文章中也有“牛肉馅饼”才能被匹配到
可以发现语意的关系
实现:
自己训练一个Word2vec,比如Spark Word2vec,
Spark官网——Programming Guides ——MLlib(Machine Learning)进入spark的机器学习库,点击Extracting,transforming and selecting features进入提取、转换和选择特征,找到Word2vec,看例子
问题:数据量小的话,训练结果不是很好,不能发现相关语意的词
使用开源的,比如腾讯的Word2vec
腾讯AI实验室,根据百度百科、维基百科得到的
数据有两列,一列是词,一列是向量,下载可以直接用
可以得到字面不等、语意相关的词,用于推荐系统有很好的泛化性
具体实现 不在 本次 实现 范围
实现 内容提取 关键词 特征向量 需要注意 几部分
参考
jieba结巴分词
推荐系统