微软认知服务学习笔记

上一次学习了如何用Python调用NLTK库来分析文本中的词频。微软其实已经提供了一个标准的认知服务来实现文本分析,不光是可以分析词频,还可以进一步分析语句的情绪,创建和调用的过程也是十分简单。

https://lyqblog.blob.core.chinacloudapi.cn/lyqblog/Text+Speech.ipynb

在脚本的一开始,还是需要先读取准备好的文本:

因为用print将文档输出,所以在执行脚本后,可以看到下面显示的文档内容。

接下来的脚本需要提供认知服务的API的URI和key,需要在Azure上创建服务,并复制相应的信息。

创建一个文本认知服务,建议大家将服务部署在东南亚区域,这样访问速度会比较好。

等待创建文成后,可以在概览里看到Endpoint,调用API的URL

在Key这选项下,可以看到生成的key,选择一个复制下来。

上周,我们用一大段脚本实现的文本分析,尤其是多个文本的词频分析,在微软认知服务里,只需要一次简单的API调用,就可以实现了.

其中真正调用API就只有一句话:

conn.request("POST","/text/analytics/v2.0/keyPhrases?%s" % params, str(body), headers)

Text Analytics提供了4种服务,可以在以下网址查看服务说明:

https://docs.microsoft.com/en-us/azure/cognitive-services/text-analytics/overview

相关API说明和代码示例可以在以下链接查看:

https://westus.dev.cognitive.microsoft.com/docs/services/TextAnalytics.V2.0/operations/56f30ceeeda5650db055a3c7

我们可以看一下执行的结果,由于结果很长,只看前几个单词:

Document 1 key phrases: new sea;newknowledge;new ocean;new rights;space science;Moon

Document 2 key phrases:new nation;people;honored dead;great civil war;great battlefield;great task

Document 3 key phrases: Microsoft Cognitive Services;speech;developers;servicesavailable;applications;set ofAPIs

对比之前的Python分析结果,是不是感觉对文章内容的分析更准确一些。

接下来我们看文本分析服务的第二种功能,情绪分析:

同样只要一次调用就可以实现了

conn.request("POST", "/text/analytics/v2.0/sentiment?%s"% params, str(body), headers)

看下最后输出结果

看输出的分数,第一句话得分是0.97,所以判断为positive,第二句话得分0.01,所以判断为negative

Document:1 = positive

Document:2 = negative

{"documents":[{"score":0.97126096487045288,"id":"1"},{"score":0.013766974210739136,"id":"2"}],"errors":[]}

了解了文本分析服务是怎么调用和实现的,接下来学习一下语音的处理

等待创建完成后找到keys,在里面挑一个复制下来

把复制好的key复制到脚本中,语音服务后面还会用到

为了能正确的识别语音,首先安装一个Python包,SpeechRecognition

接下来准备一个语音文件,会下载到项目中。

然后我们调用API来识别这句话:

同样只需调用一次API就可以实现了

transcription = r.recognize_bing(audio,key=speechKey)

关于语音API的详细说明,可以在以下链接找到:

https://docs.microsoft.com/en-us/azure/cognitive-services/speech/concepts

返回结果是什么呢?

Here's what I heard:

"The rain in Spain stays mainly in the plain."

大家可以尝试构建自己的代码,将文本转换为语音,Sample 代码如下:

import IPython

import http.client, urllib.parse, json

from xml.etree import ElementTree

#get the input test

myText = input("What would you like tosay? : \n")

#The speech API

apiKey = speechKey

params = ""

headers ={"Ocp-Apim-Subscription-Key": apiKey}

path = "/sts/v1.0/issueToken"

#Use API key to reuqest an access token

conn =http.client.HTTPSConnection(AccessTokenHost)

conn.request("POST", path,params, headers)

response = conn.getresponse()

data = response.read()

conn.close()

accesstoken =data.decode("UTF-8")

#Set up a test request

body = ElementTree.Element('speak',version='1.0')

body.set('lang','en-us')

voice = ElementTree.SubElement(body,'voice')

voice.set('lang','en-us')

voice.set('gender','Male')

voice.set('name', 'Microsoft Server SpeechTest to Speech Voice (en-US, JessaRUS)')

voice.text = myText

headers = {"Content-type":"application/ssml+xml",

"X-Microsoft-OutputFormat":"riff-16khz-16bit-mono-pcm",

"Authorization": "Bearer" + accesstoken,

"X-Search-AppID": "07D3234E49CE426DAA29772419F436CA",

"User-Agent": "TTSForPython"}

#connect to server

conn.request("POST","/synthesize", ElementTree.tostring(body), headers)

response = conn.getresponse()

data = response.read()

conn.close()

#play the audio

IPython.display.Audio(data, autoplay=True)

还有一个非常简单就可以实现的服务,微软翻译服务,同其它几项服务一样,只需要创建一个文本翻译服务

等创建完成后,找到Keys,把key复制下来

