自然语言处理理论和应用

自然语言处理理论和应用

  • 自然语言处理介绍
    • 什么是自然语言
    • 什么是自然语言处理(NLP)
    • 什么是自然语言理解(NLU)
  • 自然语言处理任务与方法
    • 预备知识
      • 语言模型
        • 什么是语言模型
        • 常见的语言模型
          • N-Gram语言模型(n 元模型)
          • 神经网络语言模型(NNLM)
          • RNN语言模型
      • 文本向量化
          • 独热编码 | one-hot representation
          • 整数编码
          • 词嵌入 | word embedding
      • 常见算法
        • 隐马尔可夫模型(HMM)
        • 条件随机场模型(CRF)
        • 双向循环神经网络+条件随机场模型(BiLSTM+CRF)
    • 关键技术
      • 分词
        • 什么是分词?
        • 为什么要分词?
        • 中文分词的3大难点
      • 词性标注
        • 什么是词性标注?
      • 命名实体识别
      • 句法分析
      • 语义分析
      • 例子分析
    • NLP任务的一般步骤
    • 应用系统
      • 文本分类
      • 文本聚类
        • TF-IDF算法
      • 机器翻译
      • 问答系统
      • 信息过滤
      • 自动文摘
      • 信息抽取
        • LDA主题模型关键词提取
      • 舆情分析

自然语言处理介绍

什么是自然语言

自然语言处理理论和应用_第1张图片

自然语言处理理论和应用_第2张图片

  • 以语音为物质外壳,由词汇和语法两部分组成的符号系统。

什么是自然语言处理(NLP)

自然语言处理理论和应用_第3张图片

  • 自然语言处理就是,利用计算机为工具对人类特有的书面形式和口头形式的自然语言的信息,进行各种类型处理和加工的技术。(NLP就是人类和机器之间沟通的桥梁)

什么是自然语言理解(NLU)

自然语言理解 NLU)是所有支持机器理解文本内容的方法模型或任务的总称。NLU在文本信息处理处理系统中扮演着非常重要的角色,是推荐、问答、搜索等系统的必备模块。
自然语言处理理论和应用_第4张图片

自然语言处理任务与方法

预备知识

语言模型

什么是语言模型

语言模型可以对一段文本的概率进行估计,对信息检索,机器翻译,语音识别等任务有着重要的作用。语言模型分为统计语言模型和神经网络语言模型。

常见的语言模型

N-Gram语言模型(n 元模型)

n-gram是一种统计语言模型,用来根据前(n-1)个item来预测第n个item。在应用层面,这些item可以是音素(语音识别应用)、字符(输入法应用)、词(分词应用)或碱基对(基因信息)。一般来讲,可以从大规模文本或音频语料库生成n-gram模型。
自然语言处理理论和应用_第5张图片

n-gram模型的一个常用应用
搜索引擎如谷歌或百度等,或者输入法的提示。当我们在搜索每一个或几个词时,搜索框通常会以下拉菜单的形式给出几个备选项:
自然语言处理理论和应用_第6张图片
稀疏:窗口越大,越容易出现count为0的问题
存储∶这些count需要预先存储下来,这个量太大了

神经网络语言模型(NNLM)

自然语言处理理论和应用_第7张图片
优点:没有ngram语言模型的稀疏和存储的问题
缺点︰想要更好的性能,就要加大窗口,窗口越大,参数量越大

RNN语言模型

自然语言处理理论和应用_第8张图片
RNN语言模型优势:
可以处理任意长度文本序列,而参数量不变。
比n-gram能处理更长的上下文,而且没有稀疏的问题。

文本向量化

文本表示的作用就是将这些非结构化的信息转化为结构化的信息,这样就可以针对文本信息做计算,来完成我们日常所能见到的文本分类,情感判断等任务。
自然语言处理理论和应用_第9张图片

独热编码 | one-hot representation

假如我们要计算的文本中一共出现了4个词:猫、狗、牛、羊
自然语言处理理论和应用_第10张图片
缺点
无法表达词语之间的关系
这种过于稀疏的向量,导致计算和存储的效率都不高

整数编码

自然语言处理理论和应用_第11张图片

缺点
无法表达词语之间的关系
对于模型解释而言,整数编码可能具有挑战性。

词嵌入 | word embedding

常见算法

自然语言处理理论和应用_第12张图片

隐马尔可夫模型(HMM)

HMM是关于时序的概率模型,它由一个隐藏的马尔可夫链随机生成不可观测的随机状态序列,再由各个状态生成一个观测从而产生观测随机序列的过程。序列的每个位置叫做一个时刻。
两个假设
隐状态独立假设(齐次马尔科夫假设)∶当前状态只与上一状态有关。
观测独立假设:当前观测值只由当前隐状态产生,与其他观测值相互独立。
自然语言处理理论和应用_第13张图片
一个HMM模型实例

