2016-11-17 68 views
1

我必須將一些json格式的文檔聚類。我想修改功能哈希來減小尺寸。開始小,這是我輸入:使用功能散列的羣集

doc_a = { "category": "election, law, politics, civil, government", 
      "expertise": "political science, civics, republican" 
     } 

doc_b = { "category": "Computers, optimization", 
      "expertise": "computer science, graphs, optimization" 
     } 
doc_c = { "category": "Election, voting", 
      "expertise": "political science, republican" 
     } 
doc_d = { "category": "Engineering, Software, computers", 
      "expertise": "computers, programming, optimization" 
     } 
doc_e = { "category": "International trade, politics", 
      "expertise": "civics, political activist" 
     } 

現在,我怎麼去使用功能散列,爲每個文檔向量,然後計算相似度和創建羣集?閱讀http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.FeatureHasher.html後,我有點失落。 不知道如果我必須使用「字典」或轉換我的數據有一些整數,然後使用'pair''input_type'到我的featureHasher。我應該如何解釋featureHasher的輸出?例如,示例http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.FeatureHasher.html輸出一個numpy數組。

In [1]: from sklearn.feature_extraction import FeatureHasher 

In [2]: hasher = FeatureHasher(n_features=10, non_negative=True, input_type='pair') 

In [3]: x_new = hasher.fit_transform([[('a', 1), ('b', 2)], [('a', 0), ('c', 5)]]) 

In [4]: x_new.toarray() 
Out[4]: 
array([[ 1., 2., 0., 0., 0., 0., 0., 0., 0., 0.], 
     [ 0., 0., 0., 0., 0., 0., 0., 5., 0., 0.]]) 

In [5]: 

我認爲這些行是文檔和列值是..?說,如果我想聚類或找到這些向量之間的相似性(使用餘弦或Jaccard),不知道是否我必須做項目明智的比較?

預期輸出:doc_a,doc_c和doc_e應該位於一個羣集中,其餘羣集位於另一個羣集中。

謝謝!

回答

1

如果您使用HashingVectorizer而不是FeatureHasher來解決此問題,那麼您可以讓自己更輕鬆。 HashingVectorizer負責標記輸入數據並可以接受字符串列表。

問題的主要挑戰是您實際上有兩種文本功能,categoryexpertise。在這種情況下的訣竅是適合哈希矢量兩個功能,然後結合輸出:

from sklearn.feature_extraction.text import HashingVectorizer 
from scipy.sparse import hstack 
from sklearn.cluster import KMeans 

docs = [doc_a,doc_b, doc_c, doc_d, doc_e] 

# vectorize both fields separately 
category_vectorizer = HashingVectorizer() 
Xc = category_vectorizer.fit_transform([doc["category"] for doc in docs]) 

expertise_vectorizer = HashingVectorizer() 
Xe = expertise_vectorizer.fit_transform([doc["expertise"] for doc in docs]) 

# combine the features into a single data set 
X = hstack((Xc,Xe)) 
print("X: %d x %d" % X.shape) 
print("Xc: %d x %d" % Xc.shape) 
print("Xe: %d x %d" % Xe.shape) 

# fit a cluster model 
km = KMeans(n_clusters=2) 

# predict the cluster 
for k,v in zip(["a","b","c","d", "e"], km.fit_predict(X)): 
    print("%s is in cluster %d" % (k,v)) 
+0

謝謝瑞安。我在10種具有4種文本特徵的文檔上試了一下,效果很好。現在,我可以直觀地查看羣集的成員,並查看哪些功能對其「親密度」有貢獻。當我處理非常大的數據集時,這會成爲一個問題,因爲文檔中提到:「沒有辦法做反向變換(從特徵索引到字符串特徵名),這在試圖反思哪些特徵對於一個模型。」)。我正在研究sklearn可以提供的其他事情。有任何想法嗎? – user1717931

+0

是的,與HashingVectorizer有一個折衷,因爲你可以使用更多的功能來適應你的模型,但是你失去了自省的能力。 sklearn中的其他向量化工具(CountVectorizer,TFIDFVectorizer)將允許您執行自檢,但它們有更大的佔用空間;爲了使它們適合大數據集,您可以將max_features設置爲合理的數字。 –

+0

如果我必須手動計算兩個散列向量(包含每個要素桶中散列數的特徵向量)之間的相似度 - 我可以簡單地使用jaccard或餘弦我相信。對? – user1717931