程式者的胡言亂語
從搜尋引擎的查詢條件建構關鍵詞
william學長在「java.net.URLDecoder的bug」一文中提到了:
在最後一個關鍵詞雲中看到「三國演義裡的危機處理」、「六个人的小世界」、「食物熱量換算程式」這三個例子,可見你大概沒做斷詞吧,還是說是因為它們整組出現的頻率很高,高到你的演算法決定不予以拆解?
本來想偷懶一下的,不過還是被抓到了。儘管如此,我還是覺得這個議題滿值得討論的。
從搜尋引擎的查詢條件建構關鍵詞的動作,很類似「斷詞」的動作,但我在做的時候想想卻又覺得有點不同。由於查詢條件目前看起來含正體中文、簡體中文,還有英文。中文的斷詞一直都是不好做的工作,尤其我不希望倚賴詞庫來做斷詞,因為這樣子就得涉及詞庫的維護工作。另一方面,採用TFIDF將所有的查詢條件串在一起再取詞,現階段的實驗結果(是的,我有試過)看起來並不好。
而我的想法就是想辦法從使用者回饋進來的查詢條件中自動的建詞。以「三國演義裡的危機處理」為例,由於它只出現過很少的次數(應該只有兩次)所以先假定它整個就是一個詞,但是當日後還有使用者的查詢條件是「三國演義」或「危機處理」時,我就會明白「三國演義」和「危機處理」分別也都是詞,而「三國演義裡的危機處理」是個含兩個詞的詞。也就是說,我並不預設立場什麼是一個詞,而是讓使用者來告訴我什麼是詞。因為大多數的人在搜尋引擎上所輸入的條件,多半還是以詞為單位(即使會輸入多個詞,但他們會適時的以空白字元或逗號分隔),只是有些使用者會試著輸入較長的句子。這也就是說,利用來自搜尋引擎的查詢條件,只要用一些簡單的分隔字元,我們應該可以有效的自動建構出詞出來-這是在沒有詞庫,也就是不預設立場的情況下可以做到的。以「雍正」和「雍正王朝」為例,儘管出現了七次的「雍正王朝」,但卻還出現了「雍正」以及「「雍正登基」及「雍正故事」。後兩者因為出現的次數太低了,所以被濾掉,但是由於出現過「雍正」,所以我們可以知道「雍正」是個詞,而「雍正王朝」是個含「雍正」這個詞的另一個詞。
如果觀察含Java的查詢條件,可以看到更多變的各種查詢,但無論如何,我們可以找出Java,我們甚至可以把JDK 1.5找出來,即使jdk與1.5之間有空白字元。
這是因為搜尋引擎的查詢條件和一般文字段落具備不同的特性所致。如果要做一個詞庫的自動化建立系統,我想從搜尋引擎來是一個很好的方向。因為在這種情境下,使用者會在不知不覺中告訴系統:什麼是一個詞。就算不斷的有新詞被產生,這個方法仍然能夠適用。
「三國演義裡的危機處理」之所以現在會出現在關鍵詞雲內,是因為我設的過濾門檻值太低,只要大於一就會出現。等日後收集的查詢條件夠多時,這個門檻值就可以因應做調整,甚至利用查詢條件或詞的數量來計算出門檻值。到時,不是真正的詞就不那麼容易浮現了。
不論如何,我觀察到stop words可能還是會需要的,藉以過濾掉一些雖然是詞,但意義並不大的詞。
Posted at 09:21下午 九月 14, 2006 by Chien-Hsing Wang in programming | 迴響[1]
星期四 九月 14, 2006

請問一下,如何從使用者回饋進來的查詢條件中自動的建詞?像是如果有人輸入:「紅酒都是用軟木塞塞住瓶口」,如何斷出詞彙(紅酒、軟木塞、塞住、瓶口)?可以在沒有分隔字元的一組字中不用詞庫就斷詞是怎麼辦到的?這居然喝兩杯咖啡就解出來,真是太神了!
另外像大大提到的製作標籤雲,如果是使用一堆複合關鍵字搜尋,又該怎麼選擇重要關鍵字納入標籤雲中?像是有人輸入查詢「牙痛、java、思路受阻、錯誤PHP訊息」亂打一通,結果還是查到本網站,在做標籤雲時,勢必只納入 java 一詞作考量,如何踢掉另外幾個完全無關的搜尋關鍵字?
望請大師告知。
祝愉快.....
由...發表 jocosn on 九月 20, 2006 at 11:25 下午 CST #