我有 SVMlight 格式的数据(标签 feature1:value1 feature2:v2 ...)
talk.politics.guns a:12 about:1 abrams:1 absolutely:1
talk.politics.mideast I:4 run:10 go:3
我试过sklearn.load_svmlight_file
了,但它似乎不适用于分类字符串特征和标签。我正在尝试将其存储到 pandas DataFrame 中。任何指针将不胜感激。
我有 SVMlight 格式的数据(标签 feature1:value1 feature2:v2 ...)
talk.politics.guns a:12 about:1 abrams:1 absolutely:1
talk.politics.mideast I:4 run:10 go:3
我试过sklearn.load_svmlight_file
了,但它似乎不适用于分类字符串特征和标签。我正在尝试将其存储到 pandas DataFrame 中。任何指针将不胜感激。
我想指出,如果您的单词之一是 ,则 Christian Gomes 接受的答案将失败'label'
,因为您将用向量中单词的计数覆盖分类标签。此外,由于计数未转换为int
,因此您无法进行任何数学运算。
由于您确定每个 (feature, value) 对都由 a 分隔:
,因此您可以通过将'label'
密钥设置为':label'
. 这并不理想,但它会避免碰撞。
或者,您可以将标签存储在单独的数据框中,这可能是一个更好的解决方案,因为您可能不想对分类标签进行数学运算。
svmformat_file = """~/svmformat_file_sample"""
# Read to list
with open(svmformat_file, mode="r") as fp:
svmformat_list = fp.read().splitlines()
# For each line we save the key:values to a dict
pandas_label_list = []
pandas_feature_list = []
for line in svmformat_list:
feature_dict = {}
items = line.split()
pandas_label_list.append({'label': items[0]})
for pair in items[1:]:
feature_name, count = pair.split(':')
feature_dict[feature_name] = int(count)
pandas_feature_list.append(feature_dict)
然后,使用 Christian 使用的相同数据,您现在有两个数据框:
>>> pd.DataFrame(pandas_label_list)
>>> label
0 talk.politics.guns
1 talk.politics.mideast
>>> pd.DataFrame(pandas_feature_list)
>>> a about abrams absolutely I run go
0 12 1 1 1 NaN NaN NaN
1 NaN NaN NaN NaN 4 10 3
您可以手动完成...您可以在 DataFrame 中转换所需文件的一种方法:
svmformat_file = """~/svmformat_file_sample"""
# Read to list
with open(svmformat_file, mode="r") as fp:
svmformat_list = fp.readlines()
# For each line we save the key:values to a dict
pandas_list = []
for line in svmformat_list:
line_dict = dict()
line_split = line.split(' ')
line_dict["label"] = line_split[0]
for col in line_split[1:]:
col = col.rstrip() # Remove '\n'
col_split = col.split(':')
key, value = col_split[0], col_split[1]
line_dict[key] = value
pandas_list.append(line_dict)
带有示例文件的结果 DataFrame:
pd.DataFrame(pandas_list)