如何配置TF-IDF vectorizer参数实现按逗号切分的自定义分词
问题根源
TfidfVectorizer默认配置面向自然语言长文本设计,自带的分词逻辑以空白为分隔边界,还会默认执行词干提取、停用词过滤规则,无法识别数据中以逗号作为术语边界的结构化格式,因此会出现跨术语拼接、重复词提取的异常结果。
解决方案
核心是替换默认分词逻辑,直接以逗号为分隔符提取独立术语,具体操作如下:
- 编写专用分词函数:单条文本传入后,直接按逗号拆分,对每个拆分片段做首尾空白清理,过滤空值后直接作为分词结果,跳过默认的词干提取、正则匹配分词步骤。
- 初始化向量器时传入自定义分词规则:必须同步将
token_pattern设为None,否则默认的正则分词规则会覆盖自定义逻辑,导致配置失效。
完整可运行代码示例:
from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.cluster import KMeans import pandas as pd # 自定义逗号分隔术语分词器 def comma_tokenizer(text): # 如需兼容全角逗号,可打开下一行注释 # text = text.replace(',', ',') raw_tokens = text.split(',') # 清理术语首尾空白,过滤空片段 cleaned_tokens = [t.strip() for t in raw_tokens if t.strip()] return cleaned_tokens # 初始化TF-IDF向量器 tfidf_vectorizer = TfidfVectorizer( tokenizer=comma_tokenizer, token_pattern=None, lowercase=True # 术语对大小写敏感时设为False ) # 拟合转换,假设你的术语存在DataFrame的terms列 # tfidf_matrix = tfidf_vectorizer.fit_transform(df['terms']) # 后续KMeans聚类按常规逻辑编写即可 # kmeans = KMeans(n_clusters=设置为你需要的簇数量, random_state=42) # cluster_res = kmeans.fit_predict(tfidf_matrix) # 测试验证(可删除) sample_texts = [ "machine learning, data, ia, segmentation, analysis", "big data, data lake, data visualisation, marketing, seo" ] test_matrix = tfidf_vectorizer.fit_transform(sample_texts) # 输出的术语列表为['analysis' 'big data' 'data' 'data lake' 'data visualisation' 'ia' 'machine learning' 'marketing' 'segmentation' 'seo'],完全符合预期 print(tfidf_vectorizer.get_feature_names_out())
注意事项
- 该配置完全跳过了默认的文本预处理规则,不会对术语做词干提取、词形还原,如果需要这类处理,可以在自定义分词函数里对每个清理后的术语单独加处理逻辑。
- 向量拟合完成后,可直接通过
tfidf_vectorizer.get_feature_names_out()拿到所有独立术语,匹配KMeans的聚类中心权重,就能快速提取每个簇的代表术语,不会再出现乱拼接的无效词项。 - 如果你的术语中本身包含逗号(极少见场景),需要提前对术语内的逗号做转义处理,避免被误识别为分隔符。
内容的提问来源于stack exchange,提问作者Louise Talpe
相关产品推荐
相关产品推荐

