admin 发布的文章

一、建表

CREATE TABLE a like b
查看hive建表语句:show create table tablename;

二、复制数据

set hive.exec.dynamic.partition=true;
set hive.exec.dynamic.partition.mode=nonstrict;
insert into table A partition (dt,data_type)
select * from B WHERE dt=sysdate(-1)

三、查看表结构

describe tablename; 简写:desc tablename;

四、排序

SELECT

*

FROM

(
 SELECT
    *,
    row_number() over(PARTITION by cid ORDER by rand() ) as rank
FROM
    table
WHERE
    dt ='2021-09-26'

 ) a  
 WHERE a.rank <101

curl -s -H "Content-Type: application/x-ndjson" -XPOST http://jiesi-777:1A8DD78DE3730A63157772E24794ED4816BE3BB7@10.194.37.171:40005/voc_pre_tag_sent_db_v3/_search?pretty -d '{"query":{"bool":{"must":[{"match":{"phrase":{"query":"退货 客服","operator":"and"}}}],"should":[{"match":{"phrase":{"query":"咨询 服务","operator":"or"}}}]}}}'>result.csv

参考
1.https://www.elastic.co/guide/cn/elasticsearch/guide/current/match-multi-word.html
2.https://www.elastic.co/guide/cn/elasticsearch/guide/current/bool-query.html

一、背景

BM25算法本质上来说是tf-idf的升级版本。
tf-idf的全程是:词频-逆文档频率(term frequency–inverse document frequency),就是词频*逆文档频率。
BM25全程:best match,思想和tf-idf是一样的。

二、TF-IDF公式

1.TF

在一份给定的文件里,词频(term frequency,TF)指的是某一个给定的词语在该文件中出现的频率。这个数字是对词数(term count)的归一化,以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词数,而不管该词语重要与否。)对于在某一特定文件里的词语 t_{i} 来说,它的重要性可表示为:
tf.png
以上式子中 n_{i,j} 是该词在文件d_{j}中的出现次数,而分母则是在文件d_{j}中所有字词的出现次数之和。

2.IDF

idf.png
其中

|D|:语料库中的文件总数
$|\{ j: t_{i} \in d_{j}\}| $:包含词语 t_{i} 的文件数目(即 n_{i,j} neq 0的文件数目)如果该词语不在语料库中,就会导致被除数为零,因此一般情况下使用idf1.png

三、BM25公式

$ Score(Q, d) = \sum_{i = 1}^t w_i * R(q_i, d) $

上面式子中wi表示qi的权重,R(qi,d)为qi和d的相关性,Score(Q,d)就是每个语素qi和d的相关性的加权和。
wi 的计算方法有很多,一般是用IDF来表示的,但这里的IDF计算和上面的有所不同,具体的表达式如下:
$w_i = IDF(q_i) = \log \frac {N - n(q_i) + 0.5} {n(q_i) + 0.5}$

上面式子中N表示文本集合中文本的总数量,n(qi)表示包含qi这个词的文本的数量,0.5主要是做平滑处理。
R(qi,d)的计算公式如下:
$R(q_i, d) = \frac {f_i * (k_1 + 1)} {f_i + K} * \frac {qf_i * (k_2 + 1)} {qf_i + k_2}$
其中
$K = k_1 * (1 - b + b * \frac {dl} {avg dl})$
上面式子中fi为qi在文本d中出现的频率,qfi为qi在Q中出现的频率,k1,k2,b都是可调节的参数,dl,avgdl分别为文本d的长度和文本集D中所有文本的平均长度
一般qfi=1,取k2=0,则可以去除后一项,将上面式子改写成:
$R(q_i, d) = \frac {f_i * (k_1 + 1)} {f_i + K}$

通常设置k1=2,b=0.75。参数b的作用主要是调节文本长度对相关性的影响。
一般取值范围是
k1∈[1.2,2.0]:它用于调节饱和度变化的速率。数值越低则饱和的过程越快速。

b=0.75:字段长度归约用 b 来表示,它的值在 0 和 1 之间,1 意味着全部归约化,0 则不进行归约化。

文献:
1.https://zhuanlan.zhihu.com/p/113224707
2.https://www.cnblogs.com/jiangxinyang/p/10516302.html
3.https://d.shikey.com/jike/%E6%9E%81%E5%AE%A2%E6%97%B6%E9%97%B4%E5%B7%B2%E5%AE%8C%E7%BB%93/55%20AI%E6%8A%80%E6%9C%AF%E5%86%85%E5%8F%82%E5%AE%8C%E7%BB%93/pdf/019%E8%AE%B2%E7%BB%8F%E5%85%B8%E6%90%9C%E7%B4%A2%E6%A0%B8%E5%BF%83%E7%AE%97%E6%B3%95%EF%BC%9ABM25%E5%8F%8A%E5%85%B6%E5%8F%98%E7%A7%8D%EF%BC%88%E5%86%85%E9%99%84%E5%85%A8%E5%B9%B4%E7%9B%AE%E5%BD%95%EF%BC%89.pdf?preview