import numpy as np
from hmmlearn import hmm

# 设定隐藏状态的集合
states = ["box 1", "box 2", "box3"]
n_states = len(states)

# 设定观察状态的集合
observations = ["red", "white"]
n_observations = len(observations)

# 设定初始状态分布
start_probability = np.array([0.2, 0.4, 0.4])

# 设定状态转移概率分布矩阵
transition_probability = np.array([
  [0.5, 0.2, 0.3],
  [0.3, 0.5, 0.2],
  [0.2, 0.3, 0.5]
])

# 设定观测状态概率矩阵
emission_probability = np.array([
  [0.5, 0.5],
  [0.4, 0.6],
  [0.7, 0.3]
])

自然语言处理理论和应用_第14张图片

条件随机场模型(CRF)

  • 条件随机场( Conditional Random
    Field,CRF),取消了HMM的两个独立假设,把标签转移和上下文输入都当做全局特征之一,在全局进行概率归一化,解决了HMM的标签偏置和上下文特征缺失问题。被广泛用于分词,
    实体识别和词性标注等场景. 随着深度学习的普及, BILSTM+CRF, BERT+CRF, TRANSFORMER+CRF等模型,
    逐步亮相, 并在这些标注场景, 效果有显著的提升。
  • 条件随机场用于序列标注,中文分词、中文人名识别和歧义消解等自然语言处理中,表现出很好的效果。原理是:对给定的观察序列和标注序列,建立条件概率模型。条件随机场可用于不同预测问题,其学习方法通常是极大似然估计。
  • 条件随机场模型也需要解决三个基本问题:特征的选择、参数训练和解码。

自然语言处理理论和应用_第15张图片
自然语言处理理论和应用_第16张图片

生产模型与判别模型

  • 生产式模型:直接对联合分布进行建模,如:混合高斯模型、隐马尔科夫模型、马尔科夫随机场等
  • 判别式模型:对条件分布进行建模,如:条件随机场、支持向量机、逻辑回归等。

双向循环神经网络+条件随机场模型(BiLSTM+CRF)

LSTM是循环神经网络(RNN)的一种变种,BiLSTM是指双向的LSTM网络,BiLSTM相对于传统的CRF算法,可以更有效的学习上下文特征,无需手工设计特征,同时也能处理更长的上下文依赖。
自然语言处理理论和应用_第17张图片

关键技术

分词

什么是分词?

分词就是将句子、段落、文章这种长文本,分解为以字词为单位的数据结构,方便后续的处理分析工作。

分词案例

import jieba
testSentence = "利用python进行数据分析"
print("1.精准模式分词结果:"+"/".join(jieba.cut(testSentence,cut_all=False)))
print("2.全模式分词结果:"+"/".join(jieba.cut(testSentence,cut_all=True)))
print("3.搜索引擎模式分词结果:"+"/".join(jieba.cut_for_search(testSentence)))
print("4.默认(精准模式)分词结果:"+"/".join(jieba.cut(testSentence)))

自然语言处理理论和应用_第18张图片
备注

  • 精确模式:试图将句子最精确地切开,适合文本分析;
  • 全模式:把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
  • 搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。
#加载词典
print("加载词典")
def load_dictionary():
    dic = set()

    # 按行读取字典文件,每行第一个空格之前的字符串提取出来。
    for line in open("CoreNatureDictionary.mini.txt", "r",encoding='utf-8'):
        dic.add(line[0:line.find('	')])

    return dic
dic = load_dictionary()
print(dic)

print("找出一段文本中的所有单词")
#找出一段文本中的所有单词
def fully_segment(text, dic):
    word_list = []
    for i in range(len(text)):  # i 从 0 到text的最后一个字的下标遍历
        for j in range(i + 1, len(text) + 1):  # j 遍历[i + 1, len(text)]区间
            word = text[i:j]  # 取出连续区间[i, j]对应的字符串
            if word in dic:  # 如果在词典中,则认为是一个词
                word_list.append(word)
    return word_list


dic = load_dictionary()
print(fully_segment('就读北京大学', dic))

#正向最长匹配

def forward_segment(text, dic):
    word_list = []
    i = 0
    while i < len(text):
        longest_word = text[i]  # 当前扫描位置的单字
        for j in range(i + 1, len(text) + 1):  # 所有可能的结尾
            word = text[i:j]  # 从当前位置到结尾的连续字符串
            if word in dic:  # 在词典中
                if len(word) > len(longest_word):  # 并且更长
                    longest_word = word  # 则更优先输出
        word_list.append(longest_word)  # 输出最长词
        i += len(longest_word)  # 正向扫描
    return word_list

