当前位置:   article > 正文

基于vader的Unity调PY脚本的文本情绪评估系统

基于vader的Unity调PY脚本的文本情绪评估系统

目录

前言

一、VADER介绍

二、环境配置

三、PY的文本情绪评估脚本

四,Unity调用Py脚本

五,测试

总结


前言

关于自己给自己桌宠接GPT后想反推出来文本的情绪状态方案


一、VADER介绍

vader —— 一种基于规则的英文文本情感识别方法_vader算法-CSDN博客

VADER是一种基于词库和语法规则来进行文本情感分析的方法,目前除了基本的情感词语分析外,已能对表情符号(utf-8)等分析进行支持。


二、环境配置

创建新Unity项目

创建StreamingAssets文件夹

创建脚本文件夹

#如果有用过Odin插件也可以先导入//方便测试用,没有也不要紧

Python导入包vaderSentiment

Python导入包translate

  1. pip3 install vaderSentiment
  2. pip3 install translate

三、PY的文本情绪评估脚本

转摘:基于词库和语法规则的情感识别方法——vader_vader 情感分析的情感得分范围是多少-CSDN博客

代码如下(示例):

  1. from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
  2. import re
  3. import sys
  4. from translate import Translator
  5. url_google = 'http://translate.google.cn'
  6. reg_text = re.compile(r'(?<=TRANSLATED_TEXT=).*?;')
  7. user_agent = r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) ' \
  8. r'Chrome/44.0.2403.157 Safari/537.36'
  9. def translate_cn_api(content):
  10. translator= Translator(to_lang="zh")
  11. translation = translator.translate(content)
  12. return translation
  13. def translate_en_api(content):
  14. translator= Translator(to_lang="en",from_lang='zh')
  15. translation = translator.translate(content)
  16. return translation
  17. def print_sentiment_scores(tweets):
  18. analyser = SentimentIntensityAnalyzer()
  19. vadersenti = analyser.polarity_scores(tweets)
  20. return vadersenti['compound']
  21. def main(question):
  22. #英文翻译
  23. questionEn = translate_en_api(question)
  24. print("问题英文版:", questionEn)
  25. #情感评分
  26. result = print_sentiment_scores(questionEn)
  27. #将情感评分-1至1的区间转换到0-1的区间。
  28. X_scale = (1 + result) / 2.0
  29. print("情感评分:", X_scale)
  30. if __name__ == '__main__':
  31. question=input("请输入你的问题:")
  32. print("问题中文版:", question)
  33. main(question)

在PyCharm里面右键运行脚本测试,如下图测试成功


四,Unity调用Py脚本

转摘:

Unity直接调用Python脚本_unity 导出工程后 执行py脚本-CSDN博客

