Scikit Learn - 使用CountVectorizer从字符串分隔符中提取单词标记

Ras*_*ngh 5 python machine-learning scikit-learn

我有字符串列表.如果任何字符串包含'#'字符,那么我想提取字符串的第一部分,并仅从字符串的这一部分获取字标记的频率计数.即如果字符串是"第一个问题#在stackoverflow上" 预期令牌是"第一个","问题"

如果字符串不包含'#',则返回整个字符串的标记.

计算我在CountVectorizerscikit中使用的术语文档矩阵.

在下面找到我的代码:

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']
Run Code Online (Sandbox Code Playgroud)

Nic*_*eli 6

您最多可以在分隔符( #) 上拆分一次,然后进行拆分的第一部分。

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']
Run Code Online (Sandbox Code Playgroud)


pim*_*314 2

问题出在你的分词器上,你已经将字符串分割成你想要保留的位和你不想保留的位,但你没有将字符串分割成单词。尝试使用下面的分词器

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