提取特定人的电子邮件地址的空间

时间:2019-04-02 09:31:35

标签: nlp spacy

我需要提取一个人的电子邮件地址。我已经在Spacy中训练了NER模型,并提供了一些示例,但没有运气。它必须经过数千个示例的培训才能获得令人满意的结果。因此,我现在开始研究令牌匹配器以获取电子邮件地址。有人做过这个吗?有更好的方法吗?

4 个答案:

答案 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_)。

下面是一个展示想法的示例:

enter image description here

电子邮件地址附加在动词“ 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)