在数千个文件中查找重复的字符串模式

数据挖掘 分类 nlp 文本挖掘
2022-03-16 09:13:55

我有如下文件:https ://pastebin.com/5mkXY1aU

这些是通过填写预定义的表格来创建的,因此有成千上万的表格可以匹配一个模式。

为了简单起见,我将尝试给出更通用的示例。

假设我有数千个使用不同模式创建的文档,例如`

- "sjkghkjfs <data> skjfs <data> kjskdfjsfkjs <data> sahkj";
- "tretyer erytewr fskjdf <data> trjk";
- "sdhfjsdhj <data> <data> <data> dsjadh";
- "<data> djfhsdk";` and so on.

<data>可以是任何字符串。

我事先不知道这些模式是什么。我想找出他们。

我可以很容易地想出一些蛮力解决方案,但它显然不适用于如此大量的数据。

在我看来,这听起来像是一个可能已经解决的问题。

我想知道是否有一些现成的软件工具可以直接用来解决这个问题,或者至少是一个库?

如果没有一个,我应该如何以最轻松的方式解决它?

找出这些模式是一次性的任务,所以我不喜欢花几天时间从头开始实施解决方案。

1个回答

看起来你想要新词发现?

因为一千不是什么大不了的事

只需构建 ngram 的文件名,数一下就可以了。

你可以使用Trie来存储字符串计数,减少内存开销,我可以提供一个 dict 方式(在 python 中):

from collections import defaultdict, Counter

# for memory effcient, you would need trie here
# t = Trie()
t = defaultdict(int)



filenames = ["sjkghkjfs <data> skjfs <data> kjskdfjsfkjs <data> sahkj", 
            "tretyer erytewr fskjdf <data> trjk",
            "...."]

# some preprocess, tokenize to  sentence , to  words , filter useless one

def ngrams(s, start, end):
    for i in range(start, end+1):
        if len(s) > i:
            for j in range(i, len(s)):
                yield s[j:j+i]

# Suppose you need same string with length 4 ~ 6
for s in filenames:
    for word in ngrams(s, 4, 7):
        t[word]+=1

# Suppose you need most_common 5
print(Counter(t).most_common(5))

此外

你可以

  1. 首先标记文件名。
  2. 计算 tf-idf 或 word entropy 去除无用词
  3. 然后做类似上面的事情。

如果你有一组 traget 字符串,word2vec 可能是一个很好的工具,你可以用它来搜索相似域中的字符串。