[英]Text substitution using Python
我有兩個數據集。 一個包含文本描述,另一個包含帶有兩列from_value
和to_value
的表。
想法是使用第二個數據集替換文本描述中所有出現的單詞。
我可以從第二個數據集中識別出4種類型的單詞:
RPLCD -> REPLACED
ALT BRK -> ALTERNATE BREAK
A/C -> AIRCRAFT
或1-APU -> 1 APU
%
,則應將其刪除; 同樣的事情-
除非它位於1-APU
類的單詞之內(我們替換整個單詞) 我通過Gdrive上傳了我的2個數據集的示例,這里是鏈接: https ://drive.google.com/drive/folders/1HYFhKAqbYPIy0ekyj9xLSbk30YZwf8ZG?usp=sharing
我的想法是先將第二個數據集拆分為2個數據幀,一個包含多個單詞,一個包含一個單詞和特殊字符,或者拆分為3個數據幀,一個包含多個,一個包含單獨單詞,一個包含特殊字符,然后應用首先是第一個數據幀,然后是2sd,最后是特殊字符刪除,但是它不起作用。
您有辦法管理這種替代嗎?
這是我的代碼:
import sys
import pyspark
import pandas_datareader
import re
import csv
import xlrd
import pandas as pd
import numpy as np
import datetime
from pyspark.context import SparkContext
from pyspark.sql.functions import *
from pandas import DataFrame
from pandas_datareader import data, wb
from pandas import *
from xlrd import open_workbook
## 1)read the source table (OI and description)
xls = ExcelFile("df1.xls")
df = xls.parse(xls.sheet_names[0])
## 2)remove the nan values from df
df = df.replace(np.nan, '')
## 3)read the subtitution table
xls1 = ExcelFile("df2.xls")
df1 = xls1.parse(xls1.sheet_names[0])
df1.drop(df1.columns[0],inplace=True,axis=1)
## 4)separate the subtitution table into 2 datasets
df3 = pd.DataFrame(columns=('FROM_VALUE', 'TO_VALUE'))
df4 = pd.DataFrame(columns=('FROM_VALUE', 'TO_VALUE'))
df5=[]
df6=[]
for (idx, row) in df1.iterrows():
if len(row.loc['FROM_VALUE'].split()) > 1:
df5.append([row.loc['FROM_VALUE'],row.loc['TO_VALUE']])
else:
df6.append([row.loc['FROM_VALUE'],row.loc['TO_VALUE']])
df7= pd.DataFrame(df5)
df7=df7.rename(columns = {0:'FROM_VALUE',1:'TO_VALUE'})
df7 = df7.replace(np.nan, '', regex=True)
df9 = Series(df7.TO_VALUE.values,index=df7.FROM_VALUE).to_dict()
df8= pd.DataFrame(df6)
df8=df8.rename(columns = {0:'FROM_VALUE',1:'TO_VALUE'})
df8 = df8.replace(np.nan, '', regex=True)
df10 = Series(df8.TO_VALUE.values,index=df8.FROM_VALUE).to_dict()
## 5)processing the description list based on the subtitution table
df11 = {r'(\b){}(\b)'.format(k):r'\1{}\2'.format(v) for k,v in df9.items()}
df12 = {r'(\b){}(\b)'.format(k):r'\1{}\2'.format(v) for k,v in df10.items()}
df['WORK_PERFORMED_NEW'] = df['WORK_PERFORMED'].replace(df11, regex=True)
df['WORK_PERFORMED_NV'] = df['WORK_PERFORMED_NEW'].replace(df12, regex=True)
我將單詞的替換與特殊字符的替換分開,因為IMO對於您需要在列表中循環的單詞,可以在一行中替換特殊字符。
因此,給出了以下三個變量,其中df1
是要處理的數據, df2
是單詞替換列表, df2
unwanted_chars
字符是用於過濾字符的正則表達式:
df1
Out:
WORK_PERFORMED
ID
1 WORD1 ! ? WORD2 < : ) ALT WORD3 A/C DEFFRED W...
2 1-APU WORD2 ~ REPLACED % WORD3 @ DEF WORD4 ALT...
3 WORD1 WORD2 ALT BRK WORD3 WORD4
df2
Out:
FROM_VALUE TO_VALUE
ROW_ID
1 DEF DEFERRED
2 DEFERED DEFERRED
3 DEFFRED DEFERRED
4 DEFRD DEFERRED
5 DFR D DEFERRED
6 DFRD DEFERRED
7 DIFERED DEFERRED
8 ALT BRK ALTERNATE BREAK
9 ALT ALTITUDE
10 A/C AIRCRAFT
11 A/BRK AUTOBRAKE
12 BRK BREAK
13 1-FIRE 1 FIRE
14 1-HP 1 HIGH PRESSURE
unwanted_chars = re.compile('[^a-zA-Z0-9 ]+')
然后,您可以定義一個函數,該函數接受字符串作為輸入,然后循環到用戶列表中,檢查是否嘗試替換每個條目。 這是通過一個正則表達式完成的,該正則表達式包含空格或字符串開頭/結尾的環顧四周,因此單詞的子字符串不匹配。 循環后,單行用空格替換所有不需要的字符:
def subst(x):
for fr, to in zip(df2.FROM_VALUE, df2.TO_VALUE):
x = re.sub('((?<=^)|(?<= ))' + fr + '(?=$| )', to, x)
x = re.sub(unwanted_chars, ' ', x)
return x
准備好之后,您只需要將此函數映射到數據框的列即可:
df1.WORK_PERFORMED.map(subst)
Out:
ID
1 WORD1 WORD2 ALTITUDE WORD3 AIRCRAFT...
2 1 APU WORD2 REPLACED WORD3 DEFERRED WORD...
3 WORD1 WORD2 ALTERNATE BREAK WORD3 WORD4
Name: WORK_PERFORMED, dtype: object
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.