-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfile_writer.py
125 lines (98 loc) · 4.29 KB
/
file_writer.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
import numpy as np
import pickle
from collections import deque, OrderedDict
class FileWriter:
def __init__(self, path, heading):
self.path = path
self.heading = heading
self.lines = []
self.mapping = {}
self.buffer = 1000
def check_limit(self):
if len(self.lines) > self.buffer:
self.writelines()
self.lines = []
self.mapping = {}
def calculate(self, doi, depth, items, keys=None):
self.check_limit()
def writelines(self):
self.writer = open(self.path, 'a')
self.writer.writelines(self.lines)
self.writer.close()
self.lines = []
self.mapping = {}
class AverageJaccard_Writer(FileWriter):
def __init__(self, path):
FileWriter.__init__(self, path, 'Doi,Depth,AverageJaccard\n')
def calculate(self, doi, depth, items, keys=None):
avg = "{0:.5f}".format(np.mean(items))
if doi not in self.mapping:
if len(self.mapping):
self.lines[-1] += "\n"
FileWriter.calculate(self, doi, depth, items)
self.lines.append(doi+","+str(avg))
self.mapping[doi] = len(self.lines)-1
else:
self.lines[self.mapping[doi]] += ","+str(avg)
def calculate(self, doi, depth, items, keys=None):
avg = "{0:.5f}".format(np.mean(items))
if doi not in self.mapping:
if len(self.mapping):
self.lines[-1] += "\n"
FileWriter.calculate(self, doi, depth, items)
self.lines.append(doi+","+str(avg))
self.mapping[doi] = len(self.lines)-1
else:
self.lines[self.mapping[doi]] += ","+str(avg)
class MedianJaccard_Writer(FileWriter):
def __init__(self, path):
FileWriter.__init__(self, path, 'Doi,Depth,MedianJaccard\n')
def calculate(self, doi, depth, items, keys=None):
median = "{0:.5f}".format(np.median(items))
if doi not in self.mapping:
if len(self.mapping):
self.lines[-1] += "\n"
FileWriter.calculate(self, doi, depth, items)
self.lines.append(doi+","+str(median))
self.mapping[doi] = len(self.lines)-1
else:
self.lines[self.mapping[doi]] += ","+str(median)
class StdJaccard_Writer(FileWriter):
def __init__(self, path):
FileWriter.__init__(self, path, 'Doi,Depth,StdJaccard\n')
def calculate(self, doi, depth, items, keys=None):
std = "{0:.5f}".format(np.std(items))
if doi not in self.mapping:
if len(self.mapping):
self.lines[-1] += "\n"
FileWriter.calculate(self, doi, depth, items)
self.lines.append(doi+","+str(std))
self.mapping[doi] = len(self.lines)-1
else:
self.lines[self.mapping[doi]] += ","+str(std)
class ChildSize_Writer(FileWriter):
def __init__(self, path):
FileWriter.__init__(self, path, 'Doi,Depth,ChildSize\n')
def calculate(self, doi, depth, items, keys=None):
if doi not in self.mapping:
if len(self.mapping):
self.lines[-1] += "\n"
FileWriter.calculate(self, doi, depth, items)
self.lines.append(doi+","+str(len(items)))
self.mapping[doi] = len(self.lines)-1
else:
self.lines[self.mapping[doi]] += ","+str(len(items))
class FirstChild_Writer(FileWriter):
def __init__(self, path, limit):
FileWriter.__init__(self, path, 'Doi,Child,Jaccard\n')
self.depth_limit = limit
def calculate(self, doi, depth, items, keys=None):
if depth <= self.depth_limit:
if doi not in self.mapping:
if len(self.mapping):
self.lines[-1] += "\n"
FileWriter.calculate(self, doi, depth, items)
self.lines.append(doi+","+str(keys[0])+"_"+"{0:.5f}".format(items[0]))
self.mapping[doi] = len(self.lines)-1
else:
self.lines[self.mapping[doi]] += ","+str(keys[0])+"_"+"{0:.5f}".format(items[0])