如何使用 python 及其库从段落中提取带有缩写的名称?

问题描述 投票:0回答:1

我目前正在开发一个项目,我必须根据每个段落包含的主题给每个段落一个标签。

为了做到这一点,我从许多word文档(.docx)中提取每个段落。之后,我将其通过 Universal Sentence Encoder 传递以获取嵌入,然后对其运行 Kmeans 聚类。

这为我提供了每个标签的一组非常准确的段落。 但我想进一步仅提取文档中存在的名称。

以下是我正在处理的各种示例段落:

斯里。 SHAHANK KUMAR, S/o.Sri.Rajat Kumar,年龄约 45 岁,居住地址以下称为卖方。

斯里。 M. S. ANANTHKRISHNA,年龄约 46 岁,S/o。斯里。 M.Neelakant 居住在 ADDRESSS。以下称为第二方(买方)。

Smt。甘加 A.K,D/o。斯里。 Mukesh,年龄约 31 岁,居住地址以下称为购买者。

SRI.SANTHOSH BHAT.N.C S/o.Sri。 Chikkabasappa,年龄约 29 岁,居住地址以下称为购买者。

不仅有多个段落有空格SRI。 Sri 之间没有空格。和名字。也有使用 D/O、W/O 甚至 C/O 的情况。句子开头仅包含 Sri、Smt、SRI 或 SMT。

我尝试使用正则表达式和 re.findall() 方法。 匹配模式:Sri。 [A-Z\s]|SRI。[A-Z\s]|Smt。 [A-z\s]|SMT。[A-Z\s]|SRI。 [A-z\s]|SMT。 [A-Z\s]

我还尝试使用 nltk 将其拆分成句子,然后根据 stanford NERTagger 标记单词,但这也不起作用。我什至尝试使用 spacy 为名称分配 PROPN 标签,但这也没有考虑名称中的首字母。

这是我编写函数的方式:

def get_vendor_purchaser_details(df_hierchical_clustered_output):
    df_vendor_purchaser_details = df_hierchical_clustered_output[df_hierchical_clustered_output['k_means_labels_primary'] == 4][["id", "filename", "para_text"]]

    vendor_detail_list = []
    for index, row in df_vendor_purchaser_details.iterrows():
        vendor_detail = {}
        vendor_detail["id"] = row["id"]
        vendor_detail["para_text"] = row["para_text"]
        vendor_detail["name"] = get_vendor_name(row)

        vendor_detail_list.append(vendor_detail)
        print(vendor_detail["name"])
def get_vendor_name(entry):
    para_text = entry["para_text"]
    # name_pattern = r'Sri. [A-Z\s]*|SRI.[A-Z\s]*|Smt. [A-z\s]*|SMT.[A-Z\s]*|SRI. [A-z\s]*|SMT. [A-Z\s]*'
    # vendor_name = re.findall(name_pattern,para_text)
----------------------------------------------------
    # if "S/o" in para_text:
    #     vendor_name = para_text.split("S/o")[0]
    # elif "D/o" in para_text:
    #     vendor_name = para_text.split("D/o")[0]
    # elif "C/o" in para_text:
    #     vendor_name = para_text.split("C/o")[0]
    # elif "W/o" in para_text:
    #     vendor_name = para_text.split("W/o")[0]
    # else:
    #     vendor_name = ""

    # return vendor_name

上面的段落包括正则表达式尝试以及我拆分字符串以访问名称的尝试。

请告诉我如何提取带有首字母缩写的完整姓名。 预先感谢!

python regex pattern-matching text-extraction information-extraction
1个回答
0
投票

要从 Python 中的段落中提取带有首字母缩写的姓名,您可以结合使用正则表达式和附加处理。这是您可以使用的功能:

import re

def extract_names(paragraph):
    # Define a regular expression pattern to capture names with initials
    pattern = r'\b(?:Sri\.|Smt\.|SRI|SMT)\.?\s+[A-Z]\.?\s*[A-Za-z]+(?:\s+[A-Z]\.?\s*[A-Za-z]+)?'

    # Find all matches in the paragraph
    matches = re.findall(pattern, paragraph)

    # Extract the matched names
    names = [match.strip() for match in matches]

    return names

# Example usage
paragraphs = [
    "Sri. SHASHANK KUMAR, S/o.Sri.Rajat Kumar, aged about 45 years, residing at ADDRESS Hereinafter called as the VENDOR.",
    "Sri. M. S. ANANTHKRISHNA ,aged about 46 years, S/o. Sri. M.Neelakant residing at ADDRESSS. Hereinafter called the SECOND PARTY (PURCHASER).",
    "Smt. GANGA A.K, D/o. Sri. Mukesh, aged about 31 years, residing at ADDRESS Hereinafter called the PURCHASER.",
    "SRI.SANTHOSH BHAT.N.C S/o.Sri. Chikkabasappa, aged about 29 years, residing at ADDRESS Hereinafter called the PURCHASER."
]

for paragraph in paragraphs:
    names = extract_names(paragraph)
    print(names)

此函数使用正则表达式来匹配“Sri.”、“Smt.”、“SRI”、“SMT”等模式,后跟缩写和名称。它允许格式变化,例如缩写和名称之间的空格或句点。

extract_names
函数返回匹配名称的列表。您可以将此功能集成到您的代码中,以从段落中提取名称。

注意:此正则表达式假设带有首字母缩写的名称以特定方式格式化。如果您的数据存在其他变化,您可能需要相应地调整模式。

© www.soinside.com 2019 - 2024. All rights reserved.