在 Python 3.9 中使用 Spacy 从数据框中删除名称
using Spacy to remove names from a data frame in Python 3.9
我正在使用 Python 3.9 中的 spacy 包 v3.2.1,想了解如何使用它从数据框中删除名称。我尝试按照 spacy 文档进行操作,并且能够正确识别名称,但不了解如何删除它们。我的目标是从数据框的特定列中删除所有名称。
实际
ID
Comment
A123
I am five years old, and my name is John
X907
Today I met with Dr. Jacob
我想要完成的事情
ID
Comment
A123
I am five years old, and my name is
X907
Today I met with Dr.
代码:
#loading packages
import spacy
import pandas as pd
from spacy import displacy
#loading CSV
df = pd.read_csv('names.csv)
#loading spacy large model
nlp = spacy.load("en_core_web_lg")
#checking/testing is spacy large is identifying named entities
df['test_col'] = df['Comment'].apply(lambda x: list(nlp(x).ents))
我的代码做了什么
ID
Comment
test_col
A123
I am five years old, and my name is John
[(John)]
X907
Today I met with Dr. Jacob
[(Jacob)]
但是我该如何从“评论”列中删除这些名称呢?我想我是某种函数,它遍历数据框的每一行并删除已识别的实体。非常感谢您的帮助
谢谢
这里有一个使用字符串 replace
方法的想法:
编辑:去掉括号看看是否有帮助。
df['test_col'] = df['Comment'].apply(lambda x: str(x).replace(str(nlp(x).ents).lstrip('(').rstrip(')')), '')
我对变量进行了类型转换以帮助匹配,也不确定它是否是 str。您可能需要使用索引,如果在单个评论中找到多个名称,则循环它,但这就是它的要点。
您可以使用
import spacy
import pandas as pd
# Test dataframe
df = pd.DataFrame({'ID':['A123','X907'], 'Comment':['I am five years old, and my name is John', 'Today I met with Dr. Jacob']})
# Initialize the model
nlp = spacy.load('en_core_web_trf')
def remove_names(text):
doc = nlp(text)
newString = text
for e in reversed(doc.ents):
if e.label_ == "PERSON": # Only if the entity is a PERSON
newString = newString[:e.start_char] + newString[e.start_char + len(e.text):]
return newString
df['Comment'] = df['Comment'].apply(remove_names)
print(df.to_string())
输出:
ID Comment
0 A123 I am five years old, and my name is
1 X907 Today I met with Dr.
我正在使用 Python 3.9 中的 spacy 包 v3.2.1,想了解如何使用它从数据框中删除名称。我尝试按照 spacy 文档进行操作,并且能够正确识别名称,但不了解如何删除它们。我的目标是从数据框的特定列中删除所有名称。
实际
ID | Comment |
---|---|
A123 | I am five years old, and my name is John |
X907 | Today I met with Dr. Jacob |
我想要完成的事情
ID | Comment |
---|---|
A123 | I am five years old, and my name is |
X907 | Today I met with Dr. |
代码:
#loading packages
import spacy
import pandas as pd
from spacy import displacy
#loading CSV
df = pd.read_csv('names.csv)
#loading spacy large model
nlp = spacy.load("en_core_web_lg")
#checking/testing is spacy large is identifying named entities
df['test_col'] = df['Comment'].apply(lambda x: list(nlp(x).ents))
我的代码做了什么
ID | Comment | test_col |
---|---|---|
A123 | I am five years old, and my name is John | [(John)] |
X907 | Today I met with Dr. Jacob | [(Jacob)] |
但是我该如何从“评论”列中删除这些名称呢?我想我是某种函数,它遍历数据框的每一行并删除已识别的实体。非常感谢您的帮助
谢谢
这里有一个使用字符串 replace
方法的想法:
编辑:去掉括号看看是否有帮助。
df['test_col'] = df['Comment'].apply(lambda x: str(x).replace(str(nlp(x).ents).lstrip('(').rstrip(')')), '')
我对变量进行了类型转换以帮助匹配,也不确定它是否是 str。您可能需要使用索引,如果在单个评论中找到多个名称,则循环它,但这就是它的要点。
您可以使用
import spacy
import pandas as pd
# Test dataframe
df = pd.DataFrame({'ID':['A123','X907'], 'Comment':['I am five years old, and my name is John', 'Today I met with Dr. Jacob']})
# Initialize the model
nlp = spacy.load('en_core_web_trf')
def remove_names(text):
doc = nlp(text)
newString = text
for e in reversed(doc.ents):
if e.label_ == "PERSON": # Only if the entity is a PERSON
newString = newString[:e.start_char] + newString[e.start_char + len(e.text):]
return newString
df['Comment'] = df['Comment'].apply(remove_names)
print(df.to_string())
输出:
ID Comment
0 A123 I am five years old, and my name is
1 X907 Today I met with Dr.