one-hot-encode 验证数据

one-hot-encode validation data

我有一个单热编码特征矩阵,其中特征是训练数据的子串。

我只有这个包含 rows = samples, columns = substrings (one-hot-encoded) 的最终数据框。 现在我想对一组新数据进行单热编码。 数据由 rows = samples, columns = String 组成,我需要检查每个样本的字符串是否包含任何子字符串(特征)并对它们进行单热编码。

遍历所有字符串和子字符串的速度不够快,因为我的数据量很大。 什么是快速解决这个问题的方法?

编辑: 例子: 我在列表中有一些字符串,并且有一个带有这些子字符串的单热编码矩阵:

strings = ['foobarista', 'foobar']

substrings = {'foo' : [1,1] ,
       'bar' : [1,1],
       'ist' : [0,1],
       'sta' : [0,1]}

df_one_hot = pd.DataFrame(substrings)

假设这是我的训练数据,所以我有特征 foo, bar, ist, sta

现在我有了新数据:

new_strings = ['barista', 'barfoo', 'house']

并且想要检查这些新字符串,如果它们包含上述数据框中的任何子字符串。

new_substrings = {'foo' : [0,1,0] ,
       'bar' : [1,1,0],
       'ist' : [1,0,0],
       'sta' : [1,0,0]}


new_df = pd.DataFrame(new_substrings)

进入 new_substrings 可以通过双重列表理解来完成。内部理解遍历 new_string 中的所有条目,外部为所有 sub_strings:

创建一个字典
import re

new_strings = ['barista', 'barfoo', 'house']
sub_strings = ['foo', 'bar', 'ist', 'sta']
new_substrings= {sub_s: [ (re.search(sub_s, s) is not None)*1 for s in new_strings] for sub_s in sub_strings}
print(new_substrings)

这个returns:

{'foo': [0, 1, 0], 'bar': [1, 1, 0], 'ist': [1, 0, 0], 'sta': [1, 0, 0]}

然后您可以使用 df = pd.DataFrame(new_substrings) 创建数据框。