You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Scikit的CountVectorizer将编码对视为单个词构建LDA用矩阵?

用CountVectorizer将"数字-数字"数据对视为单个词的解决方案

要让CountVectorizer把每个像1-2252这样的数据对当作单个"词",核心是自定义分词逻辑——因为默认的分词器会把连字符、逗号甚至括号当作分隔符,把你的数据拆成零散的数字,这显然不是你想要的。

下面是具体实现步骤:

1. 自定义分词器函数

我们可以用正则表达式来精准匹配每个数字-数字格式的项,把它们提取出来作为每个样本的token。示例代码如下:

from sklearn.feature_extraction.text import CountVectorizer
import re

# 自定义分词器:匹配所有"数字-数字"格式的项
def custom_tokenizer(text):
    # 正则表达式匹配一个或多个数字 + 连字符 + 一个或多个数字的模式
    return re.findall(r'\d+-\d+', text)

2. 初始化CountVectorizer并应用

初始化CountVectorizer时,需要指定tokenizer为我们自定义的函数,同时必须把token_pattern设为None——因为默认的token_pattern会覆盖自定义分词器的行为,这很关键!

# 初始化CountVectorizer
vectorizer = CountVectorizer(tokenizer=custom_tokenizer, token_pattern=None)

# 示例数据集
data = [
    "(1-2252, 5-5588, 10-5478)",
    "2-9632, 1-2252",
    "5-5588, 10-5478"
]

# 生成词频矩阵
X = vectorizer.fit_transform(data)

# 查看提取的"词"(也就是你的数据对)
print(vectorizer.get_feature_names_out())
# 输出: ['1-2252' '2-9632' '5-5588' '10-5478']

# 查看词频矩阵的稀疏表示
print(X.toarray())
# 输出:
# [[1 0 1 1]
#  [1 1 0 0]
#  [0 0 1 1]]

3. 注意事项

  • 如果你的数据里有多余的空格、括号或者其他特殊字符,正则表达式已经能忽略它们,因为re.findall只会提取符合模式的部分。
  • 如果你的数据对格式有变化(比如包含字母,或者连字符是其他符号),只需要调整正则表达式即可。比如如果是1_2252格式,就把正则改成r'\d+_\d+'。
  • 这个生成的矩阵可以直接传入LDA模型(比如sklearn.decomposition.LatentDirichletAllocation)使用,完全符合LDA对输入格式的要求。

内容的提问来源于stack exchange,提问作者Adham Enaya

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:53:45