目录

设置UpTensorFlow.js代码

康奈尔电影报价数据集

通用句子编码器

电影聊天机器人在行动

终点线

下一步是什么?


  • 下载项目文件-9.9 MB

TensorFlow+JavaScript。现在,最流行、最先进的AI框架支持地球上使用最广泛的编程语言因此,让我们在Web浏览器中通过深度学习使文本和NLP(自然语言处理)聊天机器人神奇地发生,使用TensorFlow.js通过WebGL加速GPU!

您是否想过看电影会是什么样子?玩场景并参与对话?让我们通过AI实现它!此处为上一篇文章链接。

在这个项目中,我们将建立一个聊天机器人,像电影一样说话,并适当地回应我们。为了使这项工作奏效,我们将使用一个名为通用句子编码器(USE)的TensorFlow库来找出对键入的消息的最佳响应。

设置UpTensorFlow.js代码

该项目在单个网页中运行。我们将包括TensorFlow.jsUSE,这是一个经过预先训练的基于转换器的语言处理模型。我们将添加几个输入元素,供用户在聊天机器人中键入消息并读取其响应。两个附加的实用函数,dotProductzipWith,从USE自述的例子,将帮助我们确定句子相似度。

<html><head><title>AI Chatbot from Movie Quotes: Chatbots in the Browser with TensorFlow.js</title><script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@2.0.0/dist/tf.min.js"></script><script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/universal-sentence-encoder"></script></head><body><h1 id="status">Movie Dialogue Bot</h1><p id="bot-text"></p><input id="question" type="text" /><button id="submit">Send</button><script>function setText( text ) {document.getElementById( "status" ).innerText = text;}// Calculate the dot product of two vector arrays.const dotProduct = (xs, ys) => {const sum = xs => xs ? xs.reduce((a, b) => a + b, 0) : undefined;return xs.length === ys.length ?sum(zipWith((a, b) => a * b, xs, ys)): undefined;}// zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]const zipWith =(f, xs, ys) => {const ny = ys.length;return (xs.length <= ny ? xs : xs.slice(0, ny)).map((x, i) => f(x, ys[i]));}(async () => {// Your Code Goes Here})();</script></body>
</html>

康奈尔电影报价数据集

我们的聊天机器人将学会使用康奈尔电影报价数据集中的电影报价进行响应。它包含超过20万条对话消息。为了获得更好的性能,我们将选择一个随机子集来响应每个消息。我们需要解析的两个文件是movie_lines.txtmovie_conversations.txt,以便我们可以创建引号和匹配响应的集合。

让我们遍历每个会话以填充问题/提示数组和匹配的响应数组。这两个文件都使用字符串" +++$+++ "作为分隔符,代码如下所示:

let movie_lines = await fetch( "web/movie_lines.txt" ).then( r => r.text() );let lines = {};
movie_lines.split( "\n" ).forEach( l => {let parts = l.split( " +++$+++ " );lines[ parts[ 0 ] ] = parts[ 4 ];
});let questions = [];
let responses = [];
let movie_conversations = await fetch( "web/movie_conversations.txt" ).then( r => r.text() );
movie_conversations.split( "\n" ).forEach( c => {let parts = c.split( " +++$+++ " );if( parts[ 3 ] ) {let phrases = parts[ 3 ].replace(/[^L0-9 ]/gi, "").split( " " ).filter( x => !!x ); // Split & remove empty linesfor( let i = 0; i < phrases.length - 1; i++ ) {questions.push( lines[ phrases[ i ] ] );responses.push( lines[ phrases[ i + 1 ] ] );}}
});

通用句子编码器

通用编码器句USE)是“[预先训练]模型编码文本转换成512维的嵌入。有关USE及其体系结构的完整说明,请参阅本系列前面的改进的情绪检测文章。

USE易于使用。在定义网络模型之前,让我们在代码中加载它,并使用其QnA双编码器,该编码器将为我们提供所有查询和所有答案的全句嵌入。这应该比单词嵌入更好。我们可以使用它来确定最合适的报价和回复。

// Load the universal sentence encoder
setText( "Loading USE..." );
let encoder = await use.load();
setText( "Loaded!" );
const model = await use.loadQnA();

电影聊天机器人在行动

因为这些句子嵌入已经将相似性编码到其向量中,所以我们不需要训练单独的模型。我们需要做的就是弄清楚哪个电影报价与用户提交的消息最相似,以便我们得到答复。这是通过使用QnA编码器完成的。将所有引号放入编码器可能需要很长时间,否则会使我们的计算机超负荷运行。因此,现在,我们将为每个聊天消息选择200个引号的随机子集来解决此问题。