print("正向最长匹配")
dic = load_dictionary()
print(forward_segment('就读北京大学', dic))
print(forward_segment('研究生命起源', dic))

#逆向最长匹配
def backward_segment(text, dic):
    word_list = []
    i = len(text) - 1
    while i >= 0:  # 扫描位置作为终点
        longest_word = text[i]  # 扫描位置的单字
        for j in range(0, i):  # 遍历[0, i]区间作为待查询词语的起点
            word = text[j: i + 1]  # 取出[j, i]区间作为待查询单词
            if word in dic:
                if len(word) > len(longest_word):  # 越长优先级越高
                    longest_word = word
                    break
        word_list.insert(0, longest_word)  # 逆向扫描,所以越先查出的单词在位置上越靠后
        i -= len(longest_word)
    return word_list

print("逆向最长匹配")
dic = load_dictionary()
print(backward_segment('研究生命起源', dic))
print(backward_segment('项目的研究', dic))

#双向最长匹配
print("双向最长匹配")
def count_single_char(word_list: list):  # 统计单字成词的个数
    return sum(1 for word in word_list if len(word) == 1)


def bidirectional_segment(text, dic):
    f = forward_segment(text, dic)
    b = backward_segment(text, dic)
    if len(f) < len(b):  # 词数更少优先级更高
        return f
    elif len(f) > len(b):
        return b
    else:
        if count_single_char(f) < count_single_char(b):  # 单字更少优先级更高
            return f
        else:
            return b  # 都相等时逆向匹配优先级更高

print(bidirectional_segment('研究生命起源', dic))
print(bidirectional_segment('项目的研究', dic))

自然语言处理理论和应用_第19张图片

为什么要分词?

  • 将复杂问题转化为数学问题
    自然语言处理理论和应用_第20张图片
  • 词是一个比较合适的粒度
    自然语言处理理论和应用_第21张图片

中文分词的3大难点

自然语言处理理论和应用_第22张图片

  • 没有统一的标准

  • 歧义词如何切分

     乒乓球 \ 拍卖 \ 完了
     乒乓 \ 球拍 \ 卖 \ 完了
    
  • 新词的识别

     蓝瘦香菇
     YYDS
     小趴菜
    

词性标注

什么是词性标注?

词性标注( Part-Of-Speech tagging,POS tagging )∶是指为句子的分词结果中的每个单词标注一个正确的词性的程序,也即确定每个词是名词、动词、形容词或者其他词性的过程。例如:迈向/v充满/v希望/n的/uj新/a世纪/n。词性标注是很多NLP任务的预处理步骤,如句法分析、信息抽取,经过词性标注后的文本会带来很大的便利性,但不是不可或缺的步骤。自然语言处理理论和应用_第23张图片
给定带有各自标注的词的序列,我们可以确定下一个词最可能的词性。
自然语言处理理论和应用_第24张图片
自然语言处理理论和应用_第25张图片

import jieba.posseg
testSentence = "利用python进行数据分析"
words = jieba.posseg.cut(testSentence)
for item in words:
    print(item.word+"----"+item.flag)

自然语言处理理论和应用_第26张图片

命名实体识别

命名实体识别(Named Entity Recognition,NER)为自然语言处理(NLP)的基础任务之一,其目标是提取文本中的命名实体并对这些实体进行分类,比如人名、地名、机构、时间、货币和百分比等。
自然语言处理理论和应用_第27张图片
自然语言处理理论和应用_第28张图片

import jieba.analyse

print(jieba.analyse.extract_tags("我喜欢广州小蛮腰", 3))
print(jieba.analyse.extract_tags("我喜欢广州广州小蛮腰", 3))
print(jieba.analyse.extract_tags("我喜欢广州广州广州小蛮腰", 3))

自然语言处理理论和应用_第29张图片

import jieba.analyse
print("1.采取精准模式结果:")
print([item for item in jieba.tokenize("数据分析与数据挖掘的应用")])
print("-------------------")
print("2.采取搜索模式结果:")
print([item for item in jieba.tokenize("数据分析与数据挖掘的应用",mode="search")])

在这里插入图片描述

句法分析

是对句子和短语的结构进行分析,目的是要找出词、短语等的相互关系以及各自在句中的作用。
自然语言处理理论和应用_第30张图片

语义分析

是找出词义、结构意义及其结合意义,从而确定语言所表达的真正含义或概念。
在这里插入图片描述
自然语言处理理论和应用_第31张图片
自然语言处理理论和应用_第32张图片

例子分析

在生活中,如果想要订机票,人们会有很多种自然的表达

“订机票”;
“有去上海的航班么?”;
“看看航班,下周二出发去纽约的”;
“要出差,帮我查下机票”;

