Python 名称实体替换-带文本列的数据框-预处理

Python 名称实体替换-带文本列的数据框-预处理,python,pandas,string,dataframe,tokenize,Python,Pandas,String,Dataframe,Tokenize,我有一个数据框,里面有一列句子(文本)。 我想执行名称实体替换:我有一个列表,其元素是股票信息 stocks = [ {"symbol": "GS", "company": "Goldman Sachs", "index": "Dow Jones", "sector": "Financial Services"}, {"symb

我有一个数据框,里面有一列句子(文本)。 我想执行名称实体替换:我有一个列表,其元素是股票信息

stocks = [
{"symbol": "GS", "company": "Goldman Sachs", "index": "Dow Jones", "sector": "Financial Services"},
{"symbol": "JPM", "company": "JPMorgan Chase", "index": "Dow Jones", "sector": "Financial Services"},
{"symbol": "TRV", "company": "The Travelers Companies", "index": "Dow Jones", "sector": "Financial Services"},
{"symbol": "V", "company": "Visa Inc.", "index": "Dow Jones", "sector": "Financial Services"},
{"symbol": "AMGN", "company": "Amgen", "index": "Dow Jones", "sector": "Healthcare"},
{"symbol": "JNJ", "company": "Johnson & Johnson", "index": "Dow Jones", "sector": "Healthcare"}
]
我想在我的数据框中找到“symbol”和“company”,以便用
'
替换符号,用
'
替换公司。该函数必须应用于所有行

我正在寻找一个函数,它接收带有标记文本的数据帧,并返回经过处理的文本。 重要的是要匹配整个公司名称,而不仅仅是名称的一个元素。关于符号,我知道这有点困难,因为在文本中很容易找到“V”(签证符号),但我在这里听到一些好的工作

让我们举一个例子开始:

print(dataframe['text'])
输出:

0  [GS is the main company of Dow Jones]
1  [Once again Visa surprises all]*
2  [Johnson & Johnson's vaccine is the best one]
我希望有一个新专栏,其结果如下:

0  [<TKR> is the main company of Dow Jones]
1  [Once again <CMPY> surprises all]*
2  [<CMPY>'s vaccine is the best one] 
0[是道琼斯的主要公司]
1[再次让所有人感到惊讶]*
2.[美国的疫苗是最好的]
第1行-->棘手的一个问题,因为该公司的真实名称是“Visa公司”,而不仅仅是Visa。。。我真的不知道该怎么处理

我不知道使用标记化的句子是否更好:因为在这种情况下,我还需要标记“公司”,比如高盛公司。

你可以使用

将熊猫作为pd导入
进口稀土
股票=[
{“符号”:“GS”,“公司”:“高盛”,“指数”:“道琼斯”,“行业”:“金融服务”},
{“符号”:“摩根大通”,“公司”:“摩根大通”,“指数”:“道琼斯”,“行业”:“金融服务”},
{“符号”:“TRV”,“公司”:“旅行者公司”,“指数”:“道琼斯”,“行业”:“金融服务”},
{“符号”:“V”,“公司”:“Visa公司”,“指数”:“道琼斯”,“行业”:“金融服务”},
{“符号”:“AMGN”,“公司”:“Amgen”,“指数”:“道琼斯”,“行业”:“医疗保健”},
{“symbol”:“JNJ”,“公司”:“强生”,“指数”:“道琼斯”,“行业”:“医疗保健”}
]
def过程_术语(术语):
t=[x表示术语中的x.split()]
第一个=t[0]
如果len(t)>1:
first=first+r“(?:\s+{}{}.”格式((?:\s+”.join(map(re.escape,t[1:]),”)?*(len(t)-1))
先返回
dataframe=pd.dataframe({'text':['GS是道琼斯的主要公司','Visa再次让所有人惊讶',“强生公司的疫苗是最好的”]})
rx_symbol=r“\b(?:{})\b”.format(“|”).join([x[“symbol”]表示库存中的x]))
rx_company=r“\b(?:{})(?!\w)”.format(“|”).join(已排序([process_term(x[“company]”)表示股票中的x),key=len,reverse=True)
数据帧['new_text']=dataframe['text'].str.replace(rx_符号,r'',regex=True)
dataframe['new_text']=dataframe['new_text'].str.replace(rx_company,r'',regex=True)
>>>数据帧
#=>文本#新文本
#=>0GS是道琼斯的主要公司是道琼斯的主要公司
#=>1 Visa再次出乎所有人的意料再次出乎所有人的意料
#=>2强生公司的疫苗是最好的。强生公司的疫苗是最好的
简言之:

  • symbol
    company
    数据创建两个regexp,并运行两个
    replace
    操作
  • 符号
    regex很简单,它看起来像
    \b(?:GS | JPM | TRV | V | AMGN | JNJ)\b
    ,并将括号中的任何替代项作为一个单词进行匹配
  • company
    regex遵循中描述的SIFfication方法。它看起来像
    \b(?:::(:::::::::::::::::::::::::::::::::::::::::::::每个公司名称都是
    re.escape
    d,后面的每个单词只匹配(可选)如果上一个术语单词匹配。请参见。注意,右侧单词边界设置为
    (?!\w)
    lookahead,因为如果术语以非单词字符结尾,
    \b
    将阻止匹配

您在
股票
变量中的json数据似乎不正确,可能是
列表
。对不起,您是对的,我已经更新了它|您能发布您的预期输出吗?是的,现在更清楚了吗?