提问人:Mostafa Bouzari 提问时间:11/14/2023 更新时间:11/17/2023 访问量:42
如何从重复(重复)段落中清除长文本?
How to clean a long text from repetitive (duplicate) Paragraphs?
问:
所以我在 DataFrame 中有 100000 行,所有行都包含一个文本列。我想在进一步分析之前清理它。我找到了这个答案,它给了我很多信息。但是,即使在干净的列表中,我仍然有重复的句子。需要注意的是,文本的语言是德语。
下面是示例文本和代码。
from nltk.tokenize import sent_tokenize
corpus = '''
Monsanto:Bayer will keinen Genpflanzenzwang für Europa Nach derFusion mit dem US-Unternehmen Monsantowill der ChemiekonzernBayernicht zwangsläufig genetisch verändertes Saatgut in Europa vertreiben. Das sagte Bayer-Chef Werner Baumann derSüddeutschen Zeitung."Wir wollenMonsantonicht übernehmen, um genveränderte Pflanzen in Europa zu etablieren", sagte Baumann. Wenn die Gesellschaft
gentechnisch verändertes Saatgut ablehne, akzeptiereBayerdies.
"Und wir werden nicht über Umwege versuchen, etwas anderes
durchzudrücken", sagte Baumann weiter. Monsantohabe zu Beginn des Jahrzehnts versucht, die
Einführung von genveränderten Pflanzen in Europa gegen große
Widerstände voranzutreiben und sei dabei zu wenig auf Bedenken
eingegangen, sagte der Bayer-Chef. "Dieser Schuss ist nach hinten losgegangen." Unter
seiner Führung solle damit Schluss sein, kündigte Werner Baumann. "Wir bei Bayer haben einen partnerschaftlichen Ansatz, mit
unseren Kunden und allen gesellschaftlichen Gruppen umzugehen."
Nach diesem Maßstab werde man auch das kombinierte
Saatgutgeschäft führen. Außerdem werde auch er persönlich den
Dialog mit Kritikern stärker suchen. Die Befürchtungen, Gen-Saatgut könne verstärkt nachEuropakommen, waren gewachsen, nachdem der Deal zwischen Bayer und Monsanto öffentlich wurde. Umwelt- und Naturschutzverbände kritisieren die Übernahme heftig. "Sollten die Kartellbehörden die
Fusion durchwinken, würde der neu entstehende Megakonzern eine
marktbeherrschende Stellung im Bereich Saatgut, Gentechnik und
Pestizide bekommen", sagte Heike Moldenhauer, Gentechnikexpertin beim BUND. Sie fürchtet, dass der Konzern künftig diktieren
wolle, was Landwirte anbauen und welche Produkte auf dem Markt
verfügbar sind. Zudem würde die Umwelt durch noch mehr
Monokulturen und Gentechpflanzen leiden. Der Geld-Newsletter Geld oder Leben? Warum nicht beides! Jeden Dienstag bringt unser Newsletter Finanzwelt und Familie, Börse und Beziehung in Ihrem Postfach zusammen. Mit Ihrer Registrierung nehmen Sie dieDatenschutzerklärungzur Kenntnis. Vielen Dank! Wir haben Ihnen eine E-Mail geschickt. Diese E-Mail-Adresse ist bereits registriert. Die Übernahme von Monsanto ist die teuerste, die ein
deutsches Unternehmen jemals gewagt hat. Rund 66 Milliarden
Dollar (58,8 Milliarden Euro) will Bayer für den Saatgutanbieter zahlen. Allerdings
müssen der Übernahme noch die Wettbewerbshüter in etwa 30
Ländern zustimmen. Durch den Kauf wird Bayer zum weltweit führenden Anbieter für Saatgut und
Pflanzenschutzmittel. Zwar ist der Kauf laut Marktexperten für Bayer
strategisch sinnvoll, weil sich die beiden Unternehmen ergänzen. Monsanto steht in Europa aber seit Jahren wegen
seiner gentechnisch veränderten Produkte in der Kritik. Nicht zuletzt,
weil der Konzern den UnkrautvernichterGlyphosatvertreibt, der im
Verdacht steht, krebserregend zu sein. Nach derFusion mit dem US-Unternehmen Monsantowill der ChemiekonzernBayernicht zwangsläufig genetisch verändertes Saatgut in Europa vertreiben. Das sagte Bayer-Chef Werner Baumann derSüddeutschen Zeitung."Wir wollenMonsantonicht übernehmen, um genveränderte Pflanzen in Europa zu etablieren", sagte Baumann. Wenn die Gesellschaft
gentechnisch verändertes Saatgut ablehne, akzeptiereBayerdies.
"Und wir werden nicht über Umwege versuchen, etwas anderes
durchzudrücken", sagte Baumann weiter. Monsantohabe zu Beginn des Jahrzehnts versucht, die
Einführung von genveränderten Pflanzen in Europa gegen große
Widerstände voranzutreiben und sei dabei zu wenig auf Bedenken
eingegangen, sagte der Bayer-Chef. "Dieser Schuss ist nach hinten losgegangen." Unter
seiner Führung solle damit Schluss sein, kündigte Werner Baumann. "Wir bei Bayer haben einen partnerschaftlichen Ansatz, mit
unseren Kunden und allen gesellschaftlichen Gruppen umzugehen."
Nach diesem Maßstab werde man auch das kombinierte
Saatgutgeschäft führen. Außerdem werde auch er persönlich den
Dialog mit Kritikern stärker suchen. Jetzt teilen auf:
'''
sentences = sent_tokenize(corpus,language='german')
duplicates = []
cleaned = []
for s in sentences:
if s in cleaned:
if s in duplicates:
continue
else:
duplicates.append(s)
else:
cleaned.append(s)
cleaned
我删除了大部分重复的句子,但在这种情况下,我有一半的句子仍然保留在干净列表中,我怎样才能完全清理这段文字。这是剩下的一半句子:
Nach derFusion mit dem US-Unternehmen Monsantowill der ChemiekonzernBayernicht zwangsläufig genetisch verändertes Saatgut in Europa vertreiben
答:
该函数根据标点符号拆分语料库。文字“我在这里。You are there.“ 将拆分为 .如果句子之间没有标点符号,则分词器不会将它们识别为单独的句子。因此,文本“我在这里你在那里”将如下所示:,它不是“我在这里”或“你在那里”的重复。sent_tokenize()
["I am here", "You are there"]
["I am here You are there"]
我假设您无法清理输入数据以包含正确的标点符号。相反,我会尝试检查如下子字符串:
sentences = ["I am this You are there", "I am here", "You are there", "I am here"]
sentences = sorted(sentences, key=len)
result = []
for i, sentence in enumerate(sentences):
for j, other_sentence in enumerate(sentences):
if ((i !=j) and (sentence in other_sentence)):
sentences[j] = other_sentence.replace(sentence, "")
# TODO: cleanup
result.append(sentence)
result = list(filter(lambda x: x != '', result))
print(result) # ['I am here', 'You are there', 'I am this ']
首先,我们按长度对句子进行排序。这很有用,因为只有较短(或等长)的字符串才能成为较长字符串的子字符串。对于排序列表中的每个句子,我们将其与所有其他句子(除了它本身)进行比较,以查看它是否是另一个句子的子字符串。如果是,我们从另一个句子中删除子字符串。无论哪种方式,我们都会将其添加到列表中。这只有在我们先排序后才有效。在未排序的列表中,如果索引 2 处的字符串是索引 0 处的字符串的子字符串,则第一个字符串即使包含重复项,也已添加到该字符串中。最后,我们过滤掉所有空字符串(这些是原始重复项)。result
result
请注意,这是一个非常低效的算法,因为我们将每个元素与列表中的所有其他元素进行比较。如果你有一个非常短的句子可以包含在其他句子中,你也会遇到问题。F.D.(英语:F.D.) 将导致这不是我们真正想要的。["I am here", "I am here today to make a speech"]
["I am here", " today to make a speech"]
我找到了答案。问题是没有正确找到句子。因此,需要一种更复杂的算法。但是,除了 NLTK 之外,还有其他库可以更好地工作。我尝试了 Spacy 并按预期工作。在运行此代码之前,必须先安装 de_core_news_md:
sentences = [sent.text for sent in spacy.load("de_core_news_md")(corpus).sents]
duplicates = []
cleaned = []
for s in sentences:
if s in cleaned:
if s in duplicates:
continue
else:
duplicates.append(s)
else:
cleaned.append(s)
' '.join(cleaned)
评论
Nach derFusion ...
.