我有大量的字符串,我知道它们是由一组有限的模式构建的,但我不知道是哪些。我需要在一个非常大的数据集上相当快地计算这些模式。
例如,这组模板(我不知道):
"Hello, my {0} is: {1}"
"{0} has left our team."
"{0} has joined the team {1}!"
匹配下面的一组行,我唯一的:
Hello, my name is: Slim Shady
Mike has left our team.
Mike has joined the team Liquid!
Hello, my name is Nikole
Nick has joined the team Spirit!
Elizabeth has left our team.
任务:查找相似字符串中的模式。也就是说,在文本中找到允许您自动提出此类模式的模式。可以有很多行。
到目前为止,我已经提出了使用 N-gram 的编辑距离之类的方法。
但这东西的范围比我需要的要广,运行时间的重要性不亚于寻找模式的准确性。
因为我的单词可以完全匹配且没有错误,在我看来,在这里你可以通过某种方式提高性能。
我想制作一个单词的字母表,而不是字母,这样就可以通过单词来搜索句子。
UPD:以防万一,我会澄清在编译时既没有模板也没有字符串本身。字符串作为输入提供给程序,没有人会给我们模板。
UPD2:我们需要在已经通过的行中实时查找模式,以便在接下来我们可以找到它们的匹配项。
(评论)假设我们有
nofferМама наша мыла раму和mofferМама мыла мою раму。它必须是一个模板Мама {0} мыла {1} раму或两个模板:Мама {0} мыла раму,Мама мыла {0} раму? 这样的例子还有很多。为了避免这样的歧义,要么你需要更清楚地了解你有什么样的任务,要么你需要指出一个具体的含义,这样你才能找到一个独特的解决方案。
模式应尽可能通用,即 Мама {0} мыла {1} раму. 但它适用于类似的线路。不只是一种模式{0}
(评论)问题来了,为什么不使用模式
{0}?这是最一般的。问题似乎是需要在模板集上引入某种顺序。一般来说,这个顺序是非线性的。它需要以某种方式线性化。这似乎是一项艰巨的任务。如果你说你为什么需要这个任务,你可以考虑一下。
这是整个任务: D 我需要找到这些线条的模式,以便将高度相似的线条组合成模式,例如,您可以采用标准形式的相似度百分比。
UPD3:模板应该连接相似的字符串。类似的字符串将被视为匹配的字符串N%。
如果模式的数量有限并且它们在数据中分布相当均匀,那么拥有非常大的数据集就没有意义了。您还可以从较小的数据集中获取模板。
正面解决方案如下所示:
你可以想出一些从字符串中接收单词的函数(例如,只用空格分隔并去掉标点符号)。
然后,制作一个频率词典。例如,单词“Hello”在示例集中出现了两次。另外,你还可以统计某个词在某个位置出现的次数,这样以后你不仅可以查看词的出现频率,还可以查看词出现在3-5个位置区域的频率, 例如。
现在,对于任何单词,您都可以假设它是否是模板的一部分。如果这个词在当前位置附近的某个地方经常出现,那么它很可能是模板的一部分。
对于数据集中的每一行,我们构建一个模板并只保留唯一值。
在这种情况下,必须对数据进行两次处理(第一次构建频率字典,第二次 - 模式),因为我们首先需要有关整个集合是什么的信息。
Neuronka 可以帮助您设置阈值并获得更好的结果。
在算法的第一步,整个第一行“ABC”将被切割成单词,这些单词将沿着树排列(线性顺序A-> B-> C)
收到类似的(“AEC”)字符串作为输入后,您将在树中绘制另一条路径,就在其中一个级别中,您将有一个分支,然后会收敛:
因此,您的每一行都只是穿过这棵树的一条路径。
在为某个节点输入足够多的传出分支之后,这些分支会收敛回来,我们可以得出结论,这里有一个任意参数。
也许您想使某种“神经元”失明?实际上,您的问题需要更多细节(以及了解您的数学仪器处于什么水平?)。您的任务将在机器学习的一个部分中找到详尽的解决方案- “与老师一起学习” !要识别模式和“模式”,请注意CAEP算法(通过聚合新兴模式进行分类)... PS 一切顺利,“蟒蛇”来帮忙!
首先,我们用一种算法来寻找字符串之间的匹配百分比。
我们从 2 个表创建一个数据库:
模式 - 存储模式的位置 队列 - 存储原始消息的位置。
接下来,算法是:
我们将消息添加到队列中,并通过部分搜索算法检查模式。如果 % 满足我们的要求,那么我们就说找到了模式并从队列中删除了条目。
如果没有找到,那么我们通过部分比较将条目与队列中的每个条目进行比较。
当我们找到最相似的选项时,我们开始切断所有不必要的,形成一个模板。
我不知道速度会如何,但你可以使用各种技巧,例如,将太短的字符串与太长的字符串匹配是没有意义的,等等。
这样就完成了参考书的初始填写。
主算法正在启动:我们得到“vremyazapuska”算法的开始日期。在循环中读取字符串。从该行开始,尝试形成一个模板(第 3,4 点)和一个纯模板(5)。如果模式等于输入字符串(并且该字符串不在 Exceptions 目录中),则该字符串将包含在无模式字符串目录中,并添加“vremyazapuska”字段。有一个过渡到下一个迭代处理下一行。
已处理的行将从日志中删除。开始检查非模式字符串的数量。如果大于 50,则程序退出。
无模板字符串表由人工或辅助算法解析(收集新的无关紧要的词或地址,如有必要,在模板目录中添加新模板)。如果不能对字符串做任何事情(没有无意义的词和引用) - 它将被添加到异常目录中。然后从通配符字符串表中删除该字符串。
无模板字符串表为空后,运行主要的字符串解析算法。