方案总结:
现在的工单热点关键词是调用大模型生成的
还借助大模型二次调用来把所生成的热点进行归类
创建一个,热点事件库即提取过后的工单热点
将这些热点扔给大模型给直接判断是不是一类。
或者就用算法生成向量,每次来新热点时,判断与老热点的相似度,若相似度在某某比例,则如高于80%,则归为一类,让数量加1,其余就新建一个热点即添加进数据库,如此重复,我觉得缺点是这个80%这个阈值不好确定。
数据聚类的大体实现过程:
查阅资料聚类大体过程应该就是,
1.数据预处理:利用各种方式将元数据可以是工单或者是,已经提取过的热点数据,经过一系列的处理方法(jieba分词,去除停用词等),生成可以初步使用的数据。
2.调用某种算法,查询相似或者频次最高的数据,中间还有各个词的权重等。如
词频(TF)= 某词在文章中出现的次数/文章的总次数
逆文章频率(IDF)=log(文章总数/(包含该词包含的文章数目加一))
特征权重(TF-IDF )= 词频(TF)X 逆文章频率(IDF)
3.搜索机器学习中满足要求的算法. 经过此算法可以得到想要的结果,中间可以结合一些别的技术或者算法,如:搜索引擎技术、大数据分析能力以及机器学习平台,来进一步提升热点聚类的准确性和实时性
优化归类流程
为了优化工单热点关键词的归类流程,我们可以考虑以下几个步骤:
- 建立热点事件库:首先,创建一个热点事件库,用于存储已经提取和归类的热点事件。这个数据库应该能够记录热点事件的详细信息,包括关键词、相关联的工单、热点的起始和结束时间等。
- 热点向量化:利用大模型对每个热点事件生成向量表示。这可以通过将热点事件的描述输入到预训练的语言模型中,获取其向量输出来实现。向量化的目的是将文本数据转换为可以进行数学运算的格式,以便后续处理。
- 新热点相似度判断:对于每个新出现的热点事件,同样使用大模型生成向量,并与热点事件库中的向量进行相似度比较。这可以通过计算向量之间的余弦相似度来实现。
- 热点归类决策:设置一个相似度阈值,比如80%,如果新热点与库中某个热点的相似度超过这个阈值,则将新热点归类到该热点事件中,并将相关联的工单数量加1。如果相似度低于阈值,则认为这是一个新的热点事件,并将其添加到热点事件库中。
- 热点事件更新:定期更新热点事件库,移除过时的热点,并加入新的热点事件。这可以通过监控热点事件的活跃度来实现,例如,如果某个热点事件在一段时间内没有新的工单关联,则可以认为该热点已经过时。
- 实时监控与反馈:建立一个实时监控系统,持续追踪热点事件的变化,并根据用户反馈和热点事件的发展趋势调整归类策略。
算法优缺点
大模型可以视为各种算法的集成
如果不采用大模型而使用算法的话:
-
K-means算法:
- 优点:
- 算法简单,易于理解和实现。
- 适合处理大型数据集,且收敛速度快。
- 对于球形簇的聚类效果较好。
- 缺点:
- 需要预先指定聚类的数量(K值)。
- 对初始聚类中心的选择敏感,可能导致不同的聚类结果。
- 对离群点和噪声数据敏感。
- 只能发现凸形状的簇。
- 优点:
-
层次聚类算法:
- 优点:
- 不需要预先指定聚类数量。
- 能够发现数据的层次结构。
- 通过树状图(Dendrogram)可以直观地展示聚类结果。
- 缺点:
- 计算复杂度较高,不适合大规模数据集。
- 一旦合并或分割了簇,就不能更改。
- 对于距离的测量和聚类树的剪枝方法选择敏感。
- 优点:
-
DBSCAN算法:
- 优点:
- 不需要预先指定聚类数量。
- 能够识别并处理噪声点。
- 可以发现任意形状的簇。
- 对于数据的输入顺序不敏感。
- 缺点:
- 对参数(如邻域半径和最小点数)敏感。
- 在高维数据上效果不佳,因为“维度灾难”。
- 对于密度不均匀的数据集,可能无法得到好的聚类结果。
- 优点:
-
谱聚类算法:
- 优点:
- 适用于发现非球形或复杂形状的簇。
- 能够在较低维度上表示高维数据。
- 对于噪声和离群点不敏感。
- 缺点:
- 需要预先指定聚类的维度。
- 计算复杂度较高,尤其是在计算相似度矩阵和特征值分解时。
- 对于大规模数据集可能不够高效。
- 优点:
-
高斯混合模型(GMM):
- 优点:
- 能够表示各种形状的簇,包括非凸形状。
- 提供了数据点属于各个簇的概率信息。
- 可以使用EM算法来估计模型参数。
- 缺点:
- 需要预先指定簇的数量。
- 对初始参数敏感,可能导致局部最优解。
- 计算复杂度较高,尤其是在处理大规模数据集时。
- 优点:
-
模糊C均值(FCM)算法:
- 优点:
- 允许一个数据点属于多个簇,具有模糊成员关系。
- 对于数据点的隶属度进行了量化,提供了更多信息。
- 缺点:
- 需要预先指定簇的数量。
- 对初始参数选择敏感。
- 计算复杂度较高,尤其是在迭代过程中。
- 优点:
实践思路:热点事件的关键词提取与智能分类
HanLP关键词提取
Java使用HanLp提取关键词短语,首先HanLp是开源免费的,可以直接引入依赖
HanLP | 在线演示 (hankcs.com)https://hanlp.hankcs.com/
上面的网站为官方网站,里面有详细的教程。
2.x RESTful版
仅数KB,适合敏捷开发、移动APP等场景。简单易用,无需GPU配环境,秒速安装,强烈推荐。HanLP官方支持Java,Python,Golang语言。
以下为Java引入Maven包
<dependency>
<groupId>com.hankcs.hanlp.restful</groupId>
<artifactId>hanlp-restful</artifactId>
<version>0.0.10</version>
</dependency>
1.x版
1.x版内部算法经过工业界和学术界考验,配套书籍《自然语言处理入门》open in new window已经出版。
<dependency>
<groupId>com.hankcs</groupId>
<artifactId>hanlp</artifactId>
<version>portable-1.8.3</version>
</dependency>
我个人使用下来2.x版会更准确一点,但是速度会慢一些。
使用示例代码
/**
* 提取事件关键词
*
* @param eventName 事件内容
* @return keyword 关键词
*/
public String getKeyword(String eventName) {
//提取三个关键词
List<String> keywordList = HanLP.extractKeyword(eventName, 3);
return keywordList.toString();
}
核心就是HanLP类下的extractKeyword方法传参为事件内容,数字为提取的关键词个数。
1.x版本测试输入:
{
"id": 1,
"eventName": "占道摆摊影响交通",
"eventKeyword": "",
"status": 0
}
测试输出:
{
"code": 200,
"desc": "成功",
"data": "[摆摊, 占道, 影响]"
}
可见1.x版本的提取结果不是很理想
业务逻辑:新热点事件的智能分类
当一个新的热点事件出现时,我们首先对其进行关键词提取。然后,将这些关键词与数据库中已存储的热点事件关键词进行比对。如果发现一个以上的相同关键词,我们可以利用大模型进一步比对两个热点事件,判断它们是否属于同一事件。
优化逻辑:事件类型与关键词的动态管理
在数据库中,我们维护一个event_keywords
表,用于存储热点事件的关键词。当表中没有数据时,我们通过大模型对比两个事件,生成原始的事件类型。
随着新事件的不断加入,我们通过提取的关键词与现有事件类型进行模糊匹配,利用大模型辅助判断事件是否属于同一类型。如果是,我们增加该事件类型的计数;如果不是,我们则将大模型返回的新事件类型加入数据库,并标记事件数量为1
数据库设计表:
event_detail表
event_type表
实现代码待补充