TfidfTransformer和 CountVectorizer的使用

本文探讨了两种构建词向量的方法:TfidfTransformer和CountVectorizer。通过实例展示了如何使用这两种方法处理文本数据,生成词频矩阵,并进一步转换为TF-IDF矩阵。特别讨论了如何指定词汇表以忽略某些词汇。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

构建词向量简单的有两种分别是TfidfTransformer和 CountVectorizer,这里探索一下他们的使用方法

第一种使用方法,先使用CountVectorizer对原始文本数据进行处理,转换成各个词的频率,没有出现的就是0(这里需要注意的是,直接忽略词汇的长度小于2的,这里的"我"直接被删除了), 然后再使用对产生的数字矩阵进行处理,从而产生tf-idf的矩阵,实例代码如下:

from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer

vectorizer = CountVectorizer()
corpus = ["我, 中国, 中国, 黄河",
          "富强, 民主"]
corpus_vector = vectorizer.fit_transform(corpus)
words = vectorizer.get_feature_names()
print("模型中的词汇:", words) # 单词长度小于2的直接删除,不进入统计范围
print("原文转换为的向量:\n", corpus_vector)  # 由于矩阵比较稀疏,所以只显示有数据的元素
print("原文转换为的向量:\n", corpus_vector.toarray())

transformer = TfidfTransformer()
tf_idf = transformer.fit_transform(corpus_vector)
weight = tf_idf.toarray()
print("文本数据的tf-idf的值:\n", weight)

产生的输出是:

模型中的词汇: ['中国', '富强', '民主', '黄河']
原文转换为的向量:
   (0, 0)	2
  (0, 3)	1
  (1, 1)	1
  (1, 2)	1
原文转换为的向量:
 [[2 0 0 1]
 [0 1 1 0]]
文本数据的tf-idf的值:
 [[0.89442719 0.         0.         0.4472136 ]
 [0.         0.70710678 0.70710678 0.        ]]

这里需要指出的是,如果我们只想要特定的词汇, 而忽略其他的词汇,则可以在CountVectorizer()指定词汇,如下代码,这里忽略上面词汇中的"黄河":

from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer

vocabulary = [ "中国","富强", "民主"]
vectorizer = CountVectorizer(vocabulary=vocabulary)
corpus = ["我, 中国, 中国, 黄河",
          "富强, 民主"]
corpus_vector = vectorizer.fit_transform(corpus)

words = vectorizer.get_feature_names()
print("模型中的词汇:\n", words) # 单词长度小于2的直接删除,不进入统计范围
print("原文转换为的向量:\n", corpus_vector.toarray())

transformer = TfidfTransformer()
tf_idf = transformer.fit_transform(corpus_vector)
weight = tf_idf.toarray()
print("文本数据的tf-idf的值:\n", weight)

产生的结果是,从这里可以看出,少了黄河的频率和tf-idf的数值

模型中的词汇:
 ['中国', '富强', '民主']
原文转换为的向量:
 [[2 0 0]
 [0 1 1]]
文本数据的tf-idf的值:
 [[1.         0.         0.        ]
 [0.         0.70710678 0.70710678]]

第二种方法: TfidfTransformer也可以直接对原始的文本数据进行处理,但是他不会删除长度小于2 的词汇,为了测试与上面的数据得到的tf-idf结果一致,这里删除了"我"这个单字

from sklearn.feature_extraction.text import TfidfVectorizer

tfidfvector = TfidfVectorizer()
text = ["中国, 中国, 黄河", 
        "富强, 民主"]
tf_idf = tfidfvector.fit_transform(text)
weight = tf_idf.toarray()
print("每个单词的tf-idf的值:\n", weight)

结果如下,与上面的结果一致:

每个单词的tf-idf的值:
 [[0.89442719 0.         0.         0.4472136 ]
 [0.         0.70710678 0.70710678 0.        ]]

 

