我从网站上抓取文章,它们包含重复的名称(后面缺少空格),像这样:
">Bakhtiar Mohammed AbdullaBakhtiar Mohammed Abdulla对博奇电脑的法医分析显示,她观看了英国Isil武装分子穆罕默德·恩瓦济(Mohammed Emwazi)或圣战分子约翰(Jihadi John)斩首的视频。
我如何找到这些实例并删除重复的(但保留一次名称)?
我尝试了NER与space (en_core_web_sm)。PyCharm的输出是:
Mohammed AbdullaBakhtiar Mohammed AbdullaA PERSON
Ms Borch’s ORG
Mohammed Emwazi PERSON
在Jupyter Notebook中运行该脚本,输出根本不包含该名称:
Ms Borch’s ORG
Mohammed Emwazi PERSON
Jihadi John PERSON
British NORP
我的代码片段:
import spacy
NER = spacy.load("en_core_web_sm")
raw_text="text above"
text1 = NER(raw_text)
for word in text1.ents:
print(word.text,word.label_)
类似地,有时某物的一部分是重复的,像这样:人们迎接抵达德国慕尼黑火车站的难民。人们迎接抵达慕尼黑火车站的难民。怎么把第二部分去掉用空格代替呢?在对源文本应用space之前,我们可以尝试从源文本中删除这些重复的名称。下面是使用正则表达式的一种方法。
import re
inp = "Bakhtiar Mohammed AbdullaBakhtiar Mohammed AbdullaA forensic analysis of Ms Borch’s computer revealed that she had watched videos of the beheadings carried out by Mohammed Emwazi or Jihadi John, the British Isil fighter"
output = re.sub(r'(w+(?: w+)+)1(w*)', lambda m: m.group(1) + (" "+ m.group(2)) if m.group(2) != " " else m.group(2), inp)
print(output)
这个打印:
对Borch女士电脑的法医分析显示,她观看了英国Isil战士Mohammed Emwazi或Jihadi John砍头的视频
上面使用的正则表达式匹配一个名称,然后紧跟着相同的名称,没有分隔空格。替换还具有确保保留的单个名称后面后跟一个空格的逻辑。