我有一个二维数组。数组的每一行都是一个 cooking 食谱,每一列包含该食谱的成分。我想创建成分的归一化二进制矩阵。归一化的二进制矩阵将具有与配方矩阵相同的行数(对于每个配方)以及每列中所有成分的二进制向量。如果配方中存在该成分,则该元素的值即使不是零,也将为 1。
现在,二进制矩阵的出现次数高于 1。发生这种情况是因为计数向量化器与词汇表中的多个单词相匹配。 例如,假设我的词汇量是
{'chicken': 0, 'chicken broth': 1, 'carrots': 2}
假设我想要变换的向量是
['chicken','carrots']
二进制矩阵将像这样变换
[2, 0, 1]
虽然我想要这样
[1,0,1]
发生这种情况是因为“鸡”与“鸡”匹配,但也与“鸡汤”匹配。下面是我的代码片段,它产生了这个结果。我只想匹配词汇表中单词的精确出现。我可以使用任何参数或任何方法来实现此目的吗?我尝试了 ngrams 参数但没有成功。
cv = CountVectorizer(vocabulary=unique_igredients,lowercase=False)
taggedSentences = cv.fit_transform(unique_igredients)
#encode document
for i in recipes:
vector = cv.transform(i)
mylist = sum(map(numpy.array, vector.toarray()))
vectorized_matrix_m.append(mylist.tolist())
最佳答案
N-grams 可用于将单词 chicken
与 chicken soup
分开。 N-grams(在本例中为bi-gram)将chicken soup
(2个不同的标记)转换为单个标记chicken_broth
因此我们可以按照需要的方式表示成分的数量:[1, 0, 1]
而不是 [2, 0, 1]
。这是 similar issue 的答案链接。使用 Scikit-learn 实现 n-gram CountVectorizer
您需要将 n_gram_range 参数设置为任务所需的 N 元语法(二元语法、三元语法等)。对于此示例,它是 n_gram_range=(2)
,并且需要根据成分的最大字数来增加。
注意:不要不要使用N-grams范围,例如n_gram_range=(1,2)
,这仍然可能导致 token chicken
与二元语法标记 chicken_broth
分开计数。
总而言之,您可以按如下方式更改第一行代码(假设 max_word_count
是如上所述的最大字数):
cv = CountVectorizer(vocabulary=unique_ingredients, lowercase=False, ngram_range=(max_word_count))
希望这个迟来的答案有帮助!
关于python - 使用 Sci-Kit 的 Count Vectorizer 转换输入以仅匹配词汇表中的精确单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59335537/