Python 如何向CountVectorizer添加权重因子

Python 如何向CountVectorizer添加权重因子,python,pandas,machine-learning,scikit-learn,Python,Pandas,Machine Learning,Scikit Learn,我对数据科学很陌生。我正在尝试使用LDA解决nlp集群问题。我在使用sklearn的CountVectorizer时遇到问题 我有一个数据框: df = pd.DataFrame({'id':[1,2,3],'word':[['one', 'two', 'four'], ['five', 'six', 'nine'], ['eight', 'eleve

我对数据科学很陌生。我正在尝试使用LDA解决nlp集群问题。我在使用sklearn的CountVectorizer时遇到问题

我有一个数据框:

df = pd.DataFrame({'id':[1,2,3],'word':[['one', 'two', 'four'],
                                    ['five', 'six', 'nine'], 
                                    ['eight', 'eleven', 'ten']]})
df2 =  df.copy().assign(word = df.word.map(lambda y: " ".join(y)))


    id  word
0   1   one two four
1   2   five six nine
2   3   eight eleven ten
我有一段代码可以解决我的问题:

cvectorizer = CountVectorizer(min_df=4, max_features=10000,ngram_range=(1,2))
cvz = cvectorizer.fit_transform(df2['word'])
我只想给word列中的值添加某种权重因子。它应该是这样工作的:word列中数组的第一个元素应该具有数组长度的权重,并且从数组的开始到结束按降序排列

例如:对于id=1的行,我希望出现以下情况:

{one:3, two:2, four:1}
其中int值是我的权重参数

在这之后,我想把加权值推送到CountVectorizer


我已经阅读了文档,但我就是不知道如何解决我的问题。

这里的基本功能是split方法——通过它,您既可以将单词列表转换为字符串列表,也可以获得要分配给每个字符串的整数

最后一个答案:这里是一个drop-in字典生成方法,并应用调用来应用它:

def make_dict(list1,list2):
    d = {}
    for k,v in zip(list1,list2):
        d[k] = v
    return d

df2['word'].apply(lambda x : (x.split(" "), [i for i in reversed(range(1,len(x.split(" "))+1))])).apply(lambda y : make_dict(y[0],y[1])) 
这将返回一个序列,序列中的每个元素都是您为该特定行请求的字典。下面对这个表达式进行解释

说明:从创建元组的列表理解开始-元组的第一项是字符串的拆分列表,这些字符串将作为字典键。元组的第二项是整数的拆分列表,这些整数将成为字典值。这些基本上只是由范围调用生成的反向列表,其参数来自答案开头提到的字符串拆分方法

In [1]: df2['word'].apply(lambda x : (x.split(" "), [i for i in reversed(range(1,len(x.split(" "))+1))]))
Out[1]:
0        ([one, two, four], [3, 2, 1])
1       ([five, six, nine], [3, 2, 1])
2    ([eight, eleven, ten], [3, 2, 1])
接下来,定义一个函数,将两个列表作为参数,从上面的操作中我们知道,这两个列表必须是相同长度的列表,因此我们不需要强制检查它们是否具有相同的长度,除非我们是偏执狂并将它们缝合到字典中:

In [2]: def make_dict(list1,list2):
    ...:     d = {}
    ...:     for k,v in zip(list1,list2):
    ...:         d[k] = v
    ...:     return d
List1转换为一组键,list2转换为一组值。注意:如果重复键,例如,如果您的一列是一列,这将覆盖旧键

现在剩下的就是将第一个表达式的输出与上面定义的函数相结合,我们可以使用另一个apply:


谢谢你的回答!但是它能帮我确定我的权重参数吗?这本字典会给你每个单词的权重参数。你的问题说明int值是我的权重参数。是的,这有助于你了解重量参数,除非我有误解。
In [3]: df2['word'].apply(lambda x : (x.split(" "), [i for i in reversed(range(1,len(x.split(" "))+1))])).apply(lambda y : make_dict(y[0],y[1]))
Out[3]:
0        {'one': 3, 'two': 2, 'four': 1}
1       {'five': 3, 'six': 2, 'nine': 1}
2    {'eight': 3, 'eleven': 2, 'ten': 1}
Name: word, dtype: object