上一次学习了如何用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放到脚本中,这样才可以调用。
至于脚本执行的结果,大家可以自己试试看。
领取专属 10元无门槛券
私享最新 技术干货