机器学习 —— NLP

NLP ——Natural Language Prrocessing 自然语言处理
一. NLP 文本相似度分析

马蜂窝评论造假事件
马蜂窝发现很多评论是通过机器写入的造假评论
在这里插入图片描述
在这里插入图片描述

那么是怎么发现的? ———— 采用NLP 的文本相似度分析

文本相似度分析: 从海量的数据(文章,评论)中,把相似的数据挑选出来
步骤

  1. 把评论翻译成机器能够看的懂的语言
  2. 使用机器看得懂的算法轮回去比较每一条和所有评论的相似度
  3. 把相似的评论挑出来

(一)把评论翻译成机器能够看懂的语言
步骤:

  1. 分词: 把句子拆分成词语

     import jieba
    
     # 抽取关键字的包
     import jieba.analyse
     
     jieba.load_userdict('./mytext')
     text = "故宫有很多历史悠久的建筑,比如说乾清宫,午门。其中的黄琉璃瓦非常好看。啊"
     seg_list = jieba.cut(text, cut_all=False)
     # print("全模式:", "/".join(seg_list))
     
     # 提取关键字
     tags = jieba.analyse.extract_tags(text, topK=6)
     # topK = 5 : 提取5个关键字
     print("关键字:")
     print(" ".join(tags))
     
     # 除去停用词
     stopwords = ["的", "包括", "等", "是", "啊"]
     # final:空的字符串
     final = ''
     
     for seg in seg_list:
         if seg not in stopwords:
             final += seg
     print("final:", final)
    

运行结果:
在这里插入图片描述

  1. 制作词袋模型(bag-of-word ): 可以理解成装着所有词的袋子
  2. 用词袋模型制作语料库(corpus): 把每个句子都用词袋表示
  3. 把评论变成词向量

eg:

import jieba
text = "我来到北京大学"
seg_list = jieba.cut(text,cut_all = True)
print("全模式:","/".join(seg_list))


seg_list = jieba.cut(text,cut_all = False)
print("精确模式:","/".join(seg_list))

seg_list = jieba.cut_for_search(text)
print("搜索引擎模式:","/".join(seg_list))

运行结果为:
在这里插入图片描述

(二) 使用机器看得懂的算法轮回去比较每一条和所有评论的相似度(TF-IDF)
1. 如何寻找TF-IDF 的关键字

1)不考虑停用词(没有什么意义的词语 eg:啊, 的,了。。)找出一句话中出现次数最多的单词,来代表这句话,这个就叫是词频(TF-Term-Frequency),相对应 的权重就会增高
2) 如果一个词在所有句子都出现过,那么这个词就能代表某句话,这个就叫做逆文本频率(IDF-Inverse Document Frequency)相应的权重值就会下降
3) TF-IDF = TF*IDF

2. TF公式:
在这里插入图片描述
其中ni ,j 是该词在一份文件 (或者评论)中出现的次数
分母是一份文件(或者评论)中所有词汇出现的次数总和
即: 在这里插入图片描述

3. IDF公式:
在这里插入图片描述
其中 |D|是语料库中的文件总数。 |{j:t_i∈ⅆ_j }|表示包含词语ti的文件数目。如果该词语不在语料库中,就会导致分母为0,因此一般情况下使用1+ |{j:t_i∈ⅆ_j }|
即:

在这里插入图片描述
分母加1 ,是为了避免分母为0

词类转换总结

假设我们有两句话,分别是

  1. a b c
  2. b c d

那么,这两句话的字典就是
dictionary: 0:a 1:b 2:c 3:d
其中key值表示索引,value表示对应的词语;
而且,词语不会重复

通过应用生成好的字典,我们可以重写两句话

  1. 0:1 1:1 2:1 3:0
    (第0位是a,在这句话中出现了一次,就表示成0:1,以此类推)
  2. 0:0 1:1 2:1 3:1

然后把这两句话改成列表(list)类型,就变成以下格式
[[{0:1}, {1:1}, {2:1}, {3:0}],
[{0:0}, {1:1}, {2:1}, {3:1}]]
把list中的字典转换成元组,这就是我们在代码里得到的语料库
[[(0,1), (1,1), (2:1), (3:0)],
[(0:0), (1:1), (2:1), (3:1)]]

语料库的两种表现形式

1.第一种: String类型
[“a b c”,
“b c d”]

2.第二种,词袋类型
[[(0,1), (1,1), (2,1), (3,0)],
[(0,0), (1,1), (2,1), (3,1)]]

如果新得到一组数据,可以把它用两种形式加入到语料库中

  1. String类型
    “c d e”,
  2. 词袋类型
    [(0,0), (1,0),(2,1),(3,1),(unknow,1)]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值