人工智能开发实战之自然语言NLP处理

内容导读

人工智能自然语言处理简介

英文语音识别

智能聊天机器人

一、人工智能自然语言处理简介

自然语言处理(NLP)是人工智能领域中的一个重要分支,它研究如何实现人与计算机之间用自然语言进行有效通信的各种理论和方法。‌

NLP是计算机科学、人工智能和语言学交叉的领域,旨在使计算机能够理解和生成人类语言,从而实现人机交互的自然化和智能化。

从20世纪50年代开始发展的,其最先在机器翻译领域得到发展。

20世纪60年代,出现了句法分析、语义分析、逻辑推理相结合的SHRDLU自然语言系统。

20世纪80年代初期,多数自然语言处理系统都是以一套复杂的、人工制定的规则为基础形成的。

从20世纪80年代末期开始,语言处理引进了机器学习的算法,自然语言处理产生革新。

近年来,深度学习技巧纷纷出炉,在自然语言处理方面获得了尖端的成果。

自然语言处理的部分范畴列表:

二、英文语音识别

1、项目介绍

(1)英文语音识别项目以Google的speech_commands英文单词语音识别项目为基础,并做了一些修改,以更好地使用。

该项目构建可以识别10个不同单词的基本语音识别网络,10个单词分别为“yes”“no”“up”“down”“left”“right”“on”“off”“stop”“go”。

实际的语音和音频识别系统要复杂得多,但就像基于MNIST数据集学习图像识别一样,这个基本语音识别网络能够帮助读者了解所涉及的一些基本技术。

(2)本项目基于Convolutional Neural Networks for Small-footprint Keyword Spotting这篇论文中介绍的架构,这种架构相对简单、可快速训练,并且易于理解。

(3)本项目定义了一个语音字词应该符合的时间范围,并将这段时间内的音频信号转换成图像。

将传入的音频样本分成小段(时长仅为几毫秒)并计算一组频段内频率的强度,一段音频内的每组频率强度为数字向量,这些向量按时间顺序排列,形成一个二维数组,该数组可被视为单通道图像,称为声谱图。

(4)具体做法是

将输入的语音处理成能够读取的数据,即将其转换成一组梅尔频率倒谱系数(Mel-Frequency Cepstral Coefficients,MFCC)。

MFCC也是一种二维单通道表示法,因此也可将其视为图像,图像会输送到多层卷积神经网络中进行处理,并且在卷积神经网络处理后接入全连接层,再经过softmax()函数完成分类,实现区分不同词汇的功能。

2、训练模型

(1)在Python目录下新建NLP目录,在NLP目录下新建speech目录,在speech目录下新speech_commands项目目录并将源码下载到该项目目录下。

(2)在开始训练过程之前需要获取数据集。

有两种方式可获取数据集:

一种是手动下载语音指令数据集,下载后的数据集解压后需要放在speech\speech_commands\tmp下,

另一种是运行训练程序后脚本会自动下载该数据集。

(3)运行speech_commands目录下的train.py,在训练过程中会打印出训练日志,如图所示

(4)在训练过程中,每100步会保存一次模型,第100步打印的日志

说明:

每训练400步,会生成混淆矩阵(Confusion Matrix)。

在监督学习中,混淆矩阵可作为可视化工具,在无监督学习中其一般被称为匹配矩阵。

混淆矩阵是通过将实际的分类与预测分类相比较计算出来的。

(5)预测之后计算出的混淆矩阵

(6)训练到400步时生成的混淆矩阵

(7)训练到18000步时的混淆矩阵如图所示,可以看出它与训练到400步时混淆矩阵的区别

(8)在整个训练过程中,使用TensorBoard可以很好地观察训练进度

默认情况下,脚本会将事件保存到tmp/retrain_logs,可以在命令行运行以下命令:

tensorboard --logdir tmp/retrain_logs

模型进度的图表如图:

训练完成后,准确率介于85%~90%之间。在训练完成后进行模型转换,在命令行运行以下命令:

