2016-08-02 18 views
5

私は文字列のリストを持っています。文字列に'#'文字が含まれている場合は、文字列の最初の部分を抽出し、文字列のこの部分からのみ単語トークンの頻度カウントを取得します。すなわち 文字列が文字列「#」が含まれていない場合は、文字列全体のトークンを返し、 期待されるトークンは、「最初の」ある「質問」Scikit Learn - CountVectorizerを使用して文字列区切り記号から単語トークンを抽出する

「stackoverflowの上の最初の質問#」であれば。

私はCountVectorizerをscikitから使用しています。

私のコードの下に検索:

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

文書全体に '#'が含まれている場合や、 '#'を持つ単語を表示するだけの場合は、 'first''ques'の出現回数をカウントしますか? –

+0

# –

答えて

2

問題は、「保存しておきたいビットとあなたが保持しないビットに文字列を分割しました、あなたのトークナイザを産むが、あなた文字列を単語に分割しないでください。 あなたが最も一度あなたのセパレーター(#)に分割し、分割の最初の部分を取ることができる

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

ありがとう、それは#文字列全体のトークンの出現だけでなく、#が含まれている場合、部分文字列のトークンの出現をカウントしたい、それは働いた。私は、文字列を返す代わりに、私はトークンのリストを返す必要があります、すべての後にそれがtokenizerであることがわかります。しかし、私はカスタムトークナイザから文字列を返すときに、文字列トークン化のステップをオーバーライドします。だから、文字をトークン化するのではなく、['最初の質問'、 '助けてください']を生成するはずです。 –

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] 

#あなたの結果です。あなたは "#"が存在するかどうかをチェックする必要はありません。

関連する問題