将0和1的字符串转换为SVM分析的向量行

时间:2013-06-03 15:37:58

标签: python

作为对已回答的另一个问题的后续跟进,我现在拥有以下格式的数据:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0

我正在寻找一个python函数(可能是for循环),它实现了以下输出:

34:1
27:1 33:1 36:1
20:1 32:1

注意第一个数字是如何在40长度长位模式中所拥有的位置。第二个数字(冒号后)是原始数字“1”。

我是python的新手,并在这里发布我的问题,这对我学习python有很大的帮助。所以,如果你有任何想法如何做到这一点,请随时回复。再一次,这不是功课,我试图创建一个情绪分析程序,我需要这种数据格式的SVM。另一种格式是TiMBL。

修改

由于某些行仅包含0。令人敬畏:)的输出回答如下,在输出文本文件中产生空行。如何添加防止这种情况发生的功能? 或者创建一个读取文件的新函数,并删除换行符?我有一种感觉会删除所有这些,这可能会给我带来麻烦。

3 个答案:

答案 0 :(得分:5)

>>> strs = """0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0"""

>>> for x in strs.splitlines():                                                              
    print " ".join("{}:{}".format(i,1) for i,y in enumerate(x.split(), 1) if y=='1')
...     
34:1
27:1 33:1 36:1
20:1 32:1

对于文件:

>>> with open("abc") as f:
    for line in f:
        strs =  " ".join("{}:{}".format(i,1) for i,y in enumerate(line.split(), 1) if y=='1')
        if strs:
            print strs
...             
34:1
27:1 33:1 36:1
20:1 32:1

abc包含:

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0

答案 1 :(得分:0)

你可能正在重新发明轮子。查看执行“稀疏矩阵”操作的库,并考虑它们是否能满足您的需求。

我对你正在解决的问题了解不多,但如果它真的是一个数据分析项目,而不是为解决这些问题创建一个很好的界面,并且你有一些数学背景,那么像R这样的语言或matlab可能值得一看。

答案 2 :(得分:0)

另一种方法是,将问题放在首位,并将输入数据作为选择器提供给itertools.compress函数,该函数针对从1开始的整数序列

import StringIO
from itertools import count, compress, imap
import contextlib
s = '''\
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0
0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0
0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0
'''
with contextlib.closing(StringIO.StringIO(s)) as f:
    for line in f:
            selectors = line.strip().split()
            selectors = imap(int, selectors)
            data = compress(count(1), selectors)
            print " ".join("{}:{}".format(x, 1) for x in data)

34:1
27:1 33:1 36:1
20:1 32:1