词频分析方案


在我们做的调研产品中,最近有个词频分析的需求,其希望能从用户的文本作答中提取关键词并按照频次排序展示,同时可以从关键词得到其来源的完整作答。
在这里插入图片描述

预期的效果是这样的,当然前端如何展示我们并不是那么关心。从后端的角度,可以将需求做如下拆分:

  • 分词:将文本作答进行分词处理得到关键词;
  • 存储:需要将分词结果进行持久化的存储;
  • 查询:对分词的结果进行聚合并按频次排序,根据关键词召回其来源的作答;

在技术选型上,说起分词,首先想到的其实就是es。除了内置的分词功能外,es的聚合功能和搜索功能也满足对关键词进行聚合以及作答召回的要求。目前的作答数据是存储在mongoDB中,所以也考虑在业务中使用分词库对文本作答进行分词,并将关键词存储在mongoDB的arrary字段中,使用mongoDB的聚合和搜索能力来实现需求。最后,技术选型并不是非此即彼的,如果有需要,可以使用es和mongoDB共同实现功能。
下面我们将对三种方案进行详细的描述并分析其可行性以及优劣。

方案一:使用es进行存储

将文本作答直接存储在es中,利用指定的分词器进行分词,利用es的聚合能力对文本作答字段进行聚合分析,利用es的搜索能力进行作答的召回。
es的分词及搜索功能是基本不需要讨论的,因为es本身的定位就是一个搜索引擎。但是es的聚合功能尚需要调研一下其性能如何。我们都知道es搜索功能的实现是基于倒排索引的数据结构。倒排索引其本质就是一个K-V结构,K为term,V为docId。这种结构对于搜索(找到哪些文档包含固定关键词)非常有利,但是对于聚合(文档中包含了哪些关键词)是非常不利的。所以es除了广为人知的倒排索引外还有正排索引的数据结构。为了聚合功能,es在索引时还会建立正排索引,其名为doc_values,是一种列式存储的数据结构(实际上es的正排索引有列式和行式两种,行式主要用来聚合)。但是doc_values只对not_analyzed字段生效,对于需求中的analyzed字段,聚合时会生成fielddata并加载到内存中,这其实非常损耗性能和资源的。所以完全基于es来实现该功能存在性能问题。

方案二:使用mongoDB进行存储

利用开源分词库在业务代码中对文本作答进行分词,将关键词存入文档的arrary字段。对关键词字段建立索引,聚合时将关键词字段unwind后进行group by操作。召回时,对关键词字段进行match操作。需要注意的是,在召回时其实已经由模糊查询的搜索变为精确匹配的查询。
在该方案中,我们主要关注的是聚合时对关键词字段unwind后进行group by + sort操作,以及召回时对关键词字段进行match操作时的效率问题。基于对mongoDB多键索引的了解以及实际的测试,上面的两种操作都会用到索引。在业务场景下,最大参与人数为10W量级(在所有调研产品中这个量级也完全够用),假设平均每个作答有10个关键词,那么上面的两个操作可转化为:100w量级的数据在B+树索引下的group by操作以及查询操作,其性能上完全可以接受的。

方案三:使用mongoDB和es

在方案一中,我们提到es用来做text字段的聚合操作是不合适的。所以有考虑数据在mongo中存储一份,同时mongo来做聚合操作,es做召回操作。但是方案二中我们明确用mongo来做召回操作也是完全可以的。那么我们简单来比较下es和mongo各自的特点,以确定是否有必要同时使用mongo和es。
如果你对es和mongo都有一定的了解,那么es相比mongo而言,资源消耗更多,读写性能一般也不如mongo,其优势就在于牛逼的模糊查询和复杂搜索能力。在该场景下我们显然可以完全使用mongo来胜任需求。但是如果需求有升级,比如在召回的时候可以随机选择多个关键字,那么似乎用es更加合适。


如果觉得本文对您有帮助,可以请博主喝杯咖啡~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
选择合适的词频分析算法主要取决于你的具体需求以及待分析文本的特点。以下是几个关键因素和一些常用的词频分析方法概述: #### 关键因素考虑 1. **文本大小与复杂度**:如果你正在处理的小型文本集,则较为简单直接的算法就足够了;而对于大规模的数据集,需要考虑内存效率和计算时间,可能需要更高效的算法或分布式计算解决方案。 2. **资源限制**:硬件性能限制(如CPU、GPU或存储空间)也会影响算法的选择。某些算法对于硬件资源的消耗可能更高,因此需要根据实际设备能力调整策略。 3. **精确性和速度**:不同的算法在准确度和速度上会有差异。如果你对结果的精确度有较高要求,可能需要牺牲一些计算速度;反之亦然。 4. **特定领域应用**:有些算法更适合特定领域的文本处理,如自然语言处理(NLP)中的特定应用场景(情感分析、关键词提取等),需要选择能够针对这些特殊需求优化的算法。 #### 常见词频分析算法概述 1. **TF-IDF (Term Frequency-Inverse Document Frequency)**:这是一个常用的技术,在文本挖掘中广泛应用于文档相似度比较、关键词提取等。TF-IDF结合了词频(Term Frequency)和逆文档频率(Inverse Document Frequency),能较好地反映词语的重要程度。 2. **BM25**: 这种算法改进了TF-IDF,考虑到文档长度的影响,适合查询与文档的匹配度评价。 3. **基于词嵌入的方法**:如Word2Vec、FastText等,这些方法不仅关注词频,还考虑词的上下文信息,能够捕捉到词之间的语义关联,适用于需要深入理解文本结构的情况。 4. **深度学习方法**:使用神经网络模型,如LSTM、BERT等,可以在处理大型文本集时提供更高的精度,并能够自动学习特征表示。这类方法往往在复杂的NLP任务中效果显著。 #### 总结 选择合适的词频分析算法,首先明确你的目标和可用资源。考虑算法的精确性、计算效率、对特定领域的需求适应性等因素。通常,对于一般性的文本分析任务,TF-IDF是较为基础而实用的选择;而对于需要深入理解和分析文本语境的任务,基于词嵌入的方法或者深度学习技术则更为合适。最后,实践总是检验算法优劣的最好标准,建议在具体项目中尝试和对比不同的算法,以找到最适合当前情况的解决方案
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值