【发布时间】:2017-05-01 22:06:15
【问题描述】:
我在“类别”中有字符串模式(“规则”)。例如:
类别 1
- lorem ipsum dolor sit amet
- consectetur adipiscing 精英
- fusce sat amet ante nisi
- lorem ut sem interdum molestie
- suspendisse non lorem ut sem interdum molestie
类别 2
- vivamus porta non metus egestas finibus
- nam convallis augue nec laoreet pretium
- turpis velit cursus enim ac suscipit risus turpis in metus
现在,我希望能够根据这些规则对字符串进行“分类”。假设我们想找出字符串fusce laoreet amet ante nisi 属于哪个类别。我当前的实现将使用levenshtein distance 实现并发现字符串大多“看起来像”fusce sit amet ante nisi,因此,类别是Category1。
假设我们要对vivamus vel lorem imperdiet sit 进行分类。因为我在levenshtein distance 算法上设置了字符串长度的 1/5 阈值(即字符串必须与其匹配至少 80% 相似),所以字符串将保持“未分类”。
在这种情况下,我将继续使用以下算法...
从每个类别中,我将提取“常用词”——即在类别内的规则之间重复的词。在某种程度上,这些是该类别中的主导词。所以,我们将有:
类别 1
- lorem: 3
- 坐:2
- amet: 2
- sem: 2
- interdum: 2
- 骚扰:2
类别 2
- 梅图斯:2
- turpis: 2
现在我将逐字拆分vivamus vel lorem imperdiet sit 字符串,并根据类别的“主导词”中存在多少字符串词为每个类别分配一个值。即:
Category1 的值为 3 (lorem) + 2 (sit),Category2 的值为 0(我正在分类的字符串的拆分词与类别中的主导词之间不匹配)。价值最高的类别“获胜”。
简而言之,我的算法是:
- 使用 levenshtein 距离和允许 1/5 的字符串变化的阈值,以找到最接近的匹配规则。
- 如果失败,请将我们要分类的字符串拆分为单词,并针对每个单词检查该单词在每个类别中的“主导”程度,从而为该类别创建一个值。最高价值的类别是我们的最佳猜测。
有没有更好的方法来做到这一点?你觉得这个算法有问题吗?有什么建议吗?
【问题讨论】:
标签: algorithm language-agnostic string-comparison levenshtein-distance