<think>我们被要求使用CountVectorizer提取n-gram特征。根据引用[2][5],CountVectorizer支持N-gram模型。引用[2]提到:“CountVectorizer支持单词或者连续字符的N-gram模型的计数。”引用[5]也指出它可以用于此目的。在scikit-learn中,CountVectorizer有两个参数用于控制n-gram:-`ngram_range`:一个元组(min_n,max_n),表示要提取的n-gram的最小最大长度。例如,(1,1)表示仅使用unigram,(1,2)表示使用unigrambigram,(2,2)表示仅使用bigram。- `analyzer`:可以是'word'(按单词)或'char'(按字符)级别的n-gram。默认是'word'。因此,要提取n-gram特征,我们可以在创建CountVectorizer对象时设置`ngram_range`参数。示例步骤:1.导入CountVectorizer2.创建CountVectorizer对象,指定ngram_range(例如(1,2)表示提取1-gram2-gram)3.使用fit_transform方法对文本数据进行特征提取下面是一个具体的代码示例:</think>### 如何使用 scikit-learn 的 CountVectorizer 提取 n-gram 文本特征 在 scikit-learn 中,`CountVectorizer` 通过 `ngram_range` 参数支持 n-gram 特征提取。以下是详细步骤: #### 1. **基本用法** ```python from sklearn.feature_extraction.text import CountVectorizer # 示例文本数据 corpus = [ "自然语言处理很有趣", "机器学习需要数学基础", "深度学习是机器学习的子领域" ] # 创建 CountVectorizer 对象,提取 1-gram 2-gram vectorizer = CountVectorizer(ngram_range=(1, 2)) # 关键参数 # 特征提取 X = vectorizer.fit_transform(corpus) # 查看特征名 print("N-gram 特征列表:", vectorizer.get_feature_names_out()) print("特征矩阵形状:", X.shape) ``` **输出示例**: ``` N-gram 特征列表: ['基础', '学习', '学习是', '很有趣', '数学', '数学基础', '机器', '机器学习', '深度', '深度学习', '是', '是机器', '处理', '自然', '自然语言', '语言', '语言处理', '需要', '领域', '子领域'] 特征矩阵形状: (3, 20) ``` #### 2. **关键参数说明** - **`ngram_range`**:元组 `(min_n, max_n)`,控制 n-gram 范围 - `(1, 1)`:仅 unigram(默认) - `(1, 2)`:unigram + bigram - `(2, 2)`:仅 bigram - **`analyzer`**:指定粒度 - `'word'`:单词级 n-gram(默认) - `'char'`:字符级 n-gram - **`stop_words`**:移除停用词(如 `stop_words='chinese'`) #### 3. **字符级 n-gram 示例** ```python char_vectorizer = CountVectorizer( ngram_range=(3, 3), # 提取 3-gram analyzer='char' # 字符级分析 ) char_X = char_vectorizer.fit_transform(corpus) print("字符 3-gram:", char_vectorizer.get_feature_names_out()[:5]) ``` **输出**:`字符 3-gram: ['处理很', '数学基' '自然语' '语言处' '需要数']` #### 4. **结合 TF-IDF 加权** n-gram 特征可直接转换为 TF-IDF 权重: ```python from sklearn.feature_extraction.text import TfidfTransformer tfidf_transformer = TfidfTransformer() X_tfidf = tfidf_transformer.fit_transform(X) ``` #### 注意事项 1. **维度控制**:n-gram 会显著增加特征维度,建议: - 设置 `max_features` 参数限制特征数量 - 配合停用词过滤(`stop_words`) 2. **中文预处理**:需先分词(使用 `jieba` 等工具),否则会按字符处理: ```python corpus = [" ".join(jieba.cut(text)) for text in corpus] # 分词后空格连接 ``` [^1]: CountVectorizer 支持单词或字符的 N-gram 计数[^1] [^2]: 通过 `ngram_range` 参数控制提取范围[^2] [^4]: N-gram 特征可直接输入 TF-IDF 转换器[^4]
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值