2016-08-02 123 views
5

我有字符串列表。如果任何字符串包含'#'字符,那麼我想提取字符串的第一部分,並只從這部分字符串中獲取單詞記號的頻率計數。即 如果字符串是「在計算器的第一個問題#」 預期令牌是「第一」,「問題」Scikit學習 - 使用CountVectorizer從字符串分隔符中提取字詞標記

如果字符串不包含「#」然後返回整個字符串的令牌。

要計算術語文檔矩陣,我正在使用scikit的CountVectorizer

下面找到我的代碼:

class MyTokenizer(object): 
    def __call__(self,s): 
     if(s.find('#')==-1): 
      return s 
     else: 
      return s.split('#')[0] 
    def FindKmeans(): 
     text = ["first ques # on stackoverflow", "please help"] 
     vec = CountVectorizer(tokenizer=MyTokenizer(), analyzer = 'word') 
     pos_vector = vec.fit_transform(text).toarray() 
     print(vec.get_feature_names())` 

output : [u' ', u'a', u'e', u'f', u'h', u'i', u'l', u'p', u'q', u'r', u's', u't', u'u'] 

Expected Output : [u'first', u'ques', u'please', u'help'] 
+0

如果在整個文檔中包含'#'或者只是爲了顯示那些具有'#'的單詞,您是否想要計算'第一''ques'的出現? –

+0

我想計算子字符串的發生,如果該行包含#以及從整個字符串的發生,如果它包含# –

回答

2

與標記者的問題奠定了,你可以擊碎串入你想保留位,你不希望保留位,但你」沒有將字符串分成單詞。 嘗試使用下面

class MyTokenizer(object): 
    def __call__(self,s): 
     if(s.find('#')==-1): 
      return s.split(' ') 
     else: 
      return s.split('#')[0].split(' ') 
+0

謝謝,它的工作。我看到,不是返回字符串,我應該返回標記列表,畢竟它是一個標記器。但是當我從自定義標記器返回字符串時,它會覆蓋字符串標記化步驟。所以,不要在字符上標記字符,而應該生成['第一個問題','請幫助']。 –

2

標記生成器你可以最多一次對你分離(#)分開,並採取分流的第一部分。

from sklearn.feature_extraction.text import CountVectorizer 

def tokenize(text): 
    return([text.split('#', 1)[0].strip()]) 

text = ["first ques # on stackoverflow", "please help"] 

vec = CountVectorizer(tokenizer=tokenize) 
data = vec.fit_transform(text).toarray() 
vocab = vec.get_feature_names() 

required_list = [] 
for word in vocab: 
    required_list.extend(word.split()) 
print(required_list) 

#['first', 'ques', 'please', 'help'] 
0
s.split('#',1)[0] 

#是你的結果。你不需要檢查「#」是否存在。

相關問題