基于规则进行意图判断
自然语言处理理论和应用_第33张图片
基于NLU来识别用户意图
自然语言处理理论和应用_第34张图片

NLP任务的一般步骤

自然语言处理理论和应用_第35张图片

应用系统

文本分类

文本分类( text classification),又称文档分类( document classification),指的是将一个文档归类到一个或多个类别中的自然语言处理任务。文本分类的应用场景非常广泛,涵盖垃圾邮件过滤、垃圾评论过滤、自动标签、情感分析等任何需要自动归档文本的场合。

文本的类别有时又称作标签,所有类别组成了标注集,文本分类输出结果一定属于标注集。

文本分类是一个典型的监督学习任务,其流程离不开人工指导: 人工标注文档的类别,利用语料训练模型,利用模型预测文档的类别。

文本聚类

在许多app中都有推荐功能,比如网易云音乐有每日歌曲推荐、某些阅读软件有书籍阅读等等,一般的推荐模式有基于用户和基于内容,其中基于内容的推荐可能就有计算到文本相似度,当然肯定还结合了其他维度,如音乐的风格等。同理在搜索引擎中也会根据与搜索关键词的相似度对网页进行排序。接下来将实现基于TF-IDF加权技术的文本相似度计算。

TF-IDF算法

TF-IDF:是一种用于资讯检索与资讯探勘的常用加权技术。
(1)TF(term frequency)
词频,指的是某一个给定的词语在该文档中出现的频率。计算公式为某词在一个文档中出现的次数除以所有字词在该文档中出现的次数。
其中以所有字词在文档中出现的系数作为分母目的在于将词数进行归一化是为了防止偏向长的文档(不管该词语重要与否,同一个词语在长文档里可能会比短文件有更高的词数)。
(2)IDF(inverse document frequency)
逆向文件频率,是一个词语普遍重要性的度量。计算公式为总文档数目除以包含该词语之文件的数目,再将得到的商取对数。
(3)计算实例

词语“母牛”在某一篇总词语数为100个的文件出现了3次,该文件所在的语料库的文件总数为10,000,000份,并且“母牛”在其中的1,000份文件出现过,那么“母牛”一词在该文件中的词频就是3/100=0.03,其逆向文件频率为 log(10,000,000 / 1,000)=4。最后的TF-IDF的分数为0.03 * 4=0.12。

'''
利用gensim做TF-IDF主题模型 
'''
from gensim import corpora, models, similarities
import jieba
from collections import defaultdict
# 1.导入句子
sentence1 = "我喜欢吃番薯"
sentence2 = "番薯是个好东西"
sentence3 = "利用python进行文本挖掘"
# 2.分词
data1 = " ".join(jieba.cut(sentence1))
data2 = " ".join(jieba.cut(sentence2))
data3 = " ".join(jieba.cut(sentence3))
# 3.转换格式:"词语1 词语2 词语3 … 词语n"
texts = [list(data1), list(data2), list(data3)]
# 4.基于文本建立词典
dictionary = corpora.Dictionary(texts)
featureNum=len(dictionary.token2id.keys())#提取词典特征数
dictionary.save("./dictionary.txt")#保存语料库
# 5.基于词典建立新的语料库
corpus = [dictionary.doc2bow(text) for text in texts]
# 6.TF-IDF处理
tfidf = models.TfidfModel(corpus)
'''
# 输出每个句子每个词语的tfidf值
corpus_tfidf = tfidf[corpus]
for doc in corpus_tfidf:
    print(doc)
'''
# 7.加载对比句子并整理其格式
query = "吃东西"
data4 = jieba.cut(query)
data41 = ""
for item in data4:
    data41 += item+" "
new_doc = data41
# 8.将对比句子转换为稀疏向量
new_vec = dictionary.doc2bow(new_doc.split())
# 9.计算相似性
index = similarities.SparseMatrixSimilarity(tfidf[corpus],num_features=featureNum)
sim = index[tfidf[new_vec]]
for i in range(len(sim)):
    print("查询与第"+str(i+1)+"句话的相似度为:"+str(sim[i]))

自然语言处理理论和应用_第36张图片

机器翻译

把输入的源语言文本通过自动翻译获得另外一种语言的文本。机器翻译从最早的基于规则的方法到二十年前的基于统计的方法,再到今天的基于神经网络(编码-解码)的方法,逐渐形成了一套比较严谨的方法体系。

问答系统

对一个自然语言表达的问题,由问答系统给出一个精准的答案。需要对自然语言查询语句进行某种程度的语义分析,包括实体链接、关系识别,形成逻辑表达式,然后到知识库中查找可能的候选答案并通过一个排序机制找出最佳的答案。
自然语言处理理论和应用_第37张图片

信息过滤

敏感词过滤及反垃圾文本的相关知识

