作者:nana
 
  LZ看到QQ音乐每天收到高达上亿次的搜索请求,感到很欣慰!

  但是每天还是有6%左右的0结果,让LZ陷入了沉思,作为搜索产品经理,心理阴暗的研究用户各种搜索log是必备技能,于是…LZ发现……竟然有一大半搜不到结果的原因是因为打错字多打字或者少打字!!!如下——

 
  但是这些都难不倒我们强大的技术团队!
 

  本着一切以用户价值为依归的终极理想,我们的搜索技术团队给出了十分完善的解决方案,使得0结果率降低到2%左右,同时用户CTR也提升了4%左右~解决了近300万次/日搜索结果召回!

检索意图识别效果

 
检索意图识别原理

  QQ音乐库内有百万级别的歌曲名、歌手名、专辑名等数据,利用这些库内数据以及部分已知的功能词可以有效的分析出用户query的意图。

  具体的识别流程如下图所示:

  (1)QC纠错 用户的query存在着写错的情况,如用户本意为搜索“林志炫”而输入“linzhixuan”或者“林芝炫”。此时QC纠错结果可以较好的解决该类问题,QC词表使用的是QQ音乐库内的数据。


  (2)Node获取  Node为用户query的子串且同时为QQ音乐库内的歌曲名或歌手名或专辑名,当用户query长度为N时,其所有子串数量为。此处实现是使用库内数据构造一棵trie树,配合query切词位置找出包含的所有Node。


  (3)Pattern选择      将Node选取出来后,需要根据一定的模式找出最优可能的识别串。长度为N的query其潜在的Node数量为,从这中再找出所有可能的组合最大复杂度为。


  假设用户的输入query为:ABCD,对于每个字符依次在我们的trie树中寻找可能的匹配串,比如对于A先查找A本身是否存在于trie树中,是的话再继续依次查找AB,ABC,ABCD,不是的话则跳出。假设系统中匹配到的为:AB、ABC、BC、BCD、C、CD、D


  我们将字符X开始能直接匹配到的词的集合记为f(X),另外用*代表任意的字符。


  那么可以标记如下:


f(A)={AB,ABC,*}
f(B)={BC,BCD,*}
f(C)={C,CD,*}
f(D)={D,*}


  另外将字符X开始能按顺序匹配到最后一个词的所有可能组合记为g(X),用|来作为多个词的分割符标识。那么可以标记如下:


g(D)={D,*}
g(C)={C|D,CD,*|D,**}   (即从C开始有4种可能的连续匹配方式)
……


  对于f(X)里面的某个词M1,匹配M1的后续一个字记为n1,记录h(M1)={M1×g(n1)} (×标识两者笛卡儿积,对应我们词的拆分),则g(X)=h(M1)∪h(M2)∪h(M3)∪……h(Mn)


  比如f(C)={C,CD,*},依次处理其中的每个词:


  第一个词h(C)=C×g(D)=C×{D,*}={(C,D),(C,*)},用我们的描述记为{C|D,C|*}。


  第二个词h(CD)={CD}


  第三个词*,h(*)=*×g(D)=* ×{D,*}={(*,D),(*,*)},用我们的描述记为{*|D,*|*}。


  所以g(C)={C|D,C|*,CD,*|D,*|*}


  由此可以得出:


g(B)=h(BC) ∪ h(BCD) ∪ h(*)
h(BC)=BC×g(D)=BC×{D,*}={BC|D,BC|*}
h(BCD)={BCD}
h(*)=*×g(C)=*×{C|D,C|*,CD,*|D,*|*}={*|C|D,*|C|*,*|CD,*|*|D,*|*|*}
g(B)={BC|D,BC|*, BCD, *|C|D,*|C|*,*|CD,*|*|D,*|*|*}
 
  同样可以得出

g(A)=AB×g(C) ∪ ABC×g(D)∪ *×g(B)
={AB|C|D, AB|C|*, AB|CD, AB|*|D, AB|*|*} ∪
{ABC|D,ABC|*} ∪
{*|BC|D, *|BC|*,*|BCD, *|*|C|D, *|*|C|*,*|*|CD, *|*|*|D, *|*|*|*}
={AB|C|D, AB|C|*, AB|CD, AB|*|D, AB|*|*,{ABC|D,ABC|*,{*|BC|D, *|BC|*,*|BCD, *|*|C|D, *|*|C|*,*|*|CD, *|*|*|D, *|*|*|*}


  但是实际在使用上述方法来实现时其复杂度仍然较高,通过对线上所有的query进行分析可以知道有超过80%的query意图较为明确为单一歌曲名、单一歌手名、歌曲+歌手。因此没有必要用上述方式来解决这一问题,可以选择使用一些模式来解决问题,具体的获取模式流程如下:

 
  严格全覆盖为node节点数小于等于2且node拼接起来后刚好完全覆盖query,当node等于2的时候必须为歌曲+歌手或者歌手+歌曲,且该歌手唱过对应的歌曲。

  匹配模式为从所有Node节点中找出两个位置不想交的歌曲和歌手节点,同时该歌手刚好唱过对应的歌曲,如query为”刘德华 忘情水 XXXX“ ,那么”刘德华“和”忘情水“即为匹配模式的结果。
  最长歌曲模式为从所有Node节点中找出最长歌曲的节点作为模式。

  最长节点模式为从所有Node节点中找出最长的节点作为模式。

²  产品效果体验地址

  QQ音乐客户端、音乐垂直搜索、QQ音乐iphone/ipad/android客户端、QQ音乐微信账号等。