企业分类相似度筛选实战:基于规则与向量方法的对比分析

企业表相似类别筛选实战

项目背景

在当下RAG(检索增强生成)技术应用不断发展的背景下,掌握文本相似算法不仅能够助力信息检索,还可用于评估生成式LLM的效果。

介绍

文本分类是现实生活中常见的任务之一。在企业分类中,类别数量通常达到数百个,为了方便理清这些类别间的关系、筛选出相似类别变得尤为重要。本项目旨在解决这一需求。

本项目的代码开源在GitHub,欢迎Star和Donate! 地址:https://github.com/JieShenAI/csdn/tree/main/25/01/文本相似_企业表筛选_实战

通过网盘分享的文件:文本相似_企业表筛选_实战
链接: https://pan.baidu.com/s/1XyGK17jjZZ_kivJsDKE3pQ?free

效果展示

本文通过基于规则的google_bleu方法基于向量的相似度计算,对企业类别间的相似度进行测算,并展示了两种方法的筛选结果。

候选集的表格为 alter_values.xls,通过遍历 init_values.xls 中的条目,从候选集中筛选出前 TopK 个最相似的条目。

基于规则的效果

规则方法主要基于字符层面的相似度计算,使用 google_bleu 算法完成,效果如下图所示:

在这里插入图片描述

行业分类属性列 来自 init_values.xls

【0-9】属性列,代表与行业分类属性列中值相似的前 Top 10 个值,相似程度从高到低递减,0 属性列为最相似。

google_bleu 支持字符串的相似得分计算,主要是基于字符层面的。

可以改进的点:在分词的时候,采用字分词,每个单字为一个词。在分词时,可通过引入 jieba分词 和自定义领域词典进行优化。

基于向量相似的效果

向量相似方法采用嵌入模型,能够抓取文本的深层语义信息,避免仅局限于字符表面匹配。

使用 jina-embeddings-v2-base-zh 作为嵌入模型,点击查看该模型的介绍 https://modelscope.cn/models/jinaai/jina-embeddings-v2-base-zh

在这里插入图片描述

使用基于向量的相似度计算,能够把握住文本深层次的语义信息,不会仅仅是表面的字符。

相比规则算法,向量方法能有效筛选出语义相近的类别,例如:

  • 规则方法可能错误地将“房地产中介服务”筛选为与“中 国 共 产 党 机 关”相关的条目;
  • 向量方法则能准确找到更贴合语义的结果,如“国家权力机构”或“共青团”。

基于规则

行业分类0123456789
中国共产党机关中国共产党机关中成药生产房地产中介服务国家机构国家权力机构国家行政机构其他国家机构公共安全管理机构生产专用起重机制造其他未列明国家机构

基于向量

行业分类0123456789
中国共产党机关中国共产党机关国家权力机构共青团国家行政机构人民检察院国家机构监察委员会、人民法院和人民检察院人民政协、民主党派人民政协基层群众自治组织及其他组织

可以发现基于规则找出的与中 国 共 产 党 机 关相关条目,其中居然包含有中成药生产房地产中介服务

说明

在这里插入图片描述

data: 存放原始数据目录;

rule.py: 基于规则的相似度筛选代码;

vector.py: 基于向量的相似度筛选代码;参考 chroma. https://python.langchain.com/docs/integrations/vectorstores/chroma/

向量筛选.csv规则筛选.csv 是最终的输出结果;

  • 代码复用:通过对两个表格与表头的替换,即可实现代码复用;

基于企业名称的筛选

Github 地址,只有代码没有数据:https://github.com/JieShenAI/csdn/tree/main/25/01/%E5%85%AC%E5%8F%B8%E5%90%8D%E7%A7%B0%E7%9B%B8%E4%BC%BC%E7%AD%9B%E9%80%89

通过网盘分享的文件:公司名称相似筛选
为了数据安全,对表格中的一部分数据进行了删除
链接: https://pan.baidu.com/s/1IMrA0TFv8wqAoQEKYMtTXA?free

原始数据:
在这里插入图片描述
在所有的 名称2属性列 中找出,与 名称1属性列相似的公司名。

相似公司筛选结果:
在这里插入图片描述
为了避免公司名称中,一些关键词的干扰,把一些词汇删除后再编码为向量计算相似度。
下述就是要删除的词汇:

def delete_words(text):
    DELETW_WORDS = [
        "有限公司",
        "有限责任公司",
        "股份有限公司",
        "控股集团公司",
        "控股有限责任公司",
        "控股股份有限公司",
        "集团",
        "公司",
        "合作社",
    ]
    for word in DELETW_WORDS:
        text = text.replace(word, "")
    return text
fold = "data/"

for file in os.listdir(fold):
    file_name = os.path.join(fold, file)
    if not file_name.endswith(".xlsx"):
        continue
    tmp_df = pd.read_excel(file_name)
    raw_companies = tmp_df["名称1"].to_list()
    ref_companies = tmp_df["名称2"].to_list()

    documents = [
        Document(
            page_content=delete_words(ref_company),
            id=idx,
            metadata={"ref_company": ref_company},
        )
        for idx, ref_company in enumerate(ref_companies)
    ]

    # 向量数据库
    vector_store = Chroma(
        collection_name=file,
        embedding_function=hf_embedding,
    )

    vector_store.add_documents(documents=documents)
    data = []
    for raw_company in tqdm(raw_companies):
        if not isinstance(raw_company, str):
            continue
        relevant_companies = vector_store.similarity_search_with_score(
            delete_words(raw_company), k=TOP_K
        )
        ans = [raw_company]
        for relevant_company, score in relevant_companies:
            ans.append(relevant_company.metadata["ref_company"])
            ans.append(score)
        data.append(ans)

    tmp_df = pd.DataFrame(
        data,
        columns=["raw_company"]
        + sum([[f"ref_company_{i}", f"score_{i}"] for i in range(1, TOP_K + 1)], []),
    )
    
    output_file = os.path.join("output", file)
    tmp_df.to_excel(output_file, index=False)
    print(f"Output saved to {output_file}")

候选的公司名,经过delete_words删除掉一些词,再计算embedding。原始的公司名保存在metadata。

Document(
    page_content=delete_words(ref_company),
    id=idx,
    metadata={"ref_company": ref_company},
)

相关文章推荐

三种文本相似计算方法:规则、向量与大模型裁判.https://blog.csdn.net/sjxgghg/article/details/145209050

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jieshenai

为了遇见更好的文章

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值