使用 Sci-Kit 的 Count Vectorizer 转换输入以仅匹配词汇表中的确切单词

Transform input to match only exact words of the vocabulary with Count Vectorizer of Sci-Kit

我有一个二维数组。数组的每一行都是一个烹饪食谱,每一列都包含食谱的成分。我想创建一个成分的标准化二进制矩阵。归一化二进制矩阵将具有与配方矩阵相同的行数(对于每个配方)和每列中所有成分的二进制向量。如果该成分存在于配方中,则该元素的值为 1(如果不是零值)。

现在二进制矩阵的出现次数超过 1。这是因为计数矢量化器匹配词汇表中的多个单词。 例如假设我的词汇量是

{'chicken': 0, 'chicken broth': 1, 'carrots': 2}

假设我要转换的向量是

['chicken','carrots']

二进制矩阵会这样变换

[2, 0, 1]

虽然我希望它是

[1,0,1]

这是因为 'chicken' 与 'chicken' 匹配,但也与 'chicken broth' 匹配。下面是我生成此代码的代码片段。我只想匹配词汇表中单词的精确出现。我可以使用任何参数或任何方式来实现这一目标吗?我尝试了 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 可用于将单词 chickenchicken broth 分开。 N-gramsbi-gram 在这种情况下)将 chicken broth(2 个不同的标记)转换为单个标记 chicken_broth 因此我们可以按照需要的方式表示成分的数量:[1, 0, 1] 而不是 [2, 0, 1]。这是 similar issue. To implement n-grams with Scikit-learn's CountVectorizer 的答案 link,您需要将 n_gram_range 参数设置为任务所需的 N-gram(二元语法、三元语法等)。对于此示例,它是 n_gram_range=(2),需要根据成分的最大字数 增加

注意:不要使用范围的N-grams,例如n_gram_range=(1,2),这仍然会导致令牌chicken 与二元语法标记 chicken_broth.

分开计算

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

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

希望这个迟来的回答对您有所帮助!