当前位置:   article > 正文

机器学习 —— NLP_fancy-nlp

fancy-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
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

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

  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))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

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

(二) 使用机器看得懂的算法轮回去比较每一条和所有评论的相似度(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)]
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/626486
推荐阅读
相关标签
  

闽ICP备14008679号