document.getElementById( "submit" ).addEventListener( "click", async function( event ) {let text = document.getElementById( "question" ).value;document.getElementById( "question" ).value = "";// Run the calculation thingsconst numSamples = 200;let randomOffset = Math.floor( Math.random() * questions.length );const input = {queries: [ text ],responses: questions.slice( randomOffset, numSamples )};let embeddings = await model.embed( input );tf.tidy( () => {const embed_query = embeddings[ "queryEmbedding" ].arraySync();const embed_responses = embeddings[ "responseEmbedding" ].arraySync();let scores = [];embed_responses.forEach( response => {scores.push( dotProduct( embed_query[ 0 ], response ) );});let id = scores.indexOf( Math.max( ...scores ) );document.getElementById( "bot-text" ).innerText = responses[ randomOffset + id ];});embeddings.queryEmbedding.dispose();embeddings.responseEmbedding.dispose();
});

就像那样,您已经有了一个可以与您交谈的聊天机器人。

终点线

这是使此聊天机器人生效的代码:

<html><head><title>AI Chatbot from Movie Quotes: Chatbots in the Browser with TensorFlow.js</title><script src="https://cdn.jsdelivr.net/npm/@tensorflow/tfjs@2.0.0/dist/tf.min.js"></script><script src="https://cdn.jsdelivr.net/npm/@tensorflow-models/universal-sentence-encoder"></script></head><body><h1 id="status">Movie Dialogue Bot</h1><p id="bot-text"></p><input id="question" type="text" /><button id="submit">Send</button><script>function setText( text ) {document.getElementById( "status" ).innerText = text;}// Calculate the dot product of two vector arrays.const dotProduct = (xs, ys) => {const sum = xs => xs ? xs.reduce((a, b) => a + b, 0) : undefined;return xs.length === ys.length ?sum(zipWith((a, b) => a * b, xs, ys)): undefined;}// zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]const zipWith =(f, xs, ys) => {const ny = ys.length;return (xs.length <= ny ? xs : xs.slice(0, ny)).map((x, i) => f(x, ys[i]));}(async () => {let movie_lines = await fetch( "web/movie_lines.txt" ).then( r => r.text() );let lines = {};movie_lines.split( "\n" ).forEach( l => {let parts = l.split( " +++$+++ " );lines[ parts[ 0 ] ] = parts[ 4 ];});let questions = [];let responses = [];let movie_conversations = await fetch( "web/movie_conversations.txt" ).then( r => r.text() );movie_conversations.split( "\n" ).forEach( c => {let parts = c.split( " +++$+++ " );if( parts[ 3 ] ) {let phrases = parts[ 3 ].replace(/[^L0-9 ]/gi, "").split( " " ).filter( x => !!x ); // Split & remove empty linesfor( let i = 0; i < phrases.length - 1; i++ ) {questions.push( lines[ phrases[ i ] ] );responses.push( lines[ phrases[ i + 1 ] ] );}}});// Load the universal sentence encodersetText( "Loading USE..." );let encoder = await use.load();setText( "Loaded!" );const model = await use.loadQnA();document.getElementById( "question" ).addEventListener( "keyup", function( event ) {// Number 13 is the "Enter" key on the keyboardif( event.keyCode === 13 ) {// Cancel the default action, if neededevent.preventDefault();// Trigger the button element with a clickdocument.getElementById( "submit" ).click();}});document.getElementById( "submit" ).addEventListener( "click", async function( event ) {let text = document.getElementById( "question" ).value;document.getElementById( "question" ).value = "";// Run the calculation thingsconst numSamples = 200;let randomOffset = Math.floor( Math.random() * questions.length );const input = {queries: [ text ],responses: questions.slice( randomOffset, numSamples )};let embeddings = await model.embed( input );tf.tidy( () => {const embed_query = embeddings[ "queryEmbedding" ].arraySync();const embed_responses = embeddings[ "responseEmbedding" ].arraySync();let scores = [];embed_responses.forEach( response => {scores.push( dotProduct( embed_query[ 0 ], response ) );});let id = scores.indexOf( Math.max( ...scores ) );document.getElementById( "bot-text" ).innerText = responses[ randomOffset + id ];});embeddings.queryEmbedding.dispose();embeddings.responseEmbedding.dispose();});})();</script></body>
</html>

下一步是什么?

在本文中,我们建立了一个聊天机器人,可以与某人进行对话。但是有什么比对话更好的呢?那...独白呢?

在本系列的最后一篇文章中,我们将使用TensorFlow.js在浏览器中构建一个莎士比亚独白生成器。

https://www.codeproject.com/Articles/5282694/AI-Chatbots-With-TensorFlow-js-Creating-a-Movie-Di

