2013-02-20 40 views
3

我試圖在scikit-learn中使用一些自定義詞彙來處理一些聚類任務,並且我得到了很奇怪的結果。使用TfidfVectorizer自定義詞彙表的問題scikit-learn

當不使用自定義詞彙時,程序運行正常,我對集羣創建感到滿意。但是,我已經確定了一組我希望用作自定義詞彙的單詞(約24,000個)。

單詞存儲在SQL Server表中。到目前爲止,我嘗試了兩種方法,但最後我得到了相同的結果。第一個是創建一個列表,第二個是創建一個字典。爲創建字典的代碼是這樣的:

myvocab = {} 
vocabulary = [] 

count = 0 

for row in results: 
    skillName = re.sub(r'&#?[a-z0-9]+;', ' ', row['SkillName']) 
    skillName = unicode(skillName,"utf-8") 
    vocabulary.append(skillName) #Using a list 
    myvocab[str(skillName)] = count #Using a dictionary 
    count+=1 

然後我用在TfidfVectorizer詞彙(列表中的每個版本或字典中,他們都給予末相同的結果),如下所示:

vectorizer = TfidfVectorizer(max_df=0.8, 
         stop_words='english' ,ngram_range=(1,2) ,vocabulary=myvocab) 
X = vectorizer.fit_transform(dataset2) 

X的形狀是(651,24321),因爲我有651個實例羣集和在詞彙24321個字。

如果我打印X的內容,這就是我得到:

(14, 11462) 1.0 
(20, 10218) 1.0 
(34, 11462) 1.0 
(40, 11462) 0.852815313278 
(40, 10218) 0.52221264006 
(50, 11462) 1.0 
(81, 11462) 1.0 
(84, 11462) 1.0 
(85, 11462) 1.0 
(99, 10218) 1.0 
(127, 11462) 1.0 
(129, 10218) 1.0 
(132, 11462) 1.0 
(136, 11462) 1.0 
(138, 11462) 1.0 
(150, 11462) 1.0 
(158, 11462) 1.0 
(186, 11462) 1.0 
(210, 11462) 1.0 

: : 

如可以看出,大多數情況下,只有從詞彙詞存在(這是不對的,因爲至少10個),並且對於很多實例,甚至沒有找到一個單詞。而且,所發現的單詞在實例中總是相同的,這是沒有意義的。

如果我使用打印feature_names:

feature_names = np.asarray(vectorizer.get_feature_names()) 

我得到:

['.NET' '10K' '21 CFR Part 11' ..., 'Zend Studio' 'Zendesk' 'Zenworks'] 

我必須說,這一項目是完全運行時所使用的詞彙是一個從輸入文件確定,所以我強烈懷疑問題與使用自定義詞彙有關。

有沒有人有線索發生了什麼?

(我不使用流水線所以這個問題不能與以前的錯誤,這已經被固定)

回答

0

這在我看來是不尋常的一件事是,當你創建矢量化您指定ngram_range=(1,2)。這意味着您無法使用標準標記器獲取功能'21 CFR Part 11'。我懷疑'缺少'的功能是n>2的n-grams。你有多少預先選擇的詞彙項目是unigrams或bigrams?

+0

我嘗試過使用ngram_range從(1,1)到(1,5)的不同變化,我總是得到相同的結果。 1克詞彙項目的數量是9692,2克:13215,3克:1337,4克:77。我不認爲這是問題所在。 – FRiverai 2013-02-21 10:55:46

0

我敢肯定,這是由min_df=2的(可以令人困惑的)默認值造成的,如果它在數據集中至少沒有出現兩次,就會從詞彙表中刪除任何特徵。您可以通過在您的代碼中明確設置min_df=1來確認嗎?

+0

我將值更改爲min_df = 1,結果完全相同。如果我打印TdidfVectorizer,這就是我得到的:TfidfVectorizer(analyzer = word,binary = False,charset = utf-8, charset_error = strict,dtype = ,input = content, lowercase = True,max_df = 0.8,max_features = None,max_n = None, min_df = 1,min_n =無,ngram_range =(1,2),norm = token_pattern =(?u)\ b \ w \ w + \ b,tokenizer = None,use_idf = True, vocabulary = None) – FRiverai 2013-02-21 10:48:19

+0

那麼也許您的'dataset2'不是'TfidfVectorizer'所期待的?檢查'TfidfVectorizer'文檔中的'input'參數。 您可以通過'TfidfVectorizer(** params).build_analyzer()(dataset2)'來檢查文本分析步驟的結果(預處理,標記化和n-gram提取)。 – ogrisel 2013-02-21 12:28:39

+0

我已經廣泛地使用該數據集進行分類和聚類,但現在我正嘗試使用自己的詞彙表,這是我一直遇到問題的時候。不過,我會做你的建議並報告結果 – FRiverai 2013-02-21 16:30:06

0

在Python for-in循環中,無法使用count + = 1在每個循環中使count加1。你可以在範圍(n)中使用我:替換它。因爲計數的值將保持爲1.