自动文摘

from textrank4zh import TextRank4Keyword, TextRank4Sentence
import jieba
import logging

# 取消jieba分词的日志输出
jieba.setLogLevel(logging.INFO)
text = """
现在随着互联网的发展,网络的上传和下载文件的速度有了极大的提高。因此现在的基础设施,越来越多高要求的应用有了可行性。人工智能,深度学习,自然语言处理等网络热词频频出现在我们的视野,那么,到底什么是自然语言处理呢?接下来就由我们来给大家科普一下自然语言处理到底是什么,做什么,以及对我们有什么帮助。
首先,自然语言处理是人工智能的一个分支,最终的目标和人工智能一样都是模仿人的行为,而自然语言处理的终极目标细化到对语言的理解,使计算机像人一样阅读和理解语言,并且给出相应符合人类思维的回答。实现它的方式有很多,可以基于统计,也可以基于深度学习等方法。
简单来说,自然语言处理就是,对计算机中各种各样的语言文本文件进行分析和应用上的处理。比如分析出一段文字的语义是否是消极的,又或者是辨别出一段文字的名词,形容词等。
具体来说,自然语言处理,英文是Natural Language Processing,简写NLP。可以把它分成“自然语言”和“处理”两部分。先来看自然语言。现在世界上所有的语种语言,都属于自然语言,包括汉语、英语、法语等。然后再来看“处理”。这个“处理”是指计算机进行处理。但计算机毕竟不是人,无法像人一样处理文本,需要有自己的处理方式。因此自然语言处理,即是计算机接受用户自然语言形式的输入,并在内部通过人类所定义的算法进行加工、计算等系列操作,以模拟人类对自然语言的理解,并返回用户所期望的结果。
正如机械解放人类的双手一样,自然语言处理的目的在于用计算机代替人工来处理大规模的自然语言信息。它是人工智能、计算机科学、信息工程的交叉领域,涉及统计学、语言学等的知识。由于语言是人类思维的证明,故自然语言处理是人工智能的最高境界,被誉为“人工智能皇冠上的明珠”。
那么,自然语言处理具体能够给我们带来些什么呢:
下面是自然语言处理在整个领域中所处的具体位置和它主要做的一些内容:

自然语言处理的应用非常的广泛而且实用,下面针对自然语言处理的细分领域,让我们一起深入自然语言处理吧!
语义理解:
语义理解技术简单来说就是让计算机像人一样实现对文本篇章的理解,并且回答与篇章相关问题的过程。语义理解更注重于对上下文的理解以及对答案精准程度的把控。比如说,给出一段文字,然后再提出一个问题,计算机通过算法模型,根据文本的语义输出这个问题的答案。下面这张图是一个实例,计算机通过阅读理解了文章Passage和问题Question之后,回答相应的答案。
demo
2.2 文本摘要
就是交给计算机一段文字或者是一整篇论文,然后计算机根据你的正文来输出针对这段文字的摘要。其核心技术是要聚焦到文本文件最核心的部分,然后自动生成摘要。这个技术模仿了人独有的一个特征,那就是注意力。我们人在面对多个事务之前,总是会有优先级。就像你在酒吧当中,很多人都在说话,但是如果有人叫你的名字,或者你对某个人很感兴趣,那么你的大脑就会过滤掉其他的声音,而专注于你关注的事务。你看,计算机能做到这样的事,是不是越来越有人类的呢?
2.3 语言推理和溯因自然语言推理(aNLI)
语言推理:给计算机输入两个句子,然后计算机给你判断出两个句子之间的关系,比如是增强关系,或者是因果关系等。
demo
溯因自然语言推理(aNLI):这是计算机模仿人类想象力的一种实现,因为人在面对一个问题的时候,比如有人问你什么是蓝色的事务,那么你的脑海中就会产生大量的与蓝色相关的事务,如天空,蓝鲸,蓝色汽车等,甚至也会联想到和蓝色不相关的,如篮子,兰花等。Anli就是使计算机模仿人类的日常对话的技术,它相较于自然语言推理的话,想象空间更大,并且更加符合人类的日常交流。
2.4 情绪分析
情绪分析是自然语言处理中文本分类的一种具体的应用。
文本分类是指用计算机对文本(或其他实体)按照一定的分类体系或标准进行自动分类标记。伴随着信息的爆炸式增长,人工的标注每个数据属于哪一个类别已经变得非常耗时,并且质量低下,因为受到标注人主观意识的影响。因此,利用计算机自动的来实现对文本进行分类的变得具有很大的意义,将重复且枯燥的文本分类任务交由计算机进行处理能够有效克服以上问题,同时所分类的数据具有一致性、高质量等特点。
情绪分析是计算机在学习了人类情绪特点之后对文本进行情绪上的分类,识别给定文本的情绪(比如,非常消极、消极、中性、积极、非常积极)。如果句子措辞清晰明确,比如“我不喜欢冬天的天气”,情绪分析就可以很简单。然而,当人工智能系统遇到具有翻转结构或否定的句子时,情绪分析可能会变得更具挑战性,例如“说讨厌冬天的天气不是我真正的事情,这是完全不准确的。情感分析核心难点在于如何理解文本情绪以及如何度量文本之间的距离。
下面是一个例子如图所示:
demo
2.5 机器翻译
简单来说,就是利用计算机技术实现从一种自然语言到另外一种自然语言的翻译过程。现在基于统计,深度学习的机器翻译方法突破了之前基于规则和实例翻译方法的局限性,翻译性能取得巨大提升。基于深度神经网络的机器翻译在日常口语等一些场景的成功应用已经显现出了巨大的潜力。随着上下文的语境表征和知识逻辑推理能力的发展,自然语言知识图谱不断扩充,机器翻译将会在多轮对话翻译及篇章翻译等领域取得更大进展。
2.6 问答系统和对话系统
严格上来说,问答系统和对话系统是人工智能多个领域分支结合起来共同实现的技术,自然语言处理是系统中不可获取的一部分。对话系统是接受用户提出的的问题,并返回像人一样相应的回答。常见形式为检索式、抽取式和生成式三种。近年来交互式也逐渐受到关注。典型应用有智能客服。与问答系统有许多相通之处,区别在于问答系统旨在直接给出精准回答,回答是否口语化不在主要考虑范围内;而对话系统旨在以口语化的自然语言对话的方式解决用户问题。对话系统目前分闲聊式和任务导向型。前者主要应用有siri、小冰等;后者主要应用有车载聊天机器人。(对话系统和问答系统应该是最接近NLP终极目标的领域)
3 应用实现的一般步骤
好了,我们了解了自然语言模仿了人类的方方面面,想象力,注意力,理解能力,情绪和对话等等,那么,我们到底是怎么让计算机实现这些技术的呢?下面我们就了解一下自然语言的基本技术吧!
其实现在要实现这些自然语言的技术,一定离不开大数据的支持。像人一样,人类对一件事情做出什么样的反应,有非常大的比重是来自于人类之前经历过的事情,也就是所谓的经验。有了经验,你才会对做某个事情更加得心应手。比如你去考试,如果你在之前已经做了类似的很多题目了,那么你就学习到了很多经验,基于这些经验,这次考试你做出的选择一般来说都是对的。计算机也同样如此,背后大数据的支撑,就是计算机所谓的“经验”,利用这些数据,计算机就可以做出更好更加正确的模仿人类。
另外,自然语言处理的很多细分应用场景中,一般都离不开几个必要的步骤,在介绍具体的实现细节之前,先举一个简单的现实例子来预热一下,准备好了吗?
比如说你想要做一个模型,让计算机帮你分析一个人是否可以做你的男/女朋友,首先你在现实中是对大量的人本身有一个基本度量的,你会很清楚这些人当中哪些是符合你的预期,适合做男女朋友的,哪些坚决不行。然后把这个人的特征抽取出来,比如你喜欢的人身高要在1.6米以上,善良,有车有房等等,计算机就可以根据这些具体量化的特征进行判断,从而输出适合和不适合两个答案。如果计算机输出不符合你的预期,那么就调整输入的特征参数(因为最开始计算机是不知道你身高的要求是1.6米的),将身高这个特征调整为1.55米,或者调整这个特征占整个特征的比重等等,然后重新计算输出,不断的循环,不断的调整特征的参数,直到输出大概率都符合你的预期为止。这样,一个男女朋友判断模型就做出来了。
好了,我们了解了一个简单的模型是怎么实现了之后,具体展开聊聊每个步骤具体要做的事情。
一是获取数据集,让计算机获得所谓的习题和答案。
二是对数据集进行数据的预处理,预处理过程中要对数据集中没有用和重复的词语进行处理,让计算机获得的数据集是高质量的,然后要对这些数据集进行分词,因为计算机是不能直接识别理解一个一个的文字的,所以为了让计算机可以量化每一个文字,我们要先把数据集分成一个一个的词,然后进行特征工程,也就是把每个词变成一个一个的向量。词向量基于某个规则进行(如one-hot、word2vec),每一个词向量不是随机产生的,而是会和周围的其他文字共同计算之后产生,这样每个词向量就和周围的词向量产生了联系,计算机就是通过这种方式来实现理解每个文字之间的联系的。之后就是针对不同的应用进行具体特征的选择,常用算法有(DF、MI、IG、CHI、WLLR、WFO等),至此,就把一个人可以理解的文字集合转变成了计算机可以理解的词向量集合。
三是对某个应用构造具体的模型,我们把这些词向量集合输入计算机之后,根据某个模型(也就是一个算法),基于数据集的“经验”进行计算,从而产生我们想要的结果,如果计算的结果不符合我们的预期,那么就调整每个输入特征的权重,在不断的循环优化中,逐渐的达成我们想要的预期,就像是不断做题的过程,获得了经验就可以做对这个题目。这个过程就是所谓一个计算机的模型学习,将知识转化为经验的过程。
最后就是对模型进行评估,一般我们把数据集分成训练集和测试集两个部分,训练集就是用于对模型进行训练的过程,过程中会不断优化每个输入特征的参数权重。而测试集就是检验我们模型的准确率,区别就在于使用测试集的这个过程不会改变参数权重,而是仅仅观察模型输出的答案是否符合我们的预期。
以上,就是一般情况下自然语言处理必做的几个步骤。
常见的模型分为机器学习模型和深度学习两种:
常见的机器学习模型有KNN,SVM,Naive Bayes,决策树,GBDT,K-means等。
常见的深度学习模型有CNN,RNN,LSTM,Seq2Seq,Fast Text,Text CNN等。
4 未来发展
现在几乎人人都离不开互联网,而且会将大量的文本数据存储放在网络上,这样就产生了大量的自然语言文本文件,这是一个巨大的资源,自然语言处理现在的发展很快,越来越多的人把注意力放在自然语言处理上面,很多方面的应用都有很大的进展,精度也越来越向人类靠近,甚至某些方面已经超越人类。但是,由于所有应用方面都是基于一个很简单的事情来做,跟具体人能干的事情还是差得很远。这些任务大多都只能对应于人的感知,比如识别一个图片里的东西或视频里的东西,都是人类几秒钟能做的事情,但是对于人类需要几个小时,甚至很多天才能做的事情,是没有涉及到的。所以自然语言处理有非常大的发展空间。
"""
def get_key_words(text, num=3):
    """提取关键词"""
    tr4w = TextRank4Keyword()
    tr4w.analyze(text, lower=True)
    key_words = tr4w.get_keywords(num)
    return [item.word for item in key_words]

