函數打分(function scoring)小引

Neil Zhu,简书ID Not_GOD,University AI 创始人 & Chief Scientist,致力于推进世界人工智能化进程。制定并实施 UAI 中长期增长战略和目标,带领团队快速成长为人工智能领域最专业的力量。
作为行业领导者,他和UAI一起在2014年创建了TASA(中国最早的人工智能社团), DL Center(深度学习知识中心全球价值网络),AI growth(行业智库培训)等,为中国的人工智能人才建设输送了大量的血液和养分。此外,他还参与或者举办过各类国际性的人工智能峰会和活动,产生了巨大的影响力,书写了60万字的人工智能精品技术内容,生产翻译了全球第一本深度学习入门书《神经网络与深度学习》,生产的内容被大量的专业垂直公众号和媒体转载与连载。曾经受邀为国内顶尖大学制定人工智能学习规划和教授人工智能前沿课程,均受学生和老师好评。

函數打分(function scoring)小引

原地址

引言

任何搜索引擎,包括Elasticsearch,其關鍵在於打分。打分可以大致定義為尋找滿足某些條件的數據,並將數據根據其相關性進行排序後返回。相關性常常通過TF-IDF這樣的算法獲得,這些算法試著找出那些跟提交的查詢最為文本相似的文檔。儘管TF-IDF和它的小夥伴如BM25相當有效,還是有些時候需要其他的算法或者引入別的啟發式打分規則來給出最好的相關性。這裡Elasticsearch的script_scorefunction_score特性就有用武之地了。本文將介紹這些工具的使用。

常見的文本相似性不是最重要因素的例子是geo搜索。如果我們想要找到靠近某個給定地點的好咖啡店,對咖啡店進行根據搜索的文本相似性排序對用戶來說沒太大用處,但是通過地理位置的遠近來排序卻能夠給出一個較好的結果。

另一個例子是視頻分享網站的視頻查詢,其中搜索的結果應當將視頻的受歡迎度作為考慮的因素。如果一個流行明星上傳一個給定名稱的視頻,獲得了上百萬的觀看,這個視頻應該遠遠超過那些通過文本相似度獲得的結果。

入門

讓我們看看如何對此問題進行建模,使用文本相似性和視頻受歡迎程度的組合作為最終視頻結果排名的依據。最佳的方法當然是將這些描述轉換為數學公式了。在視頻網站,目標值主要有下面這些:

  • 視頻的元數據(title, description, etc.)在標準的TF-IDF文本相關性的因素
  • 給定視頻收到的likes數目
  • 給定視頻的觀看數目

給定這些設定後,我們可以使用一個初等的公式,比如說score*(likes+views+1)。注意我們已經設定likesviews的數目作為參數(最後加上1是避免出現都為0的情形)。使用乘法也是比較合理的,因為score的絕對值不能被計數了。作為score返回的特定的數目可能會隨著Elasticsearch不同的版本,查詢和shard而變化。當然這樣簡單的模型肯定會有一些明顯的問題,主要是對大數目的likes或者views的視頻他們的文本相似性低卻被匹配返回。我們需要削減大likes和views的值的影響。最簡單例子就是一個良好的文本匹配其view值為1肯定會比一個不好的文本匹配其view值很大(如1mm)這樣的結果肯定要處理。

降低更為流行的視頻的影響性的一種簡單方式是通過使用其對數log來實現。我們把上面的公式改為:

score*log(likes+views+1)

這個公式讓算法更加合理,不會是的那些流行霸主視頻統治全場。此時該模型已經可以使用了,不過出了這個環境效果就不能保證了。讓我們通過實實在在的例子來看看調整後的結果。下面我們給出schema定義,一些測試數據,然後進行查詢。

# Create the index
curl -XPOST http://localhost:9200/searchtube
# Create the mappings
curl -XPUT http://localhost:9200/searchtube/video/_mapping -d '{
  "video": {
    "properties": {
      "title": {
        "type": "string",
        "analyzer": "snowball"
      },
      "description": {
        "type": "string",
        "analyzer": "snowball"
      },
      "views": {
        "type": "integer"
      },
      "likes": {
        "type": "integer"
      },
      "created_at": {
        "type": "date"
      }
    }
  }
}'

# Create some docs
curl -XPUT http://localhost:9200/searchtube/video/1 -d '{
  title: "Sick Sad World: Cold Breeze on the Interstate",
  description: "Is your toll collector wearing pants, a skirt, or nothing but a smile? Cold Breeze on the Interstate, next on Sick, Sad World.",
  views: 500,
  likes:2,
  created_at: "2014-04-22T08:00:00"
}'

