我想用机器学习方法编码输入字符串。让我们假设我的列车数据以这种方式显示:
score text
1 show photos
1 show my photos
2 who are you?
此刻我做了类似的事情:
for index, row in train_set.iterrows():
list2 = []
list2 = list(row.text.lower())
for n, key in enumerate(list2):
if key in dictionary:
list2[n] = dictionary[key]
else:
dictionary[key] = i
list2[n] = i
i += 1
train_set.set_value(index,'text', list2)
作为这个示例数据的结果我得到:
score text
1 [0, 1, 2, 3, 4, 5, 1, 2, 6, 2, 0]
1 [0, 1, 2, 3, 4, 7, 8, 4, 5, 1, 2, 6, 2, 0]
2 [3, 1, 2, 4, 10, 13, 9, 4, 8, 2, 19, 21]
正如您所知,例如对于神经网络而言,使用此值并不是一种正确的方法,因此在我看来,在这种情况下,一个热编码将是最佳解决方案。我想知道在text
数据框的test_set
列以及text
数据框中的train_set
列中转换这些值的最有效方法是什么,看起来像test_set
但显然没有预期值的第一列。我认为在这两种情况下,在使用一个热编码之后我应该具有相同的列大小,并且相同的索引和行应该对应于test_set
和train_set
数据帧中的相同字符。我希望你明白我的意思。如果没有,请告诉我。我将尝试以更清晰的方式解释它。任何想法我该怎么做?
答案 0 :(得分:1)
解决方案是使用自定义Prepper
类对您的训练集进行编码。随着训练集的编码,Prepper
类对象记录(单词,单热索引)对应。
然后,您将使用相同的Prepper
对象对您的测试集进行编码。
Prepper
类的粗略骷髅将是:
from collections import defaultdict
class Prepper(object):
def __init__(self):
self.vocab = defaultdict(lambda : len(self.vocab))
def encode_train_word(self, train_word):
return self.vocab[train_word]
def encode_test_word(self, test_word):
if test_word in self.vocab:
return self.vocab[test_words]
else:
return -1 # index for unknown token
如果我必须重新获取您的代码段,它将如下所示:
prepper = Prepper()
for index, row in train_set.iterrows():
list2 = list(row.text.lower())
encoded_list_2 = [prepper.encode_train_word(word) for word in list2]
train_set.set_value(index, 'text', encoded_list_2)
## and for the test set
for index, row in test_set.iterrows():
list2 = list(row.text.lower())
encoded_list_2 = [prepper.encode_test_word(word) for word in list2]
test_set.set_value(index, 'text', encoded_list_2)