def get_summary(text, num=3):
    """提取摘要"""
    tr4s = TextRank4Sentence()
    tr4s.analyze(text=text, lower=True, source='all_filters')
    return [item.sentence for item in tr4s.get_key_sentences(num)]

words = get_key_words(text)
print(words)
#['计算机', '自然语言', '人']
summary = get_summary(text)
print(summary)
#['现在几乎人人都离不开互联网,而且会将大量的文本数据存储放在网络上,这样就产生了大量的自然语言文本文件,这是一个巨大的资源,自然语言处理现在的发展很快,越来越多的人把注意力放在自然语言处理上面,很多方面的应用都有很大的进展,精度也越来越向人类靠近,甚至某些方面已经超越人类',
# '首先,自然语言处理是人工智能的一个分支,最终的目标和人工智能一样都是模仿人的行为,而自然语言处理的终极目标细化到对语言的理解,使计算机像人一样阅读和理解语言,并且给出相应符合人类思维的回答',
# '简单来说,自然语言处理就是,对计算机中各种各样的语言文本文件进行分析和应用上的处理']

在这里插入图片描述

信息抽取

从给定文本中抽取重要的信息,比如时间、地点、人物、事件、原因、结果、数字、日期、货币、专有名词等等。通俗说来,就是要了解谁在什么时候、什么原因、对谁、做了什么事、有什么结果。

