通过大量短信内容查找其中短信的模板

最开始使用的是SequenceMatcher来查找,因为我的数据有百万条导致电脑跑到死机,后来查找资料问了问AI才知道SequenceMatcher适用于少量数据文本,之后改用MinHashLSH,速度有显著提升。

在前几次运行中发现模板总数比数据总数还要高,跑了一夜的代码全白费了,非常崩溃,改了很久才解决这个问题,详细过程见自定义函数find_templates

之后也是成功解决问题,但是需要注意几点:
1.相似度阈值不能太高或太低,太低会把区别不大的短信的整合在一起算成一个模板;而有许多短信中网址和名字太长会导致相似度降低,调的过高会导致这些数据变为单个的模板,所以相似度自己酌情调整

2.最后输出的模板还需要人工修改,把其中可变部分去掉变为可以匹配的特殊字符,我使用的是.* 这可以让我使用contains()来查找模板匹配的所有内容,如果你有不需要人工修改的方法请告诉我

3.在处理过程中最好去除短信文本中的所有特殊字符并且转化为大写或者小写来做,我在匹配海外短信内容时一开始没有注意到这些导致了许多问题

第一次文章纪念我第一次工作的第一个项目

import csv

#导入datasketch库的MinHash和MinHashLSH类,用于计算相似度和创建LSH索引
from datasketch import MinHash, MinHashLSH
import pandas as pd

#定义了一个名为`preprocess_text`的函数
#该函数用于文本预处理,例如去除特殊字符和停用词等。在给定文本字符串时,函数将其按空格分隔成单词并返回一个单词列表。
def preprocess_text(text):
    return text.split()

#在下面的函数内部,首先创建了一个空的MinHashLSH索引对象`lsh`,用于存储计算出的MinHash和对应的内容,创建了两个空字典`templates`和`minhashes`,用于存储模板和计算出的MinHash。

#对于提供的数据列表`data`中的每个文本内容:调用`preprocess_text`函数对文本进行预处理,得到一个单词列表。

#创建一个空的MinHash对象`m`,并通过循环遍历单词列表,将每个单词编码并更新到MinHash对象中。

#使用已创建的MinHashLSH对象`lsh`查询相似的MinHash,如果存在相似的则增加相似模板的计数,如果不存在则插入为新的模板。

#在模板字典`templates`中记录每个模板的计数。

#在MinHash字典`minhashes`中记录每个内容对应的MinHash对象。

def find_templates(data, similarity_threshold):
    # 创建LSH
    lsh = MinHashLSH(threshold=similarity_threshold, num_perm=128)
    templates = {}
    minhashes = {}
    for i, content in enumerate(data):
        preprocessed_content = preprocess_text(content)
        # 创建MinHash对象
        m = MinHash(num_perm=128)
        for word in preprocessed_content:
            m.update(word.encode('utf8'))
        # 检查是否已有相似的模板
        result = lsh.query(m)
        if result:  # 如果LSH中已经存在相似的,就增加计数
            templates[result[0]] += 1  # 只增加最相似的一个的计数
        else:  # 否则,添加为新的模板
            lsh.insert(content, m)
            templates[content] = 1
            minhashes[content] = m
    return templates


#打开文件并读取数据
with open('D:/file_p/data_ms_daxie.csv', 'r', encoding='utf-8') as file:
    reader = csv.DictReader(file)
    content_list = [row['content'].upper() for row in reader]


#调用`find_templates`函数,传入`content_list`和`similarity_threshold`作为参数,获得模板字典`templates`。
similarity_threshold = 0.65  # 调整相似度阈值,这里太高太低都会导致匹配不到合适的模板,适当调整
templates = find_templates(content_list, similarity_threshold)


#计数排序,并且为降序排列
sorted_templates = sorted(templates.items(), key=lambda x: x[1], reverse=True)


#模板结果保存为df表,方便之后查看和读存
df = pd.DataFrame(sorted_templates, columns=['Template', 'Count'])


#最后检查和输入的数据量是否一致,如果不一样说明代码有错
print(df['Count'].sum())
#最后保存到
df.to_csv('D:/file_p/daxie_moban.csv', index=False)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值