curl -XPUT http://localhost:9200/searchtube/video/2 -d '{
  title: "Sick Sad World: The Severed Pianist",
  description: "When he turned up his nose at accordion lessons, they cut off his inheritance molto allegro. The Severed Pianist, next on Sick, Sad World.",
  views: 6000,
  likes: 100,
  created_at: "2014-04-22T12:00:00"
}'

curl -XPUT http://localhost:9200/searchtube/video/3 -d '{
  title: "Sick Sad World: Avant Garde Obstetrician",
  description: "Meet the avant-garde obstetrician who has turned his cast offs into art work. Severed Umbilical cord sculpture next, on Sick, Sad World.",
  views: 100,
  likes: 130,
  created_at: "2014-04-22T23:00:00"
}'
With this data set we can test out our formula with the query below.

curl -XPOST http://localhost:9200/searchtube/_search -d '
{
  "query": {
    "function_score": {
      "query": {"match": {"_all": "severed"}},
      "script_score": {
        "script": "_score * log(doc['likes'].value + doc['views'].value + 1)"
      }
    }
  }
}'

** [此處已經無法使用script_score],由於版本的問題。反正我自己試過若干次使用不了,若有成功者,請賜教。**

Elasticsearch中的下降函數(decay functions in Elasticsearch)

有些場景僅僅使用likes或者views是不夠的,但是肯定會基於已有的設置上進行相應的調整。在1小時內收到1000次觀看的視頻應該被看成“更熱門的”,相比較於在24小時內被觀看10000次的視頻。Elasticsearch提供了幾個decay函數來解決此類問題。

對我們的視頻數據,我們喜歡暫時在前一天最熱門的視頻,讓更近的視頻的分數更高一些。Elasticsearch有三種類型的模型來處理這種情形,gaussexplinear。他們讓妳可以將一個值映射到模型曲線上的一個點。線性模型當是最簡單的。線性下降意味著,所有點均勻地按照時間進行遞減,時間越久則下降越大。而指數下降就同拋物線那樣,離原點越遠則下降的速度急劇變快。最後,高斯分佈有個S型的形狀,先緩慢後急劇最後緩慢的下降趨勢。下圖是三種不同的形狀,妳也可以在這兒看到3D的情形。

image
image

所有這幾個模型,我發現高斯模型是最為有用的。在我們的例子中,曲線頂端的緩慢下降意味著更多最近的視頻匯聚在一起,在一個視頻發佈後一小時內或者一個半小時內並不會有很大的變化。然而,我們希望開始急劇地來下降視頻,這就對應高斯分佈中的近線性下降的部分。最後,我們希望它能在某個點。

這樣就把我們的結果分成三個部分並且三部分之間有自然的轉換。簡單說,這就以為著非常近的視頻有一個分數懲罰,而稍微近的視頻有一個較大的分數懲罰,隨著年紀的贈長而變得越來越大,最老的視頻將獲的極大的懲罰。

曲線的形狀可以通過originscaleoffsetdecay進行控制。這三個變量是妳主要的工具。originscale可以定義區間的長度。如果希望我們趨勢視頻列表可以覆蓋整個一天24小時,那麼最好將origin設置為當前的時間戳,scale則設為24h。偏移offset可以來平鋪整個區間,例如可以設置其為1h,移除對當前視頻的懲罰。最後,decay參數可以改變文檔基於其位置的層級。默認的decay值為0.5,更大的值會使得曲線更加陡峭,其效果也更加明顯。

img
img

現在我們可以整一個趨勢查詢,以時間近性來作為打分的因素。下面的查詢:

{
  "query": {
    "function_score": {
        "functions": [
          {
            "gauss": {
                "created_at": {
                    "origin": "2014-04-22T23:50:00",
                    "scale": "12h",
                    "offset": "1h",
                    "decay": 0.3
                }
            }
          },
          {
            "gauss": {
              "likes": {
                  "origin": 20000,
                  "scale": 20000
              }
            }
          },
          {
            "gauss": {
              "views": {
                  "origin": 20000,
                  "scale": 20000
              }
            }
          }
        ]
    }
  }
}

妳會注意到,這個查詢會把"Sick Sad World: Avant Garde Obstetrician"作為第一個視頻返回,即使它只有100個觀看者和130喜歡,而下一條結果則擁有成千的觀看數和喜歡。這就是由於近性起到的作用。妳也許注意到我們不再使用script_score查詢,並且使用高斯模型重新把likes和views作為查詢的附加指標。通過使用內設的高斯下降函數,我們的查詢應該比腳本查詢更加快速,同樣也可以調整這些曲線的形狀。

這類查詢可以被進一步的定製。通過使用附加的函數,我們可以改變成任意妳想要的函數,並整合更多的變量。另外,這些查詢可以用來進行地理查詢,幫助我們將地理點周圍的結果彙集起來。

欲尋求更加完備的關於函數打分查詢的資料和信息,請參考這裡

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容