LDA主题模型关键词提取

主题模型是一种统计模型用于发现文档集合中出现的抽象“主题”。主题建模是一种常用的文本挖掘工具,用于在文本体中发现隐藏的语义结构。

from gensim import corpora, models
import jieba.posseg as jp
import jieba


# 简单文本处理
def get_text(text):
    flags = ('n', 'nr', 'ns', 'nt', 'eng', 'v', 'd')  # 词性
    stopwords = ('的', '就', '是', '用', '还', '在', '上', '作为')  # 停用词
    words_list = []
    for text in texts:
        words = [w.word for w in jp.cut(text) if w.flag in flags and w.word not in stopwords]
        words_list.append(words)
    return words_list


# 生成LDA模型
def LDA_model(words_list):
    # 构造词典
    # Dictionary()方法遍历所有的文本,为每个不重复的单词分配一个单独的整数ID,同时收集该单词出现次数以及相关的统计信息
    dictionary = corpora.Dictionary(words_list)
    print(dictionary)
    print('打印查看每个单词的id:')
    print(dictionary.token2id)  # 打印查看每个单词的id

    # 将dictionary转化为一个词袋
    # doc2bow()方法将dictionary转化为一个词袋。得到的结果corpus是一个向量的列表,向量的个数就是文档数。
    # 在每个文档向量中都包含一系列元组,元组的形式是(单词 ID,词频)
    corpus = [dictionary.doc2bow(words) for words in words_list]
    print('输出每个文档的向量:')
    print(corpus)  # 输出每个文档的向量

    # LDA主题模型
    # num_topics -- 必须,要生成的主题个数。
    # id2word    -- 必须,LdaModel类要求我们之前的dictionary把id都映射成为字符串。
    # passes     -- 可选,模型遍历语料库的次数。遍历的次数越多,模型越精确。但是对于非常大的语料库,遍历太多次会花费很长的时间。
    lda_model = models.ldamodel.LdaModel(corpus=corpus, num_topics=2, id2word=dictionary, passes=10)

    return lda_model


