如何让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
相关产品推荐
相关产品推荐

