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
数据创建两个regexp,并运行两个company
操作replace
regex很简单,它看起来像符号
,并将括号中的任何替代项作为一个单词进行匹配\b(?:GS | JPM | TRV | V | AMGN | JNJ)\b
regex遵循中描述的SIFfication方法。它看起来像company
\b(?:::(:::::::::::::::::::::::::::::::::::::::::::::每个公司名称都是
d,后面的每个单词只匹配(可选)如果上一个术语单词匹配。请参见。注意,右侧单词边界设置为re.escape
lookahead,因为如果术语以非单词字符结尾,(?!\w)
将阻止匹配\b
股票
变量中的json数据似乎不正确,可能是列表
。对不起,您是对的,我已经更新了它|您能发布您的预期输出吗?是的,现在更清楚了吗?