0

我有 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 中。任何指针将不胜感激。

4

2 回答 2

1

我想指出,如果您的单词之一是 ,则 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
于 2021-01-27T11:10:35.467 回答
0

您可以手动完成...您可以在 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)

在此处输入图像描述

于 2020-05-15T14:54:13.220 回答