2009-11-26 29 views
1

公司1有這個載體:假設我有2個向量。我可以使用哪些算法來比較它們?

['books','video','photography','food','toothpaste','burgers'] ... ... 

公司2有這個載體:

['video','processor','photography','LCD','power supply', 'books'] ... ... 

假設這是一個頻率分佈(我可以讓它變成一個元組,但太多的類型)。
正如你可以看到... ...這些向量有東西重疊。由於它們處於相似的位置,「視頻」和「攝影」似乎在兩個媒介之間是「相似的」。而且......「書」顯然是公司1 訂購和定位支撐點的確很重要,因爲這是一個頻率分佈。

,你可以用什麼算法來玩弄呢?你可以使用哪些算法爲這些公司提供有價值的數據,使用這些載體?

我是新來的文本挖掘和信息檢索。有人可以指導我討論與這個問題有關的話題嗎?

+0

是什麼順序與頻率分佈呢?書籍的頻率可能比食物低。但是你沒有告訴我們分配,你只是寫了可能的'事件'。 –

回答

3

位置是非常重要的,正如您強調的那樣,關鍵指標將基於不同矢量中相同項目之間的位置差異(例如,可以將差值的絕對值相加,或者他們的正方形)。需要解決的重大問題是 - 在一個矢量中衡量存在的物品(稱爲第N個物品)的重量,而在另一個矢量中則完全不存在。這是一個相對較小的問題 - 例如,缺失的物品實際上是在實際物品之後出現 - 例如 - 或者真的非常重要?沒有更多的理解實際應用領域,這是不可能的。您可以嘗試各種方法來處理這個問題,並查看他們對您關心的示例案例的結果。

例如,假設「缺少的項目與存在的項目大致相同,就在實際的項目之後」。然後,您可以預處理每個輸入向量到一個字典映射項目位置(關鍵的優化,如果你有比較多雙輸入向量的!):

def makedict(avector): 
    return dict((item, i) for i, item in enumerate(avector)) 

然後,比較兩個這種類型的字典:

def comparedicts(d1, d2): 
    allitems = set(d1) | set(d2)  
    distances = [d1.get(x, len(d1)) - d2.get(x, len(d2)) for x in allitems] 
    return sum(d * d for d in distances) 

(或abs(d)而不是上一條語句的平方)。爲了使遺漏的物品更重(使得詞典,即矢量被更遠地考慮),可以使用長度的兩倍而不是僅僅長度,或者在其他類似結構的程序中使用一些大的常數,例如100。

+0

Alex Martelli-我知道你是Python世界中的知名作者。你知道有哪些好的圖書館可以處理這樣的「集體數據」嗎? (除了NLTK,numpy) – TIMEX

+0

@alex,除了已經提到的,一個重要的資源是R - 它不是一個庫,它是它自己的語言(專門用於高級統計操作),但是有一個體面的「橋」將它與Python進行接口。 –

-1

你可以使用set_intersection算法。必須先對2個向量進行排序(使用排序調用),然後傳入4個迭代器,然後返回一個帶有插入常用元素的集合。還有其他一些類似的操作。

+0

set_intersection不起作用,因爲它不會選擇「相似」的條款。此外,亞歷克斯說,定位和訂購事宜。因此,排序列表將是一個不好的想法 – inspectorG4dget

3

我建議你一本書,叫Programming Collective Intelligence
這是一本關於如何從像這樣的簡單數據中檢索信息的非常好的書。有包含的代碼示例(在Python :)

編輯: 只是回答gbjbaanb:這是Python的!

a = ['books','video','photography','food','toothpaste','burgers'] 
b = ['video','processor','photography','LCD','power supply', 'books'] 
a = set(a) 
b = set(b) 

a.intersection(b) 
    set(['photography', 'books', 'video']) 

b.intersection(a) 
    set(['photography', 'books', 'video']) 

b.difference(a) 
    set(['LCD', 'power supply', 'processor']) 

a.difference(b) 
    set(['food', 'toothpaste', 'burgers']) 

+0

感謝設置/交叉點。但是,我確定一些「數學」和「統計」可以應用於他們...有一些數字,對吧? – TIMEX

+0

並感謝您的書籍​​推薦。我剛剛購買了它:) – TIMEX

0

如前所述MBG,漢明距離是一個良好的開端。它基本上爲每個可能的項目分配一個位掩碼,無論它是否包含在公司價值中。

EG。公司A的牙膏爲1,但公司B的牙膏爲0。然後,您計算公司之間的差異。 Jaccard係數與此有關。

漢明距離實際上不能夠像「視頻」和「攝影」之間的相似性捕獲。很顯然,一家出售一家公司的公司比另一家出售牙膏的公司出售其他公司的可能性要高。爲此,您可以使用像LSI這樣的東西(它也可用於降維)或階乘代碼(例如神經網絡東西,如限制玻爾茲曼機器,自動編碼器或可預測性最小化)來獲得更緊湊的表示,然後您可以使用它們進行比較歐幾里德距離。

0

挑每個條目的秩(較高秩是更好),並

匹配之間的幾何平均值總和爲兩個向量

行列用於在向量中的每個值的
sum(sqrt(vector_multiply(x,y))) //multiply matches 

薩姆應該是相同的對每個矢量(最好是1) 這樣你可以比較兩個以上的矢量。

如果你申請ikkebr的梅託德你可以找到如何爲simmilar到b

在這種情況下,只需使用

sum(b(b.intersection(a))) 
相關問題