python speech_commands/freeze.py \
--start_checkpoint=speech_commands/tmp/speech_commands_train/conv.ckpt-18000 \
--output_file=speech_commands/tmp/my_frozen_graph.pb

运行以上命令会在tmp目录下生成my_frozen_graph.pb模型文件。

(9)修改测试代码使其可以识别自己录制的语音,将label_wav.py源码进行修改,修改为以下内容

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import argparse
import sys
import tensorflow as tf
from tensorflow.contrib.framework.python.ops import audio_ops as contrib_audio
FLAGS = None
def load_graph(filename):
   """Unpersists graph from file as default graph."""
with tf.gfile.FastGFile(filename, 'rb') as f:
      graph_def = tf.GraphDef()
      graph_def.ParseFromString(f.read())
      tf.import_graph_def(graph_def, name='')
def load_labels(filename):
   """Read in labels, one label per line."""
   return [line.rstrip() for line in tf.gfile.GFile(filename)]
def run_graph(wav_data, labels, input_layer_name, output_layer_name,                   num_top_predictions):
   """Runs the audio data through the graph and prints predictions."""
   with tf.Session() as sess:
      # 将音频数据作为输入输入到图形
      # 预测将包含一个二维数组,其中一个维表示输入图像的数量,而另一个维按类别分类
      softmax_tensor = sess.graph.get_tensor_by_name(output_layer_name)
      predictions, = sess.run(softmax_tensor, {input_layer_name: wav_data})
      # 按置信度排序显示标签
      top_k = predictions.argsort()[-num_top_predictions:][::-1]
   for node_id in top_k:
        human_string = labels[node_id]
        score = predictions[node_id]
        print('%s (score = %.5f)' % (human_string, score))
        return 0
def label_wav(wav, labels, graph, input_name, output_name, how_many_labels):
"""Loads the model and labels, and runs the inference to print predictions."""
   if not wav or not tf.gfile.Exists(wav):
       tf.logging.fatal('Audio file does not exist %s', wav)
   if not labels or not tf.gfile.Exists(labels):
       tf.logging.fatal('Labels file does not exist %s', labels)
   if not graph or not tf.gfile.Exists(graph):
       tf.logging.fatal('Graph file does not exist %s', graph)
   labels_list = load_labels(labels)
   # load graph, which is stored in the default session
   load_graph(graph)
   with open(wav, 'rb') as wav_file:
      wav_data = wav_file.read()
   run_graph(wav_data, labels_list, input_name, output_name,   	how_many_labels)
def main(_):
   """Entry point for script, converts flags to arguments."""
