Nlp Spacy提取特定人员的电子邮件地址

Nlp Spacy提取特定人员的电子邮件地址,nlp,spacy,Nlp,Spacy,我需要提取一个人的电子邮件地址。我已经用几个例子在Spacy中训练了NER模型,但是运气不好。为了得到令人满意的结果,必须使用数千个示例对其进行训练。因此,我现在开始研究令牌匹配器来获取电子邮件地址。以前有人做过这个吗?有更好的方法吗?尝试一下,尽管它的用途是特定于聊天机器人的,但您也可以使用代码来检测电子邮件 电子邮件地址应该很容易提取–您可以编写令牌模式,甚至可以查看令牌的like_Email属性,如果它与电子邮件地址相似,则返回True 要了解电子邮件地址标记与句子其余部分的关系,一种方法

我需要提取一个人的电子邮件地址。我已经用几个例子在Spacy中训练了NER模型,但是运气不好。为了得到令人满意的结果,必须使用数千个示例对其进行训练。因此,我现在开始研究令牌匹配器来获取电子邮件地址。以前有人做过这个吗?有更好的方法吗?

尝试一下,尽管它的用途是特定于聊天机器人的,但您也可以使用代码来检测电子邮件

电子邮件地址应该很容易提取–您可以编写令牌模式,甚至可以查看令牌的
like_Email
属性,如果它与电子邮件地址相似,则返回
True

要了解电子邮件地址标记与句子其余部分的关系,一种方法是查看语法,并使用语法依赖项(
token.dep
)、词性标记(
token.pos
)或子树(
token.subtree
)编写自己的提取逻辑

下面是一个例子,展示了这个想法:

电子邮件地址附在动词“是”之后,动词“是”附在句子“电子邮件地址”的主语之后。专有名词“彼得”用标签
poss
(所有格)附在主语后面。因此,电子邮件地址的所有者是彼得。如果您的句子看起来像这样,您可以编写一个函数,根据标记及其关系提取这些信息


当然,这并不总是那么容易——你的文本可能看起来非常不同,你可能需要为各种不同的结构编写逻辑。有关更多信息和示例,请参阅上的文档。

我使用语法依赖关系涵盖了几种类型的规则来识别关系:

请参阅下面的代码

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))    

我偶然发现了亚历山大·克罗森关于这个话题的中篇文章

这种基于正则表达式的方法非常适合我(只要电话号码是10位数(没有国家代码))-


谢谢你的回复。我已经使用Spacy的令牌匹配器完成了提取部分。我只需要将此电子邮件地址与其所有者关联。
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)