- Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMain2.py
More file actions
Latest commit
236 lines (210 loc) · 9.1 KB
/
Copy pathMain2.py
File metadata and controls
236 lines (210 loc) · 9.1 KB
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
#print('helloworld')
importitertools
importdatetime
classGSP(object):
def__init__(self):
self.queue= []
#----------------------------------------------------------#
# 计算freq1 #
#----------------------------------------------------------#
deffreq1(self, data, frequent_num):
freq1= []
appear_ele= []
foriinrange(len(data)):
appear=''
forjinrange(len(data[i])):
appear+=data[i][j]
appear_ele+=list(set(appear))
# print(appear_ele)
appear_ele2=list(set(appear_ele))
# print(appear_ele2)
foriteminappear_ele2:
itmes=appear_ele.count(item)
ifitmes>=frequent_num:
freq1.append(item)
print('频繁1项集为:%s'%freq1)
returnfreq1
#----------------------------------------------------------#
# 计算freq_more #
#----------------------------------------------------------#
deffreq_more(self, data, freq1):
queue= []#所有的备选序列放在这里面
queue_new= []#最终结果在这里面
top=0#这个是queue_new的队尾标号
times=3
whileTrue:
if (queue_new== []): #为空则代表这是第一次遍历,python中的&&是and,||是or
foriinrange(len(freq1)):
forjinrange(i+1, len(freq1)):
item=freq1[i] +freq1[j]
queue.append(item)
foriinrange(len(freq1)):
forjinrange(len(freq1)):
ifj!=i:
item=freq1[i] +'->'+freq1[j]
queue.append(item)#第一次遍历后全部可能出现的情况
foriinrange(len(queue)):
freq_item=self.isFreq(queue[i], data)
iffreq_item!=0:
queue_new.append(freq_item)
queue= []#清空queue(备选序列)
if (queue_new!= []): #后几次遍历时要把所有的情况写入空的queue中
iftop==len(queue_new) -1: #表示没有新加入元素,那么终止 while 循环
print('频繁多项集为:%s'%queue_new)
print(queue_new[len(queue_new)-1]) #将最后一个输出
break
else:
demo_list= []#专门放'AB','BF','AF'这样的频繁序列,后面将他们合成为更多成员的备选频繁序列
foriinrange(top, len(queue_new)):
if'->'notinqueue_new[i]:
demo_list.append(queue_new[i])
demo_string=self.List_to_String(demo_list) #将列表中的元素拼接成字符串,诸如拼成'ABBFAF'
demo_ele="".join(set(demo_string)) #删除串中的重复元素,输出'ABF'
iflen(demo_ele) >=times:
iflen(demo_ele) ==times :#那么demo_ele是唯一的备选成员
queue.append(demo_ele)
times+=1
else: #否则对备选字母进行排列组合,比如'ABCDE',一共能排列出10钟情况,并把它们推入queue(待判断成员队列)
combin=self.Combinations(demo_ele, times)
foriinrange(len(combin)):
queue.append(combin[i])
times+=1
###-----####至此已经把备选频繁寻列推入 queue ####-----###
queue=self.Make_time_queue(top, freq1, queue, queue_new)
###-----#### 至此已经把 queue 放满了备选成员 ####-----###
top=len(queue_new)# 更新队尾指针 top 的位置
###-----#### 检测 queue 中的备选序列是否频繁 ####-----###
foriinrange(len(queue)):
freq_item=self.isFreq(queue[i], data) #---->> isFreq
iffreq_item!=0: #如果这个成员是频繁的
queue_new.append(freq_item)
queue= []
#将列表中的字母合并成字符串
defList_to_String(self, list):
demo_string=''
foriinrange(len(list)):
demo_string=demo_string+list[i]
returndemo_string
#demo_ele是待排列的字符串, times是将它们排列成几个元素
defCombinations(self, item, times):
demo_list= []
combin= []
element=''
foriinrange(1, len(item) +1):
iter=itertools.combinations(item, i)
demo_list.append(list(iter))
demo_combin=demo_list[times-1]
foriinrange(len(demo_combin)):
forjinrange(len(demo_combin[0])):
element+=demo_combin[i][j]
combin.append(element)
element=''
returncombin
#判断item是不是频繁的
defisFreq(self, item, data):
num=0
if'->'notinitem: #类似如'ABF'
foriinrange(len(data)):
forjinrange(len(data[i])):
ifself.isIn_Item(item, data, i, j) !=0:
num+=1
ifnum>=2:
returnitem
else:
return0
else: #类似如‘D->B->A’
item0=item.split('->')
foriinrange(len(data)):
array=0
j=0
whileTrue:
ifarray==len(item0) orj==len(data[i]):
break
iflen(item0[array]) >=2: #如果类似 'BA' 形式
ifself.isIn_Item(item0[array], data, i, j) ==1:
array+=1
j+=1
else:
j+=1
else:
ifitem0[array] indata[i][j]:
array+=1
j+=1
else:
j+=1
ifarray==len(item0):
num+=1
ifnum>=2:
returnitem
else:
return0
#判断 item 是否在 data[i][j]中
defisIn_Item(self, item, data, i, j):
demo_num=0
forkinrange(len(item)):
ifitem[k] indata[i][j]:
demo_num+=1
ifdemo_num==len(item):
return1
else:
return0
#
defisIn_Time(self, item0, data, i, j):
num=0
item0_lenth=len(item0)
ifitem0_lenth==2:
forminrange(j+1, len(data[i])):
ifitem0[1] indata[i][m]:
num+=1
else:
ifitem0[item0_lenth-2] indata[i][j]:
forminrange(j+1, len(data[i])):
ifitem0[item0_lenth-1] indata[i][m]:
num+=1
break
returnnum
#创造新的备选时间序列
defMake_time_queue(self, top, freq1, queue, queue_new):
foriinrange(top, len(queue_new)):
# for j in range(len(freq1)):
if'->'notinqueue_new[i]:
difference=self.Difference(queue_new[i], freq1)
forjinrange(len(difference)):
queue.append(difference[j] +'->'+queue_new[i]) #诸如 'D->AB'
queue.append(queue_new[i] +'->'+difference[j]) #诸如 'AB->D'
else:
difference=self.Difference(queue_new[i], freq1)
forjinrange(len(difference)):
queue.append(queue_new[i] +'->'+difference[j]) #诸如'B->A' 扩展成 'B->A->D'
returnqueue
#寻找两个字符串中的不同字母,并提取出来
defDifference(self, item, freq1):
demo_list= []
if'->'notinitem:
foriinrange(len(freq1)):
iffreq1[i] notinitem:
demo_list.append(freq1[i])
else:
demo_item=item.split('->') #将诸如'A->B'拆分成 'A','B'
demo_item_string=self.List_to_String(demo_item) #合并成'AB'
foriinrange(len(freq1)):
iffreq1[i] notindemo_item_string:
demo_list.append(freq1[i])
returndemo_list
#----------------------------------------------------------#
# main #
#----------------------------------------------------------#
# data = {0:['CD','ABC','ABF','ACDF'],
# 1:['ABF','E'],
# 2:['ABF'],
# 3:['DGH','BF','AGH']}
data= {0:['C','A','B','F'],
1:['A','E'],
2:['A'],
3:['C','B','F']}
starttime=datetime.datetime.now()
s=GSP()
freq1=s.freq1(data, len(data)/2)
s.freq_more(data, freq1)
endtime=datetime.datetime.now()
print(endtime-starttime)