我需要提取一个人的电子邮件地址。我已经在Spacy中训练了NER模型,并提供了一些示例,但没有运气。它必须经过数千个示例的培训才能获得令人满意的结果。因此,我现在开始研究令牌匹配器以获取电子邮件地址。有人做过这个吗?有更好的方法吗?
答案 0 :(得分:3)
电子邮件地址应易于提取-您可以编写令牌模式,甚至可以查看令牌的import xlwt, csv, os, pandas as pd
#section 1: - make a dir called scp
os.system("mkdir /Users/user/documents/scp/")
#scp to server to dl csv files.
os.system("scp user@server:/tmp/groups/* /Users/username/documents/scp/")
#section 2: - convert csv to workbook
csv_folder = "scp/"
book = xlwt.Workbook()
for fil in os.listdir(csv_folder):
sheet = book.add_sheet(fil[:-4])
with open(csv_folder + fil) as filname:
reader = csv.reader(filname)
i = 0
for row in reader:
for j, each in enumerate(row):
sheet.write(i, j, each)
i += 1
#
#Section 3: - make the top rows column headers and change color to blue - this is the header section not working
pd.core.format.header_style = None
font_fmt = workbook.add_format({'font_name': 'Arial', 'font_size': 10})
header_fmt = workbook.add_format({'font_name': 'Arial', 'font_size': 10, 'bold': True})
worksheet.set_column('A:A', None, font_fmt)
worksheet.set_row(0, None, header_fmt)
###################################################################################
#Section 4: - save the excel worksheet
book.save("list.xls")
#delete individual csv folder
os.system("rm -r /Users/username/documents/scp/")
属性,如果该属性类似于电子邮件地址,则会返回like_email
。
要了解电子邮件地址令牌与句子其余部分的关系,一种方法是查看语法并使用句法依赖项(True
)编写自己的提取逻辑,语音标签(token.dep_
)或子树(token.pos_
)。
下面是一个展示想法的示例:
电子邮件地址附加在动词“ is”上,动词“ is”附加在句子“ email address”的主题上。专有名词“ Peter”被附加到带有标签token.subtree
(正)的主题上。因此,电子邮件地址的所有者是Peter。如果您的句子看起来像这样,则可以编写一个函数,根据标记及其关系提取此信息。
当然,这并不总是那么容易–您的文本看起来可能非常不同,并且可能必须为各种不同的结构编写逻辑。有关更多信息和示例,请参见combining models and rules上的文档。
答案 1 :(得分:0)
请尝试haptik-ner,尽管它是聊天机器人专用的,但您也可以使用该代码检测电子邮件。
答案 2 :(得分:0)
我已经使用句法依赖性来涵盖几种类型的规则来识别关系:
请参见下面的代码
for email in doc:
print(email.text, email.dep_, email.ent_type_, email.pos_, email.head)
if(email.like_email == True):
if email.dep_ in ("attr", "dobj", "punct"):
subject = [w for w in email.head.lefts if w.dep_ == "nsubj" or w.dep_ == "nsubjpass"]
if subject:
subject = subject[0]
per = extract_person_names(subject.text)
if(per.text != "null"):
relations.append((per, email))
else:
print("no entity")
elif email.dep_ == "pobj" and email.head.dep_ == "prep":
if ((doc[email.head.i-1]).ent_type_ == 'PERSON'):
relations.append((doc[email.head.i-1], email))
答案 3 :(得分:0)
我偶然发现了 Alexander Crosson 关于这个主题的中等帖子 https://medium.com/@acrosson/extracting-names-emails-and-phone-numbers-5d576354baa
这个不错的基于正则表达式的方法对我有用(只要电话号码是 10 位数字(无国家代码))-
import re
def get_phone_numbers(string):
r = re.compile(r'(\d{3}[-\.\s]??\d{3}[-\.\s]??\d{4}|\(\d{3}\)\s*\d{3}[-\.\s]??\d{4}|\d{3}[-\.\s]??\d{4})')
phone_numbers = r.findall(string)
return [re.sub(r'\D', '', num) for num in phone_numbers]
def get_email_addresses(string):
r = re.compile(r'[\w\.-]+@[\w\.-]+')
return r.findall(string)