代码如下(示例):

  1. using System.Collections;
  2. using System;
  3. using System.Collections.Generic;
  4. using UnityEngine;
  5. using System.Diagnostics; //需要添加这个名词空间,调用DataReceivedEventArg
  6. using System.IO;
  7. using UnityEditor.Scripting.Python;
  8. using UnityEditor;
  9. using Sirenix.OdinInspector;
  10. public class LoadPython : MonoBehaviour
  11. {
  12. string sArguments = @"UnityLoad.py";//这里是python的文件名字
  13. //这个是基于Odin插件的,如果没用过就用UI的InputField的函数调用也可以
  14. [Button]
  15. public void Test(string str)
  16. {
  17. string[] strs = new string[] { str };
  18. UnityEngine.Debug.Log("检测文本"+ str);
  19. UnityEngine.Debug.Log("调用PY脚本");//e.Data);
  20. RunPython(Path.Combine(Application.streamingAssetsPath, sArguments), strs);
  21. }
  22. public Process process;
  23. /// <summary>
  24. ///
  25. /// </summary>
  26. /// <param name="path">python代码文件路径</param>
  27. /// <param name="argvs">需要传递的参数数组</param>
  28. private void RunPython(string path, string[] argvs)
  29. {
  30. if (process != null)
  31. {
  32. process.Close();
  33. //process.Kill();
  34. process = null;
  35. }
  36. string arguments = path;
  37. if (argvs != null)
  38. {
  39. foreach (string item in argvs)
  40. {
  41. arguments += (" " + item);
  42. }
  43. }
  44. else
  45. {
  46. //return;
  47. }
  48. UnityEngine.Debug.Log(arguments);
  49. if (process == null)
  50. process = new Process();
  51. process.StartInfo.FileName = @"F:\OTK\Anaconda\python.exe";//Python代码解释器路径,写自己的路径
  52. process.StartInfo.UseShellExecute = false;//在python中使用sys.argv[]设置为true
  53. process.StartInfo.Arguments = arguments;//python脚本文件路径+参数(参数用空格隔开)
  54. process.StartInfo.RedirectStandardError = true;
  55. process.StartInfo.RedirectStandardInput = true;
  56. process.StartInfo.RedirectStandardOutput = true;
  57. process.StartInfo.CreateNoWindow = true;//是否创建窗口
  58. process.Start();
  59. process.BeginOutputReadLine();
  60. process.OutputDataReceived += new DataReceivedEventHandler(GetData);
  61. process.WaitForExit();
  62. }
  63. /// <summary>
  64. /// 用于接收python返回的数据
  65. /// </summary>
  66. /// <param name="sender"></param>
  67. /// <param name="e"></param>
  68. private void GetData(object sender, DataReceivedEventArgs e)
  69. {
  70. if (string.IsNullOrEmpty(e.Data) == false)
  71. {
  72. UnityEngine.Debug.Log("情感评分:" + e.Data);
  73. }
  74. }
  75. private void OnDestroy()
  76. {
  77. if (process != null)
  78. process.Close();
  79. }
  80. }

修改PY的脚本,让传入的参数为sys.argv[1],我们从Unity传入用C#传入参数

  1. import sys
  2. question = sys.argv[1]
  3. from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
  4. import re
  5. from translate import Translator
  6. url_google = 'http://translate.google.cn'
  7. reg_text = re.compile(r'(?<=TRANSLATED_TEXT=).*?;')
  8. user_agent = r'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) ' \
  9. r'Chrome/44.0.2403.157 Safari/537.36'
  10. def translate_cn_api(content):
  11. translator = Translator(to_lang="zh")
  12. translation = translator.translate(content)
  13. return translation
  14. def translate_en_api(content):
  15. translator = Translator(to_lang="en", from_lang='zh')
  16. translation = translator.translate(content)
  17. return translation
  18. def print_sentiment_scores(tweets):
  19. analyser = SentimentIntensityAnalyzer()
  20. vadersenti = analyser.polarity_scores(tweets)
  21. return vadersenti['compound']
  22. def main(question):
  23. #print("startMain")
  24. # 英文翻译
  25. questionEn = translate_en_api(question)
  26. #print("问题英文版:", questionEn)
  27. # 情感评分
  28. result = print_sentiment_scores(questionEn)
  29. # 将情感评分-1至1的区间转换到0-1的区间。
  30. X_scale = (1 + result) / 2.0
  31. print(X_scale)
  32. # if __name__ == '__main__':
  33. # question = input("请输入你的问题:")
  34. # print("问题中文版:", question)
  35. main(question)

五,测试

Unity中创建新GameObject挂上脚本,测试函数

总结

转摘:VADER:社交网络文本情感分析库-CSDN博客

VADER会对文本分析,得到的结果是一个字典信息,包含

  • pos,文本中正面信息得分

  • neg,文本中负面信息得分

  • neu,文本中中性信息得分

  • compound,文本综合情感得分

所以我们可以利用返回的参数做一些简单的情绪状态机

PS:现脚本是用C#调用Python解析器跑Py脚本的,所以需要Python解析器的环境,个人没怎么学过PY,好像要完全支持本地需要把PY打包成EXE,然后EXE传参数。(好像PY打包挺麻烦的,就不在这里多解释了)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/105448
推荐阅读
相关标签
  

闽ICP备14008679号