我有一个有术语和句子的平面文件。如果在句子中发现任何术语,我需要加上| present(术语| present)。基本上,模式匹配(不区分大小写)和append | present。此外,我们需要保留与句子中相同的情况。什么方法在Python中是可行的和更快的。我用Oracle regex试过了,这需要几天来处理70k条记录。你知道吗
现在我正在使用下面的代码。有没有更好的办法。而且在当前的方法中,它可以很好地处理50条记录,但是当运行整个70k条记录时,df['words']是空的。不知道原因是什么。你知道吗
from pandas import DataFrame
df = {'term': ['Ford', 'EXpensive', 'TOYOTA', 'Mercedes Benz', 'electric', 'cars'],
'sentence': ['Ford is less expensive than Mercedes Benz.' ,'toyota, hyundai mileage is good compared to ford','tesla is an electric-car','toyota too has electric cars','CARS','CArs are expensive.']
}
from pandas import DataFrame
import re
df = DataFrame(df,columns= ['term','sentence'])
pattern = "|".join(f"\w*(?<![A-Za-z-;:,/|]){i}\\b" for i in df["term"])
df["words"]= df['sentence'].str.findall(pattern, flags=re.IGNORECASE)
def replace_values(row):
if len(row.words)>0:
pat = r"(\b"+"|".join(row.words) +r")(\b)"
row.sentence = re.sub(pat, "\\1|present\\2", row.sentence)
return row
df = df.apply(replace_values, axis=1)
你的模式是非常低效的,因为它有许多未编排的替代方案,从一个相同的模式开始,可以回溯很多。此外,要使用的词边界还需要按长度降序对术语进行排序,以便在重叠的情况下找到最长的术语(例如,
Merceded
和Mercedes Benz
)。你知道吗所以,使用
或者,如果你在条款中有特殊的角色
然后呢
模式将看起来像
(?i)\b(?:Mercedes Benz|EXpensive|electric|TOYOTA|Ford|cars)\b
,它将匹配-由于(?i)
-整个单词Mercedes Benz
,EXpensive
,electric
,TOYOTA
,Ford
,cars
而不区分大小写,并且在df["sentence"].str.findall(pattern)
中,它将找到模式匹配的所有不重叠的出现,并且在df["sentence"].replace(pattern, r"\g<0>|present", inplace=True, regex=True)
,所有匹配都将被自身替换(\g<0>
是一个反向引用对整个匹配)+|present
附加到它们。你知道吗相关问题 更多 >
编程相关推荐