使用TensorFlow.js的AI聊天机器人五:创建电影对话聊天机器人相关推荐

  1. 使用TensorFlow.js的AI聊天机器人四:改进的Trivia Expert

    目录 使用通用语句编码器设置TensorFlow.js代码 TriviaQA数据集 通用句子编码器 聊天机器人在行动 终点线 下一步是什么? 下载项目代码-9.9 MB TensorFlow+Java ...

  2. 使用TensorFlow.js的AI聊天机器人三:改进了文本中的情感检测

    目录 使用通用语句编码器设置TensorFlow.js代码 GoEmotion数据集 通用句子编码器 训练AI模型 让我们发现情绪 终点线 下一步是什么? 下载项目代码-9.9 MB TensorFl ...

  3. 使用TensorFlow.js进行AI在网络摄像头中翻译手势和手语

    目录 起点 检测手势 其他手势和手语 技术脚注 终点线 下一步是什么? TensorFlow + JavaScript.现在,最流行,最先进的AI框架支持地球上使用最广泛的编程语言,因此,让我们在我们 ...

  4. 使用TensorFlow.js的AI聊天机器人六:生成莎士比亚独白

    目录 设置TensorFlow.js代码 小莎士比亚数据集 通用句子编码器 莎士比亚独白在行动 终点线 总结 下载项目代码-9.9 MB TensorFlow+JavaScript.现在,最流行.最先 ...

  5. 使用TensorFlow.js的AI聊天机器人二:训练Trivia Expert AI

    目录 设置TensorFlow.js代码 TriviaQA数据集 单词嵌入和标记 训练AI模型 聊天机器人(Trivia Chatbot)在行动 终点线 下一步是什么? 下载项目文件-9.9 MB T ...

  6. 使用TensorFlow.js的AI聊天机器人一:检测文本中的情绪

    目录 设置TensorFlow.js代码 GoEmotion数据集 言语包 训练AI模型 检测文本中的情绪 终点线 下一步是什么? 下载项目代码-9.9 MB TensorFlow + JavaScr ...

  7. 入门——使用TensorFlow.js进行AI图像分类

    目录 使用TensorFlow.js的好处 它可以在任何地方运行. 您将获得良好的性能. 您可以加载现有模型. 您可以重新训练导入的模型. 您可以直接在浏览器中创建模型. 预测狗的品种 导入模型和图像 ...

  8. 使用TensorFlow.js进行人脸触摸检测第2部分:使用BodyPix

    目录 起点 设置BodyPix 检测脸部触摸 技术脚注 终点线 下一步是什么?我们可以使用TensorFlow.js做更多的事情吗? 下载TensorFlowJS示例-6.1 MB TensorFlo ...

  9. 绒毛动物探测器:通过TensorFlow.js中的迁移学习识别浏览器中的自定义对象

    目录 起点 MobileNet v1体系结构上的迁移学习 修改模型 训练新模式 运行物体识别 终点线 下一步是什么?我们可以检测到脸部吗? 下载TensorFlowJS-Examples-master ...

最新文章

  1. 【原】东拼西凑PBR(1):PBR基础
  2. Tensorflow【实战Google深度学习框架】—使用 TensorFlow 实现模型
  3. javaweb回顾第十二篇监听器
  4. LOJ.2718.[NOI2018]归程(Kruskal重构树 倍增)
  5. 甲骨文Java 14来啦!
  6. 【程序设计】哨兵控制器
  7. go mysql_build-web-application-with-golang
  8. ibatis mybatis sql语句配置 符号不兼容 大于号 小于号
  9. 个性化hexo博客,添加评论系统,分享,友情链接功能
  10. 利用TTL转USB串口在两台PC机间进行文件传输
  11. idea部署iBase4J
  12. 360大战QQ演义之一:一场腾讯可能连底裤都输掉的战争!
  13. 安卓手机格式化怎么弄_一加6/7/7Pro怎么从氢OS安卓10降级安卓9系统-完美降级教程...
  14. 64位系统装32位计算机,32位的cpu能不能装64位系统|cpu是32位的可以装64位系统吗...
  15. Padavan各源码融合教程
  16. 虚拟机复制镜像操作方法
  17. 线上支付对接(支付宝篇)
  18. 前端xlsx插件简单说明
  19. java 爬楼梯算法_动态规划-爬楼梯问题java实现
  20. PPT免费下载网页汇总

热门文章

  1. 请写出至少五个块级元素_Java 面试题(五)
  2. centos samba 看不到共享目录_samba共享服务
  3. 设计师必收藏!!!让你灵感迸发的配色网站
  4. 护肤品APP界面设计模板,可以临摹的UI好素材
  5. php的冒泡排序的意思,冒泡排序是什么意思
  6. 免责协议怎么写_员工辞职时,HR得让他这样写离职申请!
  7. 关于java中 get提交方式的乱码问题。
  8. 2021年7月文章精选
  9. 虚拟化顶级技术会议KVM Forum演讲分享 | 移动云KVM共享云盘技术实践
  10. 3GPP Releases