如何动态识别列表中的重复模式,然后将其删除?

2024-09-27 21:29:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要在列表中的字符串中找到重复出现的模式,然后从字符串中删除这些模式。你知道吗

关键是去掉文档标题的网站名称,这样Amet urna tincidunt efficitur - The Guardian就变成了Amet urna tincidunt efficitur。你知道吗

使用regex做这件事很简单。但问题是,具体的模式事先并不知道,只是它不断重复出现。你知道吗

示例数据:

data = ["Amet urna tincidunt efficitur - The Guardian",
        "Yltricies hendrerit eu a nisi - The Guardian",
        "Faucibus pharetra id quis arck - The Guardian",
        "Net tristique facilisis | New York Times",
        "Quis finibus lacinia | New York Times",
        "My blog: Net tristique facilisis",
        "My blog: Quis finibus lacinia"]

我们可以很容易地看到子串- The Guardian| New York TimesMy blog:不断重复出现。如何动态识别这些重复出现的模式,然后删除它们?你知道吗

预期输出:

data = ["Amet urna tincidunt efficitur",
        "Yltricies hendrerit eu a nisi",
        "Faucibus pharetra id quis arck",
        "Net tristique facilisis",
        "Quis finibus lacinia",
        "Net tristique facilisis",
        "Quis finibus lacinia"]

Tags: thenewnet模式yorkguardianametquis
2条回答

基本上,您想要一些过滤在一组正确的文档中出现最多的单词的东西吗? 只需使用sklearn中的CountVectorizer和所需的切割参数。这是使用max_df参数完成的。根据文档(CountVectorizer Documentation)描述,max\u df确定以下内容:

在构建词汇表时,忽略文档频率严格高于给定阈值的术语(语料库特定的停止词)。你知道吗

这样,你就可以忽略某些频率的单词。所以,只要做相反的过程,以消除单词,超过了限制,你想要的。你知道吗

例如:

from nltk import word_tokenize
from sklearn.feature_extraction.text import CountVectorizer

data = ["Amet urna tincidunt efficitur - The Guardian",
        "Yltricies hendrerit eu a nisi - The Guardian",
        "Faucibus pharetra id quis arck - The Guardian",
        "Net tristique facilisis | New York Times",
        "Quis finibus lacinia | New York Times"]

vectorizer = CountVectorizer(max_df=0.3, lowercase=False, strip_accents=None)
X = vectorizer.fit_transform(data)

vocab = vectorizer.vocabulary_
cv_matrix = X.todense()
new_data = []

for idx_t, text in enumerate(data):
    tokens = word_tokenize(text)
    cv_matrix_ = cv_matrix[idx_t].tolist()[0]
    new_text = []

    for tok_ in tokens:
        if tok_ in vocab.keys():
            new_text.append(tok_)

    new_data.append(" ".join(new_text))

结果:

>>> new_data
['Amet urna tincidunt efficitur',
 'Yltricies hendrerit eu nisi',
 'Faucibus pharetra id quis arck',
 'Net tristique facilisis',
 'Quis finibus lacinia']

您可以迭代地查找常见的模式,并创建一个最常见模式的列表来删除它们。听起来你有一个足够大的数据集,它不可能是100%正确的这一点。你知道吗

因为您提到的模式只出现在开头或结尾,所以您可以这样做:

from collections import Counter

data = [
    "Amet urna tincidunt efficitur - The Guardian",
    "Yltricies hendrerit eu a nisi - The Guardian",
    "Faucibus pharetra id quis arck - The Guardian",
    "Net tristique facilisis | New York Times",
    "Quis finibus lacinia | New York Times",
    "My blog: Net tristique facilisis",
    "My blog: Quis finibus lacinia",
]


def find_common(data, num_phrases=50):
    phrases = Counter()
    for sentence in data:
        for n in range(2, 6):
            phrases[" ".join(sentence.split()[:n])] += 1
            phrases[" ".join(sentence.split()[-n:])] += 1

    return phrases.most_common(num_phrases)

find_common(data, 8)

Out[145]: 
[('The Guardian', 3),
 ('- The Guardian', 3),
 ('York Times', 2),
 ('Net tristique facilisis', 2),
 ('New York Times', 2),
 ('| New York Times', 2),
 ('Quis finibus lacinia', 2),
 ('My blog:', 2)]

从中,你可以发现“《卫报》”、“《纽约时报》和“我的博客”是常见的网页名称模式。然后,您可以从数据中删除这些内容并再次运行,对其进行迭代,直到您感觉得到了其中的大部分内容。你知道吗

相关问题 更多 >

    热门问题