转换输入以仅匹配词汇表中的精确单词与 Sci-Kit 的计数矢量化器



我有一个二维数组。数组的每一行都是一个烹饪食谱,每列都包含食谱的成分。我想创建一个标准化的成分二进制矩阵。规范化的二进制矩阵将具有与配方矩阵相同的行数(对于每个配方(以及每列中所有成分的二进制向量。如果配方中存在该成分,则该元素的值将为 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-gram可用于将单词chickenchicken broth分开。N-gram(在本例中为双元语法(将chicken broth(2 个不同的令牌(转换为单个令牌chicken_broth,因此我们可以根据需要表示成分的数量:[1, 0, 1]而不是[2, 0, 1]。这是类似问题的答案链接。要使用Scikit-learn的CountVectorizer实现n-grams,您需要n_gram_range参数设置为任务所需的N-grams(双元语法,三元语法等(。对于此示例,它是n_gram_range=(2)的,需要根据成分的最大字数增加

注意:请勿使用n_gram_range=(1,2)等 N 元语法范围,这仍可能导致令牌chicken与双元语法标记chicken_broth分开计数。

总而言之,您可以按如下方式更改第一行代码(假设max_word_count是如上所述的最大字数(:

cv = CountVectorizer(vocabulary=unique_ingredients, lowercase=False, ngram_range=(max_word_count))

希望这个迟到的答案有所帮助!

最新更新