label_wav('./00b01445_nohash_0.wav','./speech_commands/tmp/speech_c	ommands_train/conv_labels.txt', ./speech_commands/tmp/my_	frozen_graph.pb', 'wav_data:0','labels_softmax:0', 3)
def speech_rcgnz():
    tf.app.run(main=main)

3、效果测试

识别自己的语音需要提前录制语音,安装pyaudio第三方库后可以使用Python在计算机上录音。

在交互界面上输入“pip install pyaudio”安装pyaudio。

(1)安装完成后,在speech目录下新建main.py文件来完成语音录制、语音识别的调用,代码如下

import wave
from pyaudio import PyAudio,paInt16
from sys import path
# 将存放module的路径添加进来
path.append(r'./speech_commands/') 
import label_wav
import os 
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' 
framerate=16000
NUM_SAMPLES=2000
channels=1
sampwidth=2
TIME=2
def save_wave_file(filename,data):
      # save the date to the wavfile
      wf=wave.open(filename,'wb')
      wf.setnchannels(channels)      # 声道
      wf.setsampwidth(sampwidth)  # 采样字节
      wf.setframerate(framerate)     # 采样频率
      wf.writeframes(b"".join(data))
      wf.close()
def my_record():
     pa=PyAudio()
          stream=pa.open(format = paInt16,channels=1,
          rate=framerate,input=True,
          frames_per_buffer=NUM_SAMPLES)
my_buf=[]
count=0
while count<TIME*4: #控制录音时间
string_audio_data = stream.read(NUM_SAMPLES)
          my_buf.append(string_audio_data)
          count+=1
          print('0.125s is passing!')
save_wave_file('00b01445_nohash_0.wav',my_buf)
 stream.close()
chunk=2014
def play():
      wf=wave.open(r"00b01445_nohash_0.wav",'rb')
      p=PyAudio()
  stream=p.open(format=p.get_format_from_width(wf.getsampwidth()),
                channels=wf.getnchannels(),
                rate=wf.getframerate(),output=True)
  while True:
      data=wf.readframes(chunk)
      if data=="":break
      stream.write(data)
  stream.close()
  p.terminate()
if __name__ == '__main__':
      print('可以识别的单词包括:')
      print('yes,no,up,down,left,right,on,off,stop,go')
      input("按Enter键开始录音:")
      my_record()
      print('结果:')
      label_wav.speech_rcgnz() 
      play()

执行以上代码后,调用录音功能并打印提示信息,如图所示。

(2)录音时间为1s,按下键盘的Enter键后说出要识别的单词,这里说了“left”这个单词

等待识别完毕,识别完成后输出识别结果最可能的3个标签,识别结果如下:

“left”得分最高的识别结果为“left”,识别正确。

友情提示:请参考相关资源,实现中文语音识别功能。

三、智能聊天机器人

1、seq2seq的机制原理

seq2seq模型,全称为Sequence to Sequence,它是一种通用的编码器—解码器框架,可用于机器翻译、文本摘要、会话建模、图像字幕等场景中。

前面已介绍过Sequence-to-Sequence模型,即Encoder-Decoder模型。

在实际聊天系统中,解码器和编码器一般都采用RNN模型和LSTM模型,编码器和解码器之间的唯一联系就是一个固定长度的上下文向量c,编码器要将整个序列的信息压缩进一个固定长度的向量中去。

这样做有两个弊端,一是语义向量无法完全表示整个序列的信息,二是先输入的内容携带的信息会被后输入的信息稀释,输入序列越长,这个现象就越严重,这就使得解码时没有获得输入序列足够的信息,使解码时的准确率打折扣。

为了解决上述问题,在seq2seq出现后,Attention模型被提出。该模型在产生输出的时候,会生成一个注意力范围来表示接下来输出的时候要重点关注输入序列的哪些部分,然后根据关注的区域产生下一个输出,如此反复。

Attention和人的一些行为特征有一定相似之处,人在读一段话的时候,通常只会重点注意具有信息量的词,而非全部词,人会赋予每个词不同的注意力权重。

Attention模型虽然提高了模型的训练难度,但提升了文本生成的效果。

模型的示意图如下:

2、动手实践

(1)这里制作一个智能聊天机器人

数据集可以在网上下载或者自己生成,网上下载的数据集可以进行修改,数据集应该是一个或多个以换行符分隔的文本文件。

对话的每一行都应以“>”开头,并以换行符结尾,并将文本文件放在项目的data目录下。

(2)制作一个智能聊天机器人数据集可以在网上下载或者自己生成

网上下载的数据集可以进行修改,数据集应该是一个或多个以换行符分隔的文本文件。

对话的每一行都应以“>”开头,并以换行符结尾,并将文本文件放在项目的data目录下。

(3)执行python chatbot.py文件

等待片刻,打印出以“>”开头的行,这时需要读者自己输入想说的话,没有“>”的行是聊天机器人的响应,对话结果如下:

> Hi, how are you?
Hello there, I'm doing fine. What about you?
> I'm very good.
Fair enough.
> I love you.
I love you too.
> I love you.
You're the best.
> Where are you from?
I'm from the south.
> Goodbye!
What do you mean?
> Goodbye!
Goodbye!

更多精彩内容请持续关注本站!

  • 5
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值