Php 获取MySQL数据库中重复次数最多的相似字段

Php 获取MySQL数据库中重复次数最多的相似字段,php,mysql,sql,levenshtein-distance,Php,Mysql,Sql,Levenshtein Distance,假设我们有一个数据库,如: 行动: -------------------------------------------------------- id | Action_name | user_id| -------------------------------------------------------- 1 | John reads one book | 1 2 |

假设我们有一个数据库,如:

行动:

-------------------------------------------------------- id | Action_name | user_id| -------------------------------------------------------- 1 | John reads one book | 1 2 | reading the book by john | 1 3 | Joe is jumping over fire | 2 4 | reading another book | 2 5 | John reads the book in library | 1 6 | Joe read a book | 2 7 | read a book | 3 8 | jumping with no reason is Ronald's habit| 3 然后使用

levenshtein()
但是这个根本没有性能

假设我想对一个大数据库和几个不同的表做同样的事情。 这将摧毁我的服务器

还有更好的主意吗

在 levenshtein()函数是作为MySQL函数实现的,但首先,您认为它有足够的性能吗?那么,如何在我的案例中使用它呢? 也许一个自连接的van可以解决这个问题,但我不太擅长sql

*类似的动作,是指有超过X%的常用词的动作


**更多信息和说明:**

  • 我仅限于PHP和MySQL

  • 这只是一个例子,在我的实际项目中,动作都是很长的段落。这就是为什么表演是个问题。真实的场景是:用户输入了几个项目的项目描述,这些数据可能太相似(用户将有相同的工作领域),我想自动填充(基于以前的填充)下一个项目的描述,以节省时间

  • 如果您能提供任何实用的解决方案,我将不胜感激。我检查了与NLP相关的解决方案,虽然它们很有趣,但我不认为它们中的许多是准确的,可以使用PHP实现

  • 输出应该是有意义的,并且像所有其他项目一样是适当的段落。这就是为什么我想从以前的选择



  • 感谢您明智的回答,如果您能解释一下情况,我将不胜感激。

    您所说的是文本聚类过程。您试图找到相似的文本片段,并任意选择其中一个。我不熟悉任何进行这种形式的文本挖掘的数据库

    正如您所描述的,一种非常基本的文本挖掘技术可能会奏效。创建一个术语文档矩阵,其中包含除用户名以外的所有单词。然后利用奇异值分解得到最大奇异值和向量(这是相关矩阵的第一主分量)。类似的活动应该沿着这条路线进行


    如果你的词汇量有限,并且在表格中有术语,你可以通过重叠单词的比例来衡量两个动作之间的距离。您是否有操作中所有单词的列表?

    首先,您必须决定是将给定输入与所有现有文本进行比较,还是对所有文本进行两两比较。您的问题要求后者,但您概述的应用程序听起来更像前者

    如果只将单个输入与数据库进行比较,我希望levenshtein距离计算足够快,可以达到中等数据库大小。除非存储关于文本库当前内容的某种形式的中间数据结构,否则可能没有什么方法可以使事情变得更快。为每一个新的输入重新计算任何东西的成本可能同样高

    如果要对每一对进行比较,则对每一对进行levenshtein计算将花费太多时间。你必须想出一些其他的相似性概念。我想到的第一件事是一个单词,它对一个单词的不同形式有一定的弹性。您可以将所有段落插入到该树中。在后缀树通常存储单个指针的地方,您可能希望存储一对索引,一个标识数据库行,另一个表示该行文本中的位置。在构建树之后,您可以遍历它来识别公共子字符串,并为相应的子字符串对增加一些相似性计数器。您必须进行一些实验来调整此度量。在递增计数器之前,您可能希望为公共字符串施加最小长度。由于长文本即使在语义上不相关,也有更大的机会出现常用词,因此您可能需要以某种方式补偿长度。我怀疑是否有一种规范的方法可以做到这一点

    这种方法听起来也很有趣,您也应该能够在PHP中实现它。这种方法对词形的变化更为敏感,即使词根是相同的。另一方面,为存储在数据库中的矩阵保留一个合适的矩阵,并在更新主文本表时保持该结构的同步可能更容易。这两种方法与levenshtein距离有一个根本区别:它们不太关心整体顺序。我相信这对你们来说是件好事,因为他们会考虑课文“约翰去湖里游泳后看书”,更类似于“在湖里游泳,乔读了一本书”,而不是LevsHeTin距离。


    您的示例表明,您不仅要对相似性进行排序,还要确定聚类边界,即说“这些形成一个组”和“那些属于不同的组”。这不会有一个明确的界限,所以你也必须尝试启发式。除非总是选择最相似的文本,或者k个最相似的文本,这就足够了。无论如何,我会先关注相似度计算,然后添加用户名替换之类的内容。

    下面是一个例子:检查mysql中的
    soundex
    函数。这对你很有帮助。@mdo,谢谢,我之前检查过,这是因为一个术语和字段之间的相似性,我想要的是所有行之间的相似性itself@Pushpesh,我不知道如何实现它,检查我表格的所有行谢谢你的建议,这个表格只是一个样本,事实上,我有一个包含长段落的表格,每个段落可以超过10行,表格中会有很多这样的内容!你认为把所有的单词都列出来,然后照你说的去做是实用的吗?是
    select replace(a.action_name , b.user_name) from actions_tbl a, user_tble b where a.user_id = b.user_id group_by
    
    levenshtein()