使用 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 可用于将单词 chicken
与 chicken broth
分开。 N-grams(bi-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))
希望这个迟来的回答对您有所帮助!
我有一个二维数组。数组的每一行都是一个烹饪食谱,每一列都包含食谱的成分。我想创建一个成分的标准化二进制矩阵。归一化二进制矩阵将具有与配方矩阵相同的行数(对于每个配方)和每列中所有成分的二进制向量。如果该成分存在于配方中,则该元素的值为 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 可用于将单词 chicken
与 chicken broth
分开。 N-grams(bi-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))
希望这个迟来的回答对您有所帮助!