正のデータセットであるタンパク質の一意のペアを含むファイルがあります。と呼びましょうinfile
。以下に、infile コンテンツの例を示します。
Q9VRA8 A1ZBB4
Q03043 Q9VX24
B6VQA0 Q7KML2
エントリはタブで区切られています。ランダム化されたデータセットoutfile
は、個々のタンパク質の組み合わせを含む必要があり、infile の内容とどのような順序でも一致することはできません。たとえば、上記の最初の行では、ランダム化された出力ファイルに次のペアを含めることはできません。
Q9VRA8 A1ZBB4
A1ZBB4 Q9VRA8
また、生成されたネガティブ データセットには、ポジティブ データセットとまったく同じ数のタンパク質ペアが含まれている必要があります。これに対処するために、次のことを試しました。
# Read original file
data = list(infile.readlines())
ltotal = len(data)
lwritten = 0
# Split original file in words
with open (infilename, 'rt') as infile:
pairs = set(frozenset(line.split()) for line in infile)
words = list(itertools.chain.from_iterable(pairs))
random.shuffle(words)
# Obtain pairs of words
with open(outfilename, 'wt') as outfile:
for pair in itertools.izip(*[iter(words)] * 2):
if frozenset(pair) not in pairs and lwritten != ltotal:
outfile.write("%s\t%s\n" % pair)
lwritten += 1
これは機能します。ただし、infile には合計 856471 行があり、outfile は異なる範囲のタンパク質ペアを取得し、最小値は 713000 です。
生成されたペアの数が infile とまったく同じになるようにするには、どうすればこれを回避できますか? また、逆ペア順序の問題に対処できませんでした。両方の質問について何か考えはありますか?
前もって感謝します。