无标注文本的行业划分(行业分类)算法 —— 无监督或自监督学习
对于无标注文本的行业划分(行业分类),属于典型的无监督或自监督学习任务。以下是几种常见的算法方法及实现思路,适用于缺乏标注数据的场景:
一、基于关键词匹配的规则方法
核心思想:通过预定义的行业关键词库,计算文本与各行业的关键词匹配度,选择匹配度最高的行业。
实现步骤:
- 构建行业关键词库:
- 按行业(如“汽车”“金融”“医疗”等)收集高频关键词,可通过行业报告、百科或现有分类体系提取。
- 示例:
industry_keywords = {"汽车": ["车型", "引擎", "油耗", "新能源", "4S店"],"金融": ["利率", "贷款", "股票", "保险", "理财"],"医疗": ["医院", "药品", "手术", "患者", "医保"] }
- 文本特征提取:
- 对输入文本进行分词、去停用词,提取高频词或名词短语作为特征。
- 匹配与分类:
- 计算文本特征与各行业关键词的重叠率(如Jaccard系数、TF-IDF权重),选择重叠率最高的行业。
- 示例代码:
from collections import defaultdictdef classify_industry(text, industry_keywords):text_tokens = set(text.lower().split())scores = defaultdict(float)for industry, keywords in industry_keywords.items():common_tokens = text_tokens.intersection(keywords)scores[industry] = len(common_tokens) / max(len(keywords), 1) # 归一化得分return max(scores, key=lambda k: scores[k]) if scores else None
优缺点:
- 优点:简单直观,无需训练数据,适合快速上线。
- 缺点:依赖关键词库的完整性,无法处理新词或语义变体(如“新能源车”未在关键词库中)。
二、基于主题模型的聚类方法
核心思想:通过主题模型(如LDA、NMF)挖掘文本中的潜在主题,再根据主题分布将文本聚合成若干“行业簇”,最后人工标注簇的行业标签。
实现步骤:
- 文本预处理:
- 分词、去停用词、词形还原,构建文档-词矩阵(如TF-IDF矩阵)。
- 主题模型训练:
- 使用LDA模型推断文本的主题分布(如假设每个主题对应一个行业)。
from gensim import corpora, models from sklearn.feature_extraction.text import TfidfVectorizer# 假设documents是文本列表 tfidf = TfidfVectorizer() X = tfidf.fit_transform(documents) lda = models.LdaModel(corpus=X, num_topics=5, id2word=dict(zip(tfidf.vocabulary_.values(), tfidf.vocabulary_.keys())))
- 使用LDA模型推断文本的主题分布(如假设每个主题对应一个行业)。
- 文本聚类:
- 将文本的主题分布作为特征,使用K-Means、DBSCAN等聚类算法聚合成簇。
- 簇标注:
- 人工分析每个簇的高频主题词,赋予行业标签(如含“股票”“基金”的簇标注为“金融”)。
优缺点:
- 人工分析每个簇的高频主题词,赋予行业标签(如含“股票”“基金”的簇标注为“金融”)。
- 优点:能发现隐含的行业模式,适合长文本或领域分布较散的场景。
- 缺点:需要人工参与簇标注,主题数量需经验设定,短文本效果较差。
三、基于自监督学习的表示学习方法
核心思想:利用无标注数据预训练文本编码器(如BERT),生成文本的语义向量,再通过聚类或分类头实现行业划分。
实现步骤:
- 预训练语言模型:
- 使用掩码语言模型(MLM)等自监督任务在无标注文本上预训练模型(如RoBERTa)。
- 文本嵌入生成:
- 将文本输入预训练模型,提取句子级嵌入(如CLS token或平均池化后的向量)。
from transformers import BertTokenizer, BertModel import torchtokenizer = BertTokenizer.from_pretrained("bert-base-uncased") model = BertModel.from_pretrained("bert-base-uncased")def get_text_embedding(text):inputs = tokenizer(text, return_tensors="pt", padding=True, truncation=True, max_length=512)with torch.no_grad():outputs = model(**inputs)return outputs.last_hidden_state.mean(dim=1).squeeze().numpy() # 平均池化
- 将文本输入预训练模型,提取句子级嵌入(如CLS token或平均池化后的向量)。
- 无监督分类:
- 方法1:直接聚类。使用K-Means等算法对嵌入向量聚类,人工标注簇的行业标签。
- 方法2:伪标签训练。通过规则方法生成少量伪标签数据, fine-tune 分类头(如Dense层)。
优缺点:
- 优点:能捕捉语义信息,泛化能力强,适合复杂文本(如新闻、评论)。
- 缺点:需要大量计算资源预训练模型,或依赖少量伪标签辅助。
四、基于层次聚类的行业树构建
核心思想:通过文本相似度构建层次聚类树,从根节点到叶子节点逐层划分行业类别(如先区分“消费”“科技”,再细分“汽车”“电子”)。
实现步骤:
- 文本相似度计算:
- 使用余弦相似度、编辑距离等度量文本之间的相似性,构建相似度矩阵。
- 层次聚类:
- 使用凝聚层次聚类(Agglomerative Clustering),从单个文本开始,逐步合并相似文本为簇,形成树状结构。
- 行业树剪枝与标注:
- 根据业务需求剪枝(如保留3-5层结构),人工为每个子树节点赋予行业标签。
优缺点:
- 根据业务需求剪枝(如保留3-5层结构),人工为每个子树节点赋予行业标签。
- 优点:可自动发现行业层级关系,适合行业体系复杂的场景。
- 缺点:计算复杂度高(O(n³)),大文本集效率低。
五、方法对比与选择建议
方法 | 适用场景 | 数据需求 | 精度 | 开发成本 |
---|---|---|---|---|
关键词匹配 | 垂直领域、关键词明确 | 少量行业词典 | 中低 | 低 |
主题模型+聚类 | 长文本、行业隐含关联 | 大量无标注文本 | 中等 | 中 |
自监督表示学习 | 通用领域、需语义理解 | 大量无标注文本 | 高 | 高 |
层次聚类 | 行业体系复杂、需层级划分 | 中等规模文本 | 中等 | 中高 |
六、实战工具推荐
- 关键词匹配:
- 中文:哈工大LTP、jieba分词 + 行业词典(如阿里行业关键词库)。
- 英文:spaCy + 行业Thesaurus。
- 主题模型:
- Gensim(LDA)、Scikit-learn(NMF)。
- 自监督学习:
- Hugging Face Transformers(BERT/RoBERTa)、Sentence-BERT(句子嵌入优化)。
- 聚类工具:
- Scikit-learn(K-Means/DBSCAN)、HDBSCAN(层次密度聚类)。
总结
无标注数据的行业划分需结合业务特点选择方法:
- 快速落地:优先用关键词匹配,配合人工校准。
- 中长期需求:采用自监督学习预训练模型,结合少量伪标签或人工标注提升精度。
- 领域知识不足:通过主题模型或层次聚类探索数据分布,辅助构建行业体系。
实际应用中,常采用“规则+统计学习”的混合方案(如关键词匹配过滤候选行业,再用LDA细化分类),以平衡效率与准确性。
—— —— —— —— ——
以上,咨询豆包而来,问题是“有没有对一段文字进行行业划分的算法方法? 无标注的数据“。先备忘,有空再逐个方法试一试。