我对数据科学很陌生。我正在尝试使用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
我从web得到了一段代码,它对我的问题有用:
cvectorizer = CountVectorizer(min_df=4, max_features=10000,ngram_range=(1,2))
cvz = cvectorizer.fit_transform(df2['word'])
我想要的只是在word列中的值中添加某种权重因子。它应该像这样工作:word列中数组的第一个元素应该具有len(lengths of an array)
的权重,并且从数组的开头到结尾按降序排列。
例如:对于id = 1的行,我想要以下情况:
{one:3, two:2, four:1}
其中int值是我的体重参数。
在此之后,我希望将加权值推入CountVectorizer
。
我已阅读文档,但我无法解决问题。
答案 0 :(得分:1)
这里的基本功能是split()
方法 - 从中,您可以将单词列表转换为字符串列表,并获取要分配给每个字符串的整数。
最终答案:这是一个插入字典制作方法,并apply()
调用它来应用它:
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]))
这将返回一个Series,Series的每个元素都是您为该特定行请求的字典。对此表达式的解释如下。
说明:从创建元组的列表推导开始 - 元组的第一项是将成为字典键的字符串拆分列表。元组的第二项是整数的拆分列表,它将成为字典值(这些基本上只是通过调用range()
生成的反向列表,其参数来自于开头提到的字符串拆分方法答案)
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()
来完成:
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