接下来很简单就可以调用,这里是我准备的一段PHP代码,可以在Azure上创建一个Web APP 服务,将这个PHP页面部署到Web APP上,就拥有了一个自己的翻译服务:

已经完成的翻译服务Demo页面链接如下:

https://lyqtranslateweb.azurewebsites.net/index.php

">

From

English

Chinese

Japenese

French

To

English

Chinese

Japenese

French

Text:

// definevariables and set to empty values

$azure_key="服务的Key复制在这里";// !!! TODO: secret key here !!!

$fromLanguage=$_POST["from"];

$toLanguage=$_POST["to"];

$inputStr=$_POST["Transtext"];

functiongetToken($azure_key)

{

$url='https://api.cognitive.microsoft.com/sts/v1.0/issueToken';

$ch=curl_init();

$data_string=json_encode('');

curl_setopt($ch,CURLOPT_POSTFIELDS,$data_string);

curl_setopt($ch,CURLOPT_HTTPHEADER,array(

'Content-Type:application/json',

'Content-Length:'.strlen($data_string),

'Ocp-Apim-Subscription-Key:'.$azure_key

)

);

curl_setopt($ch, CURLOPT_URL,$url);

curl_setopt($ch,CURLOPT_HEADER,false);

curl_setopt($ch, CURLOPT_RETURNTRANSFER,TRUE);

$strResponse=curl_exec($ch);

curl_close($ch);

return$strResponse;

}

functioncurlRequest($url,$authHeader)

{

$ch=curl_init();

curl_setopt($ch, CURLOPT_URL,$url);

curl_setopt($ch, CURLOPT_HTTPHEADER,array($authHeader,"Content-Type:text/xml"));

curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);

curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,False);

$curlResponse=curl_exec($ch);

curl_close($ch);

return$curlResponse;

}

$accessToken=getToken($azure_key);

$params="text=".urlencode($inputStr) ."&to=".$toLanguage."&from=".$fromLanguage."&appId=Bearer+".$accessToken;

$translateUrl="http://api.microsofttranslator.com/v2/Http.svc/Translate?$params";

$curlResponse=curlRequest($translateUrl,$authHeader);

$xmlObj=simplexml_load_string($curlResponse);

foreach((array)$xmlObj[] as$val) {

$translatedStr=$val;

}

// Translationoutput:

echo"

From".$fromLanguage.": ".$inputStr."

";

echo"To ".$toLanguage.": ".$translatedStr."

";

echodate(r) ."

";

--我还是分割线----------------------------------------------------------------------

最后来学习一下怎么使用微软的自然语义理解服务,通常称之为LUIS的服务,首先从以下链接下载准备好的脚本:

https://lyqblog.blob.core.chinacloudapi.cn/lyqblog/LUIS.ipynb

按照提示完成创建,建议将区域放在东南亚(新加坡),这样访问速度较好。

完成创建Azure上的LUIS服务后,需要到LUIS自己的站点来创建专门的应用:

通过以下网址进入:

https://www.luis.ai

首先需要创建一个新的app

点击左侧的Intents. 选择 Create new intent

创建完成后,在出现的页面里输入需要训练的句子,这里输入了 “switch the lighton”,然后回车,可以看到输入的句子出现在utterances 下。

选中句子中的“light”, 选择“Create new entity”,这样就完成开灯这个动作的命令语句。

接下来同样创建一个名为 “Light Off”的Intents

同样,输入 “switch the light off”, 加入utterances

选择句子中的“light”,加入刚才创建的entity中

完成这几步后,可以训练模型了,在界面的右上角,可以看到 “Train”按钮,如果还没有训练过,将会是红色的,这里因为我已经train过了,所以看到的绿色。

由于只有2句话,所以很快就训练好了,我们测试一下LUIS的效果,随便输入一些句子,可以看到LUIS对它们的评分和归类

在Add Key里,选择我们所创建LUIS服务,就会生成应用的连接了。

接下来可以验证一下LUIS的应用,回到 notebooks.azure.com 中打开的脚本,将上面看到的app endpoint的连接复制到endpointUrl中,执行这个脚本,

脚本会要求输入一条命令:

如果输入的是开灯的指令,比如 turn on the light,就会看到LUIS应用给这条命令打的分数,Light On是0.52,None是0.09,Light Off是0.06,所以显示了开灯照片

如果输入的是关灯的指令,比如 off the light,LUIS应用给这条命令打的分数,Light On是0.04,None是0.06,Light Off是0.79,所以显示了关灯的照片

如果随便输入什么,就像下面所示,none的分数就会比较高。

更进一步,可以通过语音来控制,其实是将语音转换成文字,在进行识别,由于在Jupyter平台上安装Python的pyaudio模块一直报错,所以只能用wav文件来代替命令。

要注意的是,请将上面语音服务的key放到脚本中,这样才可以调用。

至于脚本执行的结果,大家可以自己试试看。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180825G1K2N000?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券