基于阿里云NLP基础服务的parseNLP_Go语言实现
本帖最后由 yangxiaodi 于 2022-1-6 00:39 编辑# parseNLP
## 前置知识
- ### Go语言时间格式化
- 方法一:使用`Format()`函数
- 用`Format()`函数,其字符串的格式是特定的`"2006-01-02 15:04:05"`,我们在使用的时候可以根据需求对其更改
- ```go
func getTime() {
t := time.Now()
// 2022-01-05T17:12:12Z
s := t.Format("2006-01-02T15:04:05Z")
fmt.Println(s)
}
```
- 方法二:使用格式化输出
- 用格式化输出,时间没有前导零
- ```go
func getTime() {
t := time.Now()
// 2022-1-5T17:11:45Z
s := fmt.Sprintf("%d-%d-%dT%d:%d:%dZ", t.Year(),
t.Month(), t.Day(), t.Hour(), t.Minute(), t.Second())
fmt.Println(s)
}
```
- ### Go语言获取UTC时间
- ```go
time.Now().UTC()
```
- ### Go语言生成唯一随机数,基于`go-basic/uuid`
- ```go
import "github.com/go-basic/uuid"
func getRandom() string {
uuid := uuid.New() // 生成一个uuid
for i := 0; i < len(uuid); i++ {
if uuid == '-' {
uuid = uuid[:i] + uuid
}
} // 删除uuid中的 '-'
return uuid
}
```
- ### HmacSHA1 的计算
- ```go
func HmacSHA1(key string, data string) []byte {
mac := hmac.New(sha1.New, []byte(key))
mac.Write([]byte(data))
return mac.Sum(nil)
}
```
## 项目代码
- ```go
package main
import (
"crypto/hmac"
"crypto/sha1"
"encoding/base64"
"encoding/json"
"fmt"
"github.com/go-basic/uuid"
"io/ioutil"
"net/http"
url2 "net/url"
"time"
)
const accessKeyId = "You_accessKeyId"
const accessKeySecret = "You_accessKeySecret"
// 2013-01-10T12:00:00Z
func getTime() string {
return time.Now().UTC().Format("2006-01-02T15:04:05Z")
}
// 唯一随机数
func getRandom() string {
uuid := uuid.New()
for i := 0; i < len(uuid); i++ {
if uuid == '-' {
uuid = uuid[:i] + uuid
}
}
return uuid
}
// HmacSHA1 的计算
func HmacSHA1(key string, data string) []byte {
mac := hmac.New(sha1.New, []byte(key))
mac.Write([]byte(data))
return mac.Sum(nil)
}
func parseNLP(text string) string {
url := "http://alinlp.cn-hangzhou.aliyuncs.com/"
param := url2.Values{}
param.Add("AccessKeyId", accessKeyId)
param.Add("Action", "GetSaChGeneral")
param.Add("Format", "json")
param.Add("ServiceCode", "alinlp")
param.Add("SignatureMethod", "HMAC-SHA1")
param.Add("SignatureNonce", getRandom())
param.Add("SignatureVersion", "1.0")
param.Add("Text", text)
param.Add("Timestamp", getTime())
param.Add("TokenizerId", "GENERAL_CHN")
param.Add("Version", "2020-06-29")
stringToSign := url2.QueryEscape(param.Encode())
stringToSign = "GET&%2F&" + stringToSign
secret := accessKeySecret + "&"
sig := base64.StdEncoding.EncodeToString(HmacSHA1(secret, stringToSign))
param.Add("Signature", sig)
u, err := url2.ParseRequestURI(url)
if err != nil {
panic(err)
}
u.RawQuery = param.Encode()
return u.String()
}
func getResult(url string) string {
resp, err := http.Get(url)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
panic(err)
}
m0 := struct {
Data string `json:"Data"`
}{}
m1 := struct {
Result struct {
Sentiment string `json:"sentiment"`
} `json:"result"`
}{}
err = json.Unmarshal([]byte(body), &m0)
if err != nil {
panic(err)
}
err = json.Unmarshal([]byte(m0.Data), &m1)
if err != nil {
panic(err)
}
return m1.Result.Sentiment
}
func main() {
text := "我不是不讨厌你,我是真的不想再见到你"
url := parseNLP(text)
result := getResult(url)
fmt.Println(text, ": 是一个", result, "的词汇")
}
```
## 结语
需要自行前往阿里云NLP平台获取`accessKeyId`和`accessKeySecret`
搞了个大概,核心都实现了,就不想再给他包装了,大家可以自己弄一下
学习了,谢谢分享 学习一下经验哈,谢谢分享 感谢楼主。。。 感谢楼主的热心分享{:1_921:} Go语言实现不错 有点意思,不过手头没有阿里云账号,到时候试试看转成AWS的
页:
[1]