N-gram 特征提取

N-gram 是一种基于统计语言模型的算法,又被称为一阶马尔科夫链。它的基本思想是将文本里面的内容按照字节进行大小为 N 的滑动窗口操作,形成了长度是 N 的字节片段序列。每一个字节片段称为 gram,对所有的 gram 的出现频度进行统计,并且按照事先设定好的阈值进行过滤,形成关键 gram 列表,也就是这个文本的向量特征空间。列表中的每一种 gram 就是一个特征向量维度。

算法优点:

1.语种无关性,对中 英 繁 都通用。
2.不需要进行语言学上的处理。

3.容错性强。

N-gram 算法采用固定长度为 N 的滑动窗口进行切分,目前常用 N-gram 模型是二元的 Bi-gram 和三元的 Tri-gram 模型。对两种模型的切分方法进行比较,比如 “北京  欢迎  你的  到来”,Bi-gram 切分就是 “北京欢迎   欢迎你的   你的到来”,Tri-gram 切分就是 “北京欢迎你的   欢迎你的到来”。

特征提取过程如下:

1.首先对文档进行粗切分,得到语段序列。
2.对语段序列进行 gram 切分,得到gram 频度列表。并选择频度大于设定阈值的 gram 片段作为特征向量。
3.每个gram 片段就是一个维度,形成特征向量表。

<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)表示使用unigram和bigram,(2,2)表示仅使用bigram- `analyzer`:可以是'word'(按单词)或'char'(按字符)级别的n-gram。默认是'word'。因此,要提取n-gram特征,我们可以在创建CountVectorizer对象时设置`ngram_range`参数。示例步骤:1.导入CountVectorizer2.创建CountVectorizer对象,指定ngram_range(例如(1,2)表示提取1-gram和2-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]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值