对话系统的评价指标

对于某一轮对话而言,可以使用响应的适当性、流畅度、相关性;对于多轮对话而言,我们更关注流畅性、对话深度、多样性、一致连贯性等指标;而对于整个对话系统,我们则希望他可以涵盖更多的话题、回复真实可信等等。

一.词重叠评价指标

该指标认为回答应该和真实回答之间存在大量的词重叠

1.BLEU

candidate(Predicted):机器生成的结果;reference(Gold Standard):参考句,类似于参考答案,可以多句;

Step 1:Modified n-gram Precision计算(也即Pn

当n=1/2/3/4时的precision;首先统计候选译文里每个词(n-gram)出现的次数,然后统计每个词(n-gram)在参考译文中出现的次数,Max表示3个参考译文中的最大值,Min表示候选译文和Max两个的最小值。

以unigram为例,bigram、trigram、4-gram相同:

Step 2:Brevity Penalty 计算

if c > r: return 1 else: return math.exp(1 – r / c) c:候选句的长度;r:参考句的最大长度

Step 3:Pn * Bp
2.ROUGE

①ROUGE-N

②ROUGE-L

③ROUGE-W

④ROUGE-S

3.METEOR

二、词向量评价指标

词向量则是通过Word2Vec、Sent2Vec等方法将句子转换为向量表示,这样一个句子就被映射到一个低维空间,句向量在一定程度上表征了其含义,在通过余弦相似度等方法就可以计算两个句子之间的相似程度。

1.Greedy Matching

2.Embedding Average

3.Vector Extrema

跟上面的方法类似,也是先通过词向量计算出句向量,在使用句向量之间的余弦相似度表示二者的相似度。不过句向量的计算方法略有不同,这里采用向量极值法进行计算。

三、perplexity困惑度

四、人工指标

ref:

docker常见命令

1.docker version
显示 Docker 版本信息

2.docker info
显示 Docker 系统信息,包括镜像和容器数

3.docker search
docker search [options "o">] term
docker search -s  django
从 Docker Hub 中搜索符合条件的镜像
--automated 只列出 automated build
类型的镜像;
--no-trunc 可显示完整的镜像描述;
-s 40 列出收藏数不小于40的镜像。

4.docker pull
docker pull [-a "o">] [user/ "o">]name[:tag "o">]
docker pull laozhu/telescope:latest
从 Docker Hub 中拉取或者更新指定镜像。
-a 拉取所有 tagged 镜像 

5.docker images
docker images [options "o">] [name]
列出本地所有镜像。其中 [name] 对镜像名称进行关键词查询。
-a 列出所有镜像(含过程镜像);
-f 过滤镜像,如: -f ['dangling=true'] 只列出满足
dangling=true 条件的镜像;
--no-trunc 可显示完整的镜像ID;
-q 仅列出镜像ID。
--tree 以树状结构列出镜像的所有提交历史。

6.docker ps
列出所有运行中容器
-a 列出所有容器(含沉睡镜像);
--before="nginx" 列出在某一容器之前创建的容器,接受容器名称和ID作为参数;
--since="nginx" 列出在某一容器之后创建的容器,接受容器名称和ID作为参数;
-f [exited=<int>] 列出满足
exited=<int> 条件的容器;
-l 仅列出最新创建的一个容器;
--no-trunc 显示完整的容器ID;
-n=4 列出最近创建的4个容器;
-q 仅列出容器ID;
-s 显示容器大小。

7.docker rmi
docker rmi [options "o">] <image>  "o">[image...]
docker rmi nginx:latest postgres:latest python:latest
从本地移除一个或多个指定的镜像
-f 强行移除该镜像,即使其正被使用;
--no-prune 不移除该镜像的过程镜像,默认移除。

8.docker rm
docker rm [options "o">] <container>  "o">[container...]
docker rm nginx-01 nginx-02 db-01 db-02
sudo docker rm -l /webapp/redis
-f 强行移除该容器,即使其正在运行;
-l 移除容器间的网络连接,而非容器本身;
-v 移除与容器关联的空间。

9.docker start|stop|restart
docker start|stop "p">|restart [options "o">] <container>  "o">[container...]
启动、停止和重启一个或多个指定容器。
-a 待完成
-i 启动一个容器并进入交互模式;
-t 10 停止或者重启容器的超时时间(秒),超时后系统将杀死进程。

10.docker inspect
docker instpect nginx:latest
docker inspect nginx-container
检查镜像或者容器的参数,默认返回 JSON 格式。
-f 指定返回值的模板文件。

11.进入容器
sudo docker exec -it 775c7c9ee1e1 /bin/bash 退出容器后容器不会停止
docker attach 44fc0f0582d9 多个窗口同时使用该命令进入该容器时,所有的窗口都会同步显示

ref:docker常用命令

网络延迟时间 Dijkstra

743. 网络延迟时间

有 N 个网络节点,标记为 1 到 N。

给定一个列表 times,表示信号经过有向边的传递时间。 times[i] = (u, v, w),其中 u 是源节点,v 是目标节点, w 是一个信号从源节点传递到目标节点的时间。

现在,我们向当前的节点 K 发送了一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1。

注意:

N 的范围在 [1, 100] 之间。
K 的范围在 [1, N] 之间。
times 的长度在 [1, 6000] 之间。
所有的边 times[i] = (u, v, w) 都有 1 <= u, v <= N 且 0 <= w <= 100。
package gongel_first;

import java.util.Arrays;

public class Sevenhundred_fortyThree {
    /**
     * 还是考研时王道上学的Dijkstra
     */
    private int[] dist;
    //    private int[] path; 用于记录最短路径
    private boolean[] visited;

    private void dijkstra(int start, int[][] times, int N) {
        Arrays.fill(dist, 100000);
        int min, u = -1;
        dist[start] = 0;
//        for (int i = 1; i <= N; i++)
//            path[i] = i;
        for (int i = 1; i <= N; i++) {
            min = Integer.MAX_VALUE;
            for (int j = 1; j <= N; j++) {
                if (visited[j] == false && dist[j] < min) {
                    u = j;
                    min = dist[j];
                }
            }
            if (u == -1)
                continue;
            visited[u] = true;
            for (int k = 1; k <= N; k++) {
                if (visited[k] == false && dist[u] + times[u][k] < dist[k]) {
                    dist[k] = dist[u] + times[u][k];
//                    path[k] = u;
                }
            }
        }
    }

    public int networkDelayTime(int[][] times, int N, int K) {
        dist = new int[N + 1];
//        path = new int[N+1];
        visited = new boolean[N + 1];
        int[][] g = new int[N + 1][N + 1];

        for (int i = 1; i <= N; i++) {
            for (int j = 1; j <= N; j++) {
                g[i][j] = 100000;
            }
        }
        for (int[] t : times) {
            g[t[0]][t[1]] = t[2];
        }
        dijkstra(K, g, N);
        int max = -1;
        for (int i = 1; i <= N; i++)
            max = Math.max(max, dist[i]);
        if (max == 100000)
            return -1;
        return max;
    }
}

 

Dijkstra

Slot-Filling

一、定义

槽填充是要读取句子中的一些语义成分,可以看作一个序列标注问题

举例:

槽填充是一个序列标注问题,具有明确的对齐信息。

句子 first class fares from Boston to Denver
Slots B-机舱类别 I-机舱类别 O O B-出发地 O B-目的地

意图:订机票。

本质上是学得一个映射函数X→Y。训练样本:{(x(n),y(n)),n=1,⋯,N}

二、进展以及相关论文

Research Advances In Semantic Slot Filling

搬砖填坑系列|任务型对话系统之SLU(一)

slot filling topic