Rasa NLU 聊天机器人自然语言理解

Rasa NLU

RasaCore 是一个自然语言理解框架。https://nlu.rasa.ai,下文将对基本流程及使用方式以及部分原理进行描述,本文来自http://lvchongstudio.top/

Rasa Nlu 工作原理

智能机器人是人工智能一个重大分支,只能机器人包括几大模块:自然语言识别(ASR)、自然语言处理(NLU)、对话流程(DM)、自然语言生成(TTS),目前自己的工作涉及的方面主要是 NLU 与 DM,本文主要写一下NLU,即Rasa NLU。关于对话流程见另一篇博文。

具体流程:

  • 编写一个文件 intent.md 用来存放语料(需要根据意图,进行语料扩展)
  • 接下来就是用上面的个文件,训练出 Rasa NLU 的模型。
  • 最后,这就到最后了,使用Rasa NLU 的模型就可以开启服务。
  • 哦,这才是最后,现在就可以测试问题具体的识别准确率了,以及参数的提取准确度。

看完自己写的工作原理,发现真的很简练,哈哈,根本不能上手使用。总要写的完全一些,深入一些的。

Rasa NLU 项目使用方法

github 上面搜索 Rasa_NLU,具体安装方式参见项目介绍。建议将整个项目源码拉下来,在项目的根目录运行

python setup.py install

进行安装。Rasa Nlu 同理。可以先根据项目里自带的example进行训练运行。具体运行方式见项目及Demo中的Makefile。

Rasa NLU 深入了解

NLU 的难点主要在语料的准备, 接下来就自己了解到的经验进行一一记录。

  • 每个意图要有关键字,意图中的每句都要有关键字。
  • 每个关键字要扩充20左右的语句。
  • 所有语句之间要够发散、离散(即除关键字外尽量不用重复的词语)。
  • 除关键字之外,所有的词字,在每个意图中重复率要低、要低,最好不重复。
  • 整个文件中,除关键字之外,所有的词字,重复率要低、要低,最好不重复。
  • 上面两条造成的现象就是,你我他啊是的吗之类的词都要去掉(语义可以稍微不通顺,可接受)。
  • 句式相同,参数不同的意图进行合并,通过后期校验参数进行分辨。

意图识别的准确度跟两方面有关

  • 关键字在当前意图中出现的频率
  • 关键字在整个文件中出现的频率

有什么错误欢迎指出,其他的具体问题也可以在评论中留言。

Rasa Core 聊天机器人对话管理

Rasa Core

RasaCore 是一个用来处理对话流程的框架。https://core.rasa.ai/,下文将对基本流程及使用方式以及部分原理进行描述,本文来自http://lvchongstudio.top/

Rasa Core 工作原理

智能机器人是人工智能一个重大分支,只能机器人包括几大模块:自然语言识别(ASR)、自然语言处理(NLU)、对话管理(DM)、自然语言生成(TTS),目前自己的工作涉及的方面主要是 NLU 与 DM,本文主要写一下DM,即Rasa Core,关于 NLU 在另一篇博客记录。

具体流程:

  • 从Rasa Nlu或其他自然语言理解框架,获取训练好的意图识别模型。(这个主要是用来识别用户要问什么,即细分出用户的当前一句话的意图)
  • 编写一个文件 domain.yml 用来放置所有的意图名字、 所有用来回答的意图的名字 和 每个回答意图的回答语句(这个主要是用来声明这个项目支持用户问哪类问题,声明能做出哪种回答, 以及部分不涉及逻辑,可以直接回答的问题)
  • 编写另一个文件 stories.md 见名知意,这里用来存放剧本。(以简单的格式将上一个文件的问题与回答建立关系形成各种剧本)
  • 接下来就是用上面的两个文件,训练出 Rasa Core 的模型。
  • 最后,这就到最后了,使用Rasa Nlu 的模型、 Rasa Core 的模型,这两个模型就可以开启服务。
  • 哦,这才是最后,现在就可以根据剧本做一些问答了。

看完自己写的工作原理,发现真的很简练,哈哈,根本不能上手使用。总要写的完全一些,深入一些的。

Rasa Core 项目使用方法

github 上面搜索 Rasa_Core,具体安装方式参见项目介绍。建议将整个项目源码拉下来,在项目的根目录运行

python setup.py install

进行安装。Rasa Nlu 同理。可以先根据项目里自带的example进行训练运行。具体运行方式见项目及Demo中的Makefile。

Rasa Core 深入了解

  • NLU 问题中提取出的参数可以在回答中以类似如下例句形式出现。(“我没听过{news},最近没有了解过新闻。”)
  • 涉及到逻辑的回答可以在代码中很简单的实现,实现方式见官方文档。
  • 以上两种为回答的形式,并支持回复多媒体(即音视频、图片、gif等),支持同时回复多条。