if __name__ == "__main__":
    texts = ['作为千元机中为数不多拥有真全面屏的手机,OPPO K3一经推出,就簇拥不少粉丝', \
             '很多人在冲着这块屏幕购买了OPPO K3之后,发现原来K3的过人之处不止是在屏幕上', \
             'OPPO K3的消费者对这部手机总体还是十分满意的', \
             '吉利博越PRO在73日全新吉客智能生态系统GKUI19发布会上正式亮相', \
             '今年上海车展,长安CS75 PLUS首次亮相', \
             '普通版车型采用的是双边共双出式排气布局;运动版本车型采用双边共四出的排气布局']
    # 获取分词后的文本列表
    words_list = get_text(texts)
    print('分词后的文本:')
    print(words_list)

    # 获取训练后的LDA模型
    lda_model = LDA_model(words_list)

    # 可以用 print_topic 和 print_topics 方法来查看主题
    # 打印所有主题,每个主题显示5个词
    topic_words = lda_model.print_topics(num_topics=2, num_words=5)
    print('打印所有主题,每个主题显示5个词:')
    print(topic_words)

    # 输出该主题的的词及其词的权重
    words_list = lda_model.show_topic(0, 5)
    print('输出该主题的的词及其词的权重:')
    print(words_list)

自然语言处理理论和应用_第38张图片

舆情分析

是指收集和处理海量信息,自动化地对网络舆情进行分析,以实现及时应对网络舆情的目的。

# -*- coding:utf-8 -*-
import pandas as pd
import jieba
 
#基于波森情感词典计算情感值
def getscore(text):
    df = pd.read_table(r"BosonNLP_dict\BosonNLP_sentiment_score.txt", sep=" ", names=['key', 'score'])
    key = df['key'].values.tolist()
    score = df['score'].values.tolist()
    # jieba分词
    segs = jieba.lcut(text,cut_all = False) #返回list
    # 计算得分
    score_list = [score[key.index(x)] for x in segs if(x in key)]
    return sum(score_list)
 
#读取文件
def read_txt(filename):
    with open(filename,'r',encoding='utf-8')as f:
        txt = f.read()
    return txt
#写入文件
def write_data(filename,data):
    with open(filename,'a',encoding='utf-8')as f:
        f.write(data)
 
 
if __name__=='__main__':
    text = read_txt('test_data\微博.txt')
    lists  = text.split('\n')
 
    # al_senti = ['无','积极','消极','消极','中性','消极','积极','消极','积极','积极','积极',
    #             '无','积极','积极','中性','积极','消极','积极','消极','积极','消极','积极',
    #             '无','中性','消极','中性','消极','积极','消极','消极','消极','消极','积极'
    #             ]
    al_senti = read_txt(r'test_data\人工情感标注.txt').split('\n')
    i = 0
    for list in lists:
        if list  != '':
            # print(list)
            sentiments = round(getscore(list),2)
            #情感值为正数,表示积极;为负数表示消极
            print(list)
            print("情感值:",sentiments)
            print('人工标注情感倾向:'+al_senti[i])
            if sentiments > 0:
                print("机器标注情感倾向:积极\n")
                s = "机器判断情感倾向:积极\n"
            else:
                print('机器标注情感倾向:消极\n')
                s = "机器判断情感倾向:消极"+'\n'
            sentiment = '情感值:'+str(sentiments)+'\n'
            al_sentiment= '人工标注情感倾向:'+al_senti[i]+'\n'
            #文件写入
            filename = 'result_data\BosonNLP情感分析结果.txt'
            write_data(filename,'情感分析文本:')
            write_data(filename,list+'\n') #写入待处理文本
            write_data(filename,sentiment) #写入情感值
            write_data(filename,al_sentiment) #写入机器判断情感倾向
            write_data(filename,s+'\n') #写入人工标注情感
            i = i+1

你可能感兴趣的:(人生苦短-我用Python,自然语言处理,人工智能,nlp)