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

标签 python scikit-learn data-science countvectorizer scikits

我有一个二维数组。数组的每一行都是一个 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 可用于将单词 chickenchicken 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/

相关文章:

python - 压缩内存中的文件,计算校验和并将其写入Python中的 `gzip`

python - Sklearn 分类器和 Flask 问题

scala - 将scala映射值与列表进行比较,并为列表中不存在的键返回默认值

python - Django 中按降序排列类别

python - 如何使用 Python 将更改应用于源文件?

python - 在 Pandas 中使用具有通用后缀的变量名

python - 目标在 Scikit 的线性回归对象中意味着什么?

scikit-learn - roc_auc_score 和plot_roc_curve 结果不同

python - Pandas:如何将数据帧列中的 'timestamp' 值从对象/字符串转换为时间戳?

apache-spark - 如何计算 Spark 逻辑回归中的 p 值?