有什么错误欢迎指出,其他的具体问题也可以在评论中留言。

Linux项目使用笔记

常用命令记录
scp

ssh -i

sudo su -

cd

ll

ls

cp -i fromFile toFile

nohup ….. &

tail -f

fg

ctrl + z

bg

~/.bashrc

resource ~/.bashrc

cat file

tac file

vim file

ps -au

netstat -apn

netstat -apn | grep 8080

kill 31434

mkdir

rm -f file

exit

Vim 编辑器使用笔记

Vim 是 UNIX 文本编辑器 Vi 的加强版本

常用命令记录

k 上 ↑

j 下 ↓

h 左 ←

l 右 →

v 选中

y 复制

p 粘贴

:q 退出

:q! 退出不保存

:wq 保存退出

ZZ 保存退出

set number 设置显示行数

/ 搜索

:h 帮助

w 光标至下一个单词

e 光标至单词结尾

d 删除

b 上一个单词

u 撤销

i 插入

a 追加

q r t o
s f g
z x c n m

以上内容为自己笔记

以下内容转自http://blog.sina.com.cn/s/blog_4d4afb6d0101cydc.html

Vim 替换命令汇总
vi/vim 中可以使用 :s 命令来替换字符串。以前只会使用一种格式来全文替换,今天发现该命令有很多种写法(vi 真是强大啊,还有很多需要学习),记录几种在此,方便以后查询。
  vi/vim 中可以使用 :s 命令来替换字符串。以前只会使用一种格式来全文替换,今天发现该命令有很多种写法(vi 真是强大啊,还有很多需要学习),记录几种在此,方便以后查询。
  :s/vivian/sky/ 替换当前行第一个 vivian 为 sky
  :s/vivian/sky/g 替换当前行所有 vivian 为 sky
  :n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
  :n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
  n 为数字,若 n 为 .,表示从当前行开始到最后一行
  :%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
  :%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
  可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
  :s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/
  :%s+/oradata/apras/+/user01/apras1+ (使用+ 来 替换 / ): /oradata/apras/替换成/user01/apras1/
   *
  1.:s/vivian/sky/ 替换当前行第一个 vivian 为 sky
  :s/vivian/sky/g 替换当前行所有 vivian 为 sky
  2. :n,$s/vivian/sky/ 替换第 n 行开始到最后一行中每一行的第一个 vivian 为 sky
  :n,$s/vivian/sky/g 替换第 n 行开始到最后一行中每一行所有 vivian 为 sky
  (n 为数字,若 n 为 .,表示从当前行开始到最后一行)
  3. :%s/vivian/sky/(等同于 :g/vivian/s//sky/) 替换每一行的第一个 vivian 为 sky
  :%s/vivian/sky/g(等同于 :g/vivian/s//sky/g) 替换每一行中所有 vivian 为 sky
  4. 可以使用 # 作为分隔符,此时中间出现的 / 不会作为分隔符
  :s#vivian/#sky/# 替换当前行第一个 vivian/ 为 sky/
  5. 删除文本中的^M
  问题描述:对于换行,window下用回车换行(0A0D)来表示,linux下是回车(0A)来表示。这样,将window上的文件拷到unix上用时,总会有个^M.请写个用在unix下的过滤windows文件的换行符(0D)的shell或c程序。
  · 使用命令:cat filename1 | tr -d “^V^M” > newfile;
  · 使用命令:sed -e “s/^V^M//” filename > outputfilename。需要注意的是在1、2两种方法中,^V和^M指的是Ctrl+V和Ctrl+M。你必须要手工进行输入,而不是粘贴。
  · 在vi中处理:首先使用vi打开文件,然后按ESC键,接着输入命令:%s/^V^M//。
  · :%s/^M$//g
  如果上述方法无用,则正确的解决办法是:
  · tr -d “\r” < src >dest
  · tr -d “\015” dest
  · strings A>B
  6. 其它
  利用 :s 命令可以实现字符串的替换。具体的用法包括:
  :s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1
  :s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1
  :.,$ s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1
  :1,$ s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串 str1
  :g/str1/s//str2/g 功能同上
  从上述替换命令可以看到:g 放在命令末尾,表示对搜索字符串的每次出现进行替换;不加 g,表示只对搜索
  字符串的首次出现进行替换;g 放在命令开头,表示对正文中所有包含搜索字符串的行进行替换操作。

Ubuntu 出现黑屏问题,只有鼠标光标可移动

查了许多资料,需要重新装一下桌面。

1,在上面图片中进入系统后按ctrl+alt+f1(f1至f6都可以进入命令行,f7是退出命令行),然后输入账号和密码。

2,输入命令:sudo apt-get install ubuntu-desktop,然后输入密码。

3,如果出现提示dpkg出现问题,需要运行:sudo dpkg –configure -a命令修复,修复完毕后继续输入第二步的命令安装ubuntu桌面。

4,安装完成后运行:reboot (自己操作的时候reboot没用,根据提示信息输入 systemctl reboot -i 即可)

经过以上几步,我的问题解决了。

转自:http://www.linuxdiyf.com/linux/24839.html

Gradle学习 —— 自定义Plugin

在Plugin中我们可以想Project中加入新的Task,定义configuration和property等。三种方法如下:

#(一)在build.gradle文件中直接定义Plugin

#(二)在当前工程中定义plugin

#(三)在单独项目中创建plugin

设计模式 之 单例 模式

设计模式是开发中很重要的一种思想,今天记录一下单例模式,备忘,哈哈。

first 懒汉式 + 双重校验锁 + 禁止指令重排序优化

public class SingletonOne {

// volatile 禁止指令重排序优化
private static volatile SingletonOne instance = null;

private SingletonOne() {

}

// synchronized 修饰的同步方法比一般的方法要慢很多。所以此处使用双重校验锁。
public static SingletonOne getInstance() {
    if (null == instance) {
        synchronized(SingletonOne.class) {
            if (null == instance) {
                instance = new SingletonOne();
            }
        }
    }
    return instance;
}}

second 饿汉式 不推荐

public class SingletonTwo {

private static SingletonTwo instance = new SingletonTwo();

private SingletonTwo() {

}

public static SingletonTwo getInstance() {
    return instance;
}}

third 静态内部类加载

public class SingletonThree {

private SingletonThree() {

}

private static class SingletonHolder {
    public static SingletonThree instance = new  SingletonThree();
}

public static SingletonThree getInstance() {
    return SingletonHolder.instance;
}}

fourth 枚举 目前最为安全的实现单例的方法是通过内部静态enum的方法来实现,因为JVM会保证enum不能被反射并且构造器方法只执行一次。

public class SingletonFour {
private SingletonFour() {

}

private static enum Singleton{
    INSTANCE;

    private SingletonFour instance;

    private Singleton() {
        instance = new SingletonFour();
    }

    public SingletonFour getInstance() {
        return instance;
    }

}

public static SingletonFour getInstance() {
    return Singleton.INSTANCE.instance;
}}



上面提到的三种实现单例的方式都有共同的缺点:
1.需要额外的工作来实现序列化,否则每次反序列化一个序列化的对象时都会创建一个新的实例。
2.可以使用反射强行调用私有构造器(如果要避免这种情况,可以修改构造器,让它在创建第二个实例的时候抛异常)。

而枚举类很好的解决了这两个问题,使用枚举除了线程安全和防止反射调用构造器之外,还提供了自动序列化机制,
防止反序列化的时候创建新的对象。因此,《Effective Java》作者推荐使用的方法。不过,在实际工作中,很少看见有人这么写。

Java中的 " | ^ & " 三个运算符

今天面试的时候被问到了一个算法题,题目如下:

在一个所有数字都出现偶数次的数组中,去掉其中一个数字,如何找出这个数字。

这道题就用到了运算符。

下面先简单介绍一下三个运算符,如下代码:

private static int a = 5;        // 0101
private static int b = 11;        // 1011

private static void testAB() {
    System.out.println(a|b);    // 1111        15
    System.out.println(a^b);    // 1110        14
    System.out.println(a&b);    // 0001        1
}

进行按位运算,算是复习了一下知识。

然后特殊的记录一下“ ^ ”的知识点:

自己与自己异或为0;

具有传递性;

00->0;

01->1;

11->0;

##现在解答一下上面提到的面试题:

private static int result = 0;
private static int[] arrs = {1,2,1,2,6,7,8,4,121,4,5,6,7,8,5};

public static void main(String[] args) {
    getResult();
}

private static void getResult() {
    for(int i = 0; i < arrs.length; i ++) {
        result ^= arrs[i];
    }
    System.out.println(result);
}

就是只用了异或运算。

最后贴出本章的整体代码

public class TestAlgorithm {
private static int result = 0;
private static int[] arrs = {1,2,1,2,6,7,8,4,121,4,5,6,7,8,5};

public static void main(String[] args) {
    getResult();
    testAB();
}

private static void getResult() {
    for(int i = 0; i < arrs.length; i ++) {
        result ^= arrs[i];
    }
    System.out.println(result);
}


private static int a = 5;        // 0101
private static int b = 11;        // 1011

private static void testAB() {
    System.out.println(a|b);    // 1111        15
    System.out.println(a^b);    // 1110        14
    System.out.println(a&b);    // 0001        1
}}