当前位置:   article > 正文

机器学习—入门篇(2)——NLP_nlp是机器学习里面吗

nlp是机器学习里面吗

一、NLP简介

NLP: Natural Language Processing 自然语言处理

统计自然语言处理运用了推测学、机率、统计的方法来解决上述,尤其是针对容易高度模糊的长串句子,当套用实际文法进行分析产生出成千上万笔可能性时所引发之难题。处理这些高度模糊句子所采用消歧的方法通常运用到语料库以及马可夫模型(Markov models)。统计自然语言处理的技术主要由同样自人工智能下与学习行为相关的子领域:机器学习及资料采掘所演进而成。

二、文本处理的流程

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

【2】步骤:

把评论翻译成机器看的懂的语言
使用机器看的懂得算法轮询去比较每一条和所有评论的相似程度
把相似的评论挑出来
在这里插入图片描述

【3】分词
英语用NLTK,中文用jieba。

【3】去掉停用词

【4】把评论翻译成机器看的懂的语言

1、分词
2、制作词袋模型(bag-of-word)
3、用词袋模型制作语料库(corpus)
4、把评论变成词向量

三、jieba中文分词

【1】特点:

1、支持三种分词模式:
- 精确模式:试图将句子最精确地切开,适合文本分析
- 全模式:把句子中所有的可以组成词的词语都扫描出来,速度非常快,但是不能解决歧义
- 搜索引擎模式:在精确模式的基础上,对长词再次进行切分,提高召回率,适合用于搜索引擎分词
2、支持繁体分词
3、支持自定义词典
4、MIT授权协议

【2】算法

  • 基于前辍词典实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG)
  • 采取了动态规划查找最大概率路径,找出基于词频的最大切分组合
  • 对于未登陆词,采用了基于汉字成词的能力的HMM模型,使用Viterbi算法

【3】主要功能

1、分词
  • jieba.cut 方法接受三个输入参数:需要分词的字符串;(cut_all 参数用来控制是否采用全模式HMM 参数用来控制是否使用HMM模型)
  • jieba.cut_for_search 方法接受两个参数:需要分词的字符串;是否使用HMM模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细
  • 待分词的字符串可以是unicode或UTF-8字符串、GBK字符串。注意:不建议直接输入GBK字符串,可能无法预料的错误解码成UTF-8
  • jieba.cutjieba.cut_for_search 返回的结构都是一个可迭代的generator(生成器),可以使用for循环来获得分词后得到的每一个单词(unicode),或者使用jieba.lcut 以及jieba.lcut_for_search直接返回list
  • jieba.Tokenizer(dictionary=DEFAULT_DICT)新建自定义分词器,可用于同时使用不同词典。
  • jieba.dt 为默认分词器,所有全局分词相关的函数都是该分词器的映射。
2、添加自定义词典

『1』载入词典

  • 开发者可以指定自己自定义的词典,以便包含jieba词库里没有的词。
  • 用法:jieba.load_userdict(file_name ) ##file_name为文件对象或自定义词典的路径
  • 词典的格式和dict.txt 一样 ,一个词占一行 ;每一行分为三部分:词语、词频(可省略)、词性(可省略),用空格分隔,顺序不可颠倒。file.name若为路径或二进制方式打开的文件,则文件必须为UTF-8编码
  • 词频省略时使用自动计算的能保证分出该词的词频。
  • 更改分词器(默认jieba.dt)的tmp_dir 和 cache_file 属性,可分别指定缓存文件所在的文件夹及其文件名,用于受限的文件系统

『2』调整词典

使用 add_word(word, freq=None, tag=None) 和 del_word(word) 可在程序中动态修改词典。

使用 suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。

注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。
  • 1
  • 2
  • 3
import jieba
text ="我来到西安邮电大学"
#全模式
seg_list =jieba.cut(text,cut_all=True)
print("全模式:","/".join(seg_list))
#精确模式
seg_list1 =jieba.cut(text,cut_all=False)
print("精确模式","/".join(seg_list1))
#搜索引擎模式
seg_list2 =jieba.cut_for_search(text)
print("搜索引擎模式","/".join(seg_list2))
"""
添加自定义词语"""
jieba.load_userdict('mydict')
seg_list =jieba.cut(text,cut_all=True)
print("全模式:","/".join(seg_list))
#精确模式
seg_list1 =jieba.cut(text,cut_all=False)
print("精确模式","/".join(seg_list1))
#搜索引擎模式
seg_list2 =jieba.cut_for_search(text)
print("搜索引擎模式","/".join(seg_list2))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

在这里插入图片描述

3、关键词提取

【1】基于TF-IDF算法的关键词提取

import jieba.analyse

 jieba.analyse.extract_tags(sentence,topK=20,withWeight=Flase,allowPOS=())

	
		- sentence  为待提取的文本
		- topK 为返回几个TF-IDF权重最大的关键字,默认值为20
		- withWeight 为是否一并返回关键字权重值,默认值为Flase
		- allowPOS 仅包括指定词形的词,默认为空,即不筛选
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

jieba.analyse.TFIDF(idf_path =None) 新建TFIDF实例,id_path为IDF频率文件

import jieba
import jieba.analyse
jieba.load_userdict('mydict')
text = "故宫的著名景点包括乾清宫、太和殿和午门等。其中乾清宫非常精美,午门是紫禁城的正门,午门居中向阳。"
sed_list = jieba.cut(text,cut_all=False)
#获取关键字
tags =jieba.analyse.extract_tags(text,topK=5)
print("关键字:")
print(" ".join(tags))

#除去停用字
stopwords =['的','包括', '等', '是']
final=''
for seg in sed_list:
    if seg not in stopwords:
        final +=seg
print(final)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

在这里插入图片描述

四、TF-IDF

【1】概念

TF-IDF(term frequency–inverse document frequency)是一种用于资讯检索与资讯探勘的常用加权技术。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。TF-IDF加权的各种形式常被搜寻引擎应用,作为文件与用户查询之间相关程度的度量或评级。除了TF-IDF以外,因特网上的搜寻引擎还会使用基于连结分析的评级方法,以确定文件在搜寻结果中出现的顺序。

【2】原理
在一份给定的文件里,词频 (term frequency, TF) 指的是某一个给定的词语在该文件中出现的次数。这个数字通常会被归一化(分子一般小于分母 区别于IDF),以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词频,而不管该词语重要与否。)

逆向文件频率 (inverse document frequency, IDF)是一个词语普遍重要性的度量。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。

某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。

TFIDF的主要思想是:如果某个词或短语在一篇文章中出现的频率TF高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力,适合用来分类。TFIDF实际上是:TF * IDF,TF词频(Term Frequency),IDF反文档频率(Inverse Document Frequency)。TF表示词条在文档d中出现的频率(另一说:TF词频(Term Frequency)指的是某一个给定的词语在该文件中出现的次数)。IDF的主要思想是:如果包含词条t的文档越少,也就是n越小,IDF越大,则说明词条t具有很好的类别区分能力。如果某一类文档C中包含词条t的文档数为m,而其它类包含t的文档总数为k,显然所有包含t的文档数n=m+k,当m大的时候,n也大,按照IDF公式得到的IDF的值会小,就说明该词条t类别区分能力不强。(另一说:IDF反文档频率(Inverse Document Frequency)是指果包含词条的文档越少,IDF越大,则说明词条具有很好的类别区分能力。)但是实际上,如果一个词条在一个类的文档中频繁出现,则说明该词条能够很好代表这个类的文本的特征,这样的词条应该给它们赋予较高的权重,并选来作为该类文本的特征词以区别与其它类文档。这就是IDF的不足之处.

在一份给定的文件里,词频(term frequency,TF)指的是某一个给定的词语在该文件中出现的频率。这个数字是对词数(term count)的归一化,以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词数,而不管该词语重要与否。)对于在某一特定文件里的词语 来说,它的重要性可表示为:

Stary 2017-07-18 at 4.13.35 P

Stary 2017-07-18 at 4.13.28 P

某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。

【3】
在这里插入图片描述

在这里插入图片描述

"""sensitive_analysis情感分析"""
#基于ChnSentiCorp_htl_all.csv文件内容进行分析
import jieba
from gensim import corpora
import csv
from sklearn.linear_model import LogisticRegression

all_doc_list =[]
label_list =[]
with open("../dataSet/ChnSentiCorp_htl_all.csv","r",encoding="UTF-8") as f:
    reader = csv.reader(f)

    for row in reader:
        label =row[0]
        comment =list(jieba.cut(row[1],cut_all=False))
        label_list.append(label)
        all_doc_list.append(list(comment))
# print(all_doc_list)
"""
制作语料库
"""
# 制作词袋(bag-of-words)
dictionary = corpora.Dictionary(all_doc_list)
# print(dictionary.keys())
# print(dictionary.token2id)
# 制作语料库
corpus = [dictionary.doc2bow(doc) for doc in all_doc_list]
# print(corpus)

doc_vec = []
# 把文字向量化
for doc in all_doc_list:
    doc_test_vec = dictionary.doc2bow(doc)
    list = [0 for x in range(len(dictionary.keys()))]
    for dic in doc_test_vec:
        list[dic[0]] += dic[1]
    doc_vec.append(list)
print(doc_vec)

log_reg = LogisticRegression(multi_class='ovr', solver='sag')
log_reg.fit(doc_vec, label_list)
print("w1", log_reg.coef_)
print("w0", log_reg.intercept_)


# Predict
test = "不错,在同等档次酒店中应该是值得推荐的!"
test_list = [word for word in jieba.cut(test)]
test_vec = dictionary.doc2bow(test_list)
test_list = [0 for x in range(len(dictionary.keys()))]
for doc in test_vec:
    test_list[dic[0]] += dic[1]

pred_list = []
pred_list.append(test_list)
# 用来预测分类的概率值,比如第一个行第一个概率最大,那么得到的y=0
y_proba = log_reg.predict_proba(pred_list)
# 用来预测分类号的
y_hat = log_reg.predict(pred_list)
print(y_proba)
print(y_hat)

  • 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
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62

在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/552388
推荐阅读
相关标签
  

闽ICP备14008679号