基于企业名称对无线上公开信息的中小本地企业进行行业分类的Python程序化可扩展方案咨询
基于企业名称对无线上公开信息的中小本地企业进行行业分类的Python程序化可扩展方案咨询
我刚好之前帮本地商会做过类似的小项目,这种没公开信息的小公司分类确实头疼,纯靠名称的话得从关键词匹配+规则引擎入手,再结合少量人工校准,完全能做到可扩展。下面分享几个我亲测有效的思路和代码片段:
一、先搭一个基础的关键词规则库(核心)
小公司的名称里一般都会直接带行业相关的关键词——比如“XX汽修”“XX便利店”“XX科技工作室”,先整理一套行业-关键词映射表,这是最直接、准确率最高的基础方案,而且可以随着新数据不断迭代补充。
代码示例:基础关键词匹配
# 自定义行业-关键词映射表,可根据你的数据集随时扩充 sector_keywords = { "Tech": ["科技", "数码", "软件", "网络", "编程", "信息技术", "AI"], "Industrial": ["制造", "机械", "五金", "加工", "汽配", "模具", "重工"], "Finance": ["财务", "会计", "投资", "财税", "贷款", "担保", "理财"], "Retail": ["超市", "便利店", "生鲜", "百货", "服饰", "礼品", "鞋帽"], "Services": ["家政", "保洁", "维修", "美容", "美发", "餐饮", "物流", "快递"] } def preprocess_name(company_name): # 预处理:去掉常见后缀,避免干扰匹配 common_suffixes = ["有限公司", "有限责任公司", "店", "部", "行", "工作室", "中心"] for suffix in common_suffixes: if company_name.endswith(suffix): company_name = company_name[:-len(suffix)] # 统一转半角(处理全角字符输入) def full2half(s): return s.translate(str.maketrans('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ')) return full2half(company_name.strip()) def match_sector_by_keywords(company_name): cleaned_name = preprocess_name(company_name) # 遍历匹配关键词,优先匹配精准词汇 for sector, keywords in sector_keywords.items(): for keyword in keywords: if keyword in cleaned_name: return sector # 无匹配项标记为待人工分类 return "Unclassified" # 测试效果 test_companies = ["朝阳五金加工店", "诚信财税咨询有限公司", "快乐便利店", "星辰科技工作室"] for name in test_companies: print(f"{name} → {match_sector_by_keywords(name)}")
优化点
- 给关键词加权重:比如“软件”比“科技”更精准,遇到同时包含的情况,优先返回权重高的关键词对应的行业
- 补充模糊匹配:比如“XX电脑经营部”里的“电脑”可以关联到Tech行业,把这类衍生关键词也加入映射表
二、进阶:语义匹配处理模糊名称
有些小公司名称里没直接带行业词,比如“XX商行”“YY贸易中心”,这时候可以用中文分词+词向量语义匹配来补全分类能力。不用依赖大模型,自己用小语料训练一个轻量模型就行。
代码示例:轻量语义匹配
import jieba from gensim.models import Word2Vec import numpy as np # 用行业核心词汇训练一个极小的词向量模型(也可以直接用本地加载的中文预训练模型) train_corpus = [ ["科技", "数码", "软件", "网络", "编程"], ["制造", "机械", "五金", "加工", "汽配"], ["财务", "会计", "财税", "投资", "理财"], ["超市", "便利店", "零售", "百货", "生鲜"], ["家政", "保洁", "维修", "餐饮", "物流"] ] # 训练轻量模型 model = Word2Vec(sentences=train_corpus, vector_size=100, window=3, min_count=1, workers=2) def get_name_vector(cleaned_name): # 分词后取词向量的平均值作为名称的语义向量 words = jieba.lcut(cleaned_name) valid_vectors = [model.wv[word] for word in words if word in model.wv] if not valid_vectors: return None return np.mean(valid_vectors, axis=0) def match_sector_by_semantic(company_name): cleaned_name = preprocess_name(company_name) name_vec = get_name_vector(cleaned_name) if not name_vec: return "Unclassified" # 预计算各行业的语义中心向量 sector_centers = { "Tech": np.mean([model.wv[word] for word in train_corpus[0]], axis=0), "Industrial": np.mean([model.wv[word] for word in train_corpus[1]], axis=0), "Finance": np.mean([model.wv[word] for word in train_corpus[2]], axis=0), "Retail": np.mean([model.wv[word] for word in train_corpus[3]], axis=0), "Services": np.mean([model.wv[word] for word in train_corpus[4]], axis=0) } # 计算余弦相似度,取最匹配的行业 max_similarity = -1 best_sector = "Unclassified" for sector, center_vec in sector_centers.items(): similarity = np.dot(name_vec, center_vec) / (np.linalg.norm(name_vec) * np.linalg.norm(center_vec)) if similarity > max_similarity: max_similarity = similarity best_sector = sector return best_sector # 测试模糊名称 test_fuzzy_names = ["XX商行", "YY贸易中心", "ZZ维修服务部"] for name in test_fuzzy_names: print(f"{name} → {match_sector_by_semantic(name)}")
三、可扩展的迭代优化机制(越用越准的关键)
纯程序不可能100%准确,得结合人工校准形成闭环:
- 把标记为
Unclassified的公司导出,用简单的本地工具(比如Streamlit搭个5分钟就能搞定的小界面)让人工分类,然后自动提取新的关键词补充到sector_keywords里 - 给关键词加优先级:比如“餐饮”比“管理”优先级高,避免“XX餐饮管理公司”被误分到Finance或Services的其他子类
- 按地域调整规则:比如沿海地区的“XX海鲜行”归Retail,内陆地区可能归Services(餐饮类),可以给不同地域加专属关键词组
四、避坑提醒
- 预处理一定要做:别小看“有限公司”“店”这些后缀,很容易干扰关键词匹配,先清理干净再处理
- 别迷信大模型:这类没公开信息的小公司,大模型的猜测全是瞎蒙,反而不如自己搭的规则库+轻量NLP模型靠谱
- 小步迭代:不用一开始就做完美,先搭基础规则库,跑一遍现有数据,把错误和未分类的整理出来,再逐步补充规则和模型语料,效率最高
我当时用这套思路处理了2000多家本地小公司,一开始准确率大概70%,迭代3次后就到90%以上了,剩下的10%人工处理也花不了多少时间,完全符合可扩展的要求。如果你的数据集有特殊属性(比如都是某类地域的公司),还可以针对性加规则,灵活调整就行~




