yangxiaodi 发表于 2022-1-6 00:35

基于阿里云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`
搞了个大概,核心都实现了,就不想再给他包装了,大家可以自己弄一下

PLFJOB 发表于 2022-1-6 08:28

学习了,谢谢分享

slbcmgn 发表于 2022-1-6 09:00

学习一下经验哈,谢谢分享

liu流年 发表于 2022-1-6 10:09

感谢楼主。。。

huyifan311 发表于 2022-1-6 13:24

感谢楼主的热心分享{:1_921:}

hiodis 发表于 2022-1-6 17:38

Go语言实现不错

sordar 发表于 2022-1-6 20:30

有点意思,不过手头没有阿里云账号,到时候试试看转成AWS的
页: [1]
查看完整版本: 基于阿里云NLP基础服务的parseNLP_Go语言实现