source: internals/2016/aptoideimagesdetector/trunk/aptoide_mature_app_detector/aptoide_mature_app_detector/explicit_content_detector/API/Explicit_detector/analyse_app.py @ 16525

Last change on this file since 16525 was 16525, checked in by dferreira, 4 years ago

Added option of force reload the cache

File size: 7.6 KB
Line 
1# Diogo Daniel Soares Ferreira
2# diogodanielsoaresferreira@ua.pt
3# Aptoide, 2016
4
5# Main function to analyse the percentage of explicitness of an app
6
7from __future__ import division
8import json
9import sqlite3
10import os
11import time
12import i2v
13import pickle
14from Illustration2Vector.illustration2vec_master.analyse_image import analyse_explicit
15from Text_categorization.Text_categorization import text_cat
16
17# Returns the illustration2vector model
18
19def get_model():
20        illust2vec = []
21
22        p = os.path.abspath(os.path.join("../", os.pardir))
23
24        with open(p+"/config.json") as json_data:
25                config = json.load(json_data)
26
27        try:
28                illust2vec_f = open(config['directories']['ill2vec_ser'], "rb")
29                illust2vec = pickle.load(illust2vec_f)
30                illust2vec_f.close()
31        except IOError:
32                illust2vec = i2v.make_i2v_with_chainer(config['directories']['ill2vec_model']
33            , config['directories']['ill2vec_tag_list'])
34                save_model = open(config['directories']['ill2vec_ser'], "wb")
35                pickle.dump(illust2vec, save_model)
36                save_model.close()
37        return illust2vec
38
39def analyse_app(app_id, app_md5, illust2vec, icons, screenshots, description, category, age, size, title, cache_reload):
40
41        p = os.path.abspath(os.path.join("../", os.pardir))
42        tb_id = 0
43        with open(p+"/config.json") as json_data:
44                config = json.load(json_data)
45
46        # Connect to database
47        db = sqlite3.connect(config['directories']['final_database'])
48        c = db.cursor()
49
50        # If id exists, app has already been processed.
51        c.execute(''' SELECT ID FROM app WHERE app_md5=? ''',(app_md5,))
52        res = c.fetchone()
53
54        if res:
55                # If is not needed to reload the cache, tries to return the result
56                if cache_reload==0:
57                        c.execute(''' SELECT is_mature FROM final_results WHERE for_id=? ''',(res[0],))
58                        res2 = c.fetchone()
59                        if res2:
60                                db.close()
61                                return res2[0]
62                        else:
63                                tb_id = res[0]
64                else:
65                        tb_id = res[0]
66        else:
67                c.execute(''' INSERT INTO app(app_md5) VALUES (?) ''',(app_md5,))
68                db.commit()
69                c.execute(''' SELECT ID FROM app WHERE app_md5=? ''',(app_md5,))
70                tb_id = c.fetchone()[0]
71
72        # Tries to load the model for text categorization
73        try:
74                f = open(config['directories']['text_cat_model'], "rb")
75                classifier = pickle.load(f)
76                f.close()
77        except:
78                print "Serialized objects not found"
79                exit(0)
80
81        icon_l = []
82        screens = []
83        for icon in icons:
84                # Check if has already been analysed.
85                # If it has, just append the previous result.
86                # If not, save the new result
87                c.execute(''' SELECT image_exp, image_safe FROM image_results WHERE url=?''',(icon,))
88                res = c.fetchone()
89                # If is not needed to reload the cache, tries to return the result saved
90                if cache_reload==0:
91                        if res:
92                                icon_l.append((('explicit',res[0]), ('safe',res[1])))
93                        else:
94                                res = analyse_explicit(illust2vec, icon)
95                                exp = False
96                                if res[0][1]>res[1][1]:
97                                        exp = True
98                                c.execute(''' INSERT INTO image_results VALUES (?,?,?,?,?,?,?) ''',(int(tb_id), icon, res[0][1], res[1][1], exp, -1,  "icon",))
99                                db.commit()
100                                icon_l.append(res)
101                else:
102                        res = analyse_explicit(illust2vec, icon)
103                        exp = False
104                        if res[0][1]>res[1][1]:
105                                exp = True
106
107                        # If the image already exists, it is needed to update the result
108                        if res:
109                                c.execute(''' UPDATE image_results SET for_id=?, image_exp=?, image_safe=?, is_mature=?, external_validator=?, icon_or_screenshot=? WHERE url=? ''', (int(tb_id), res[0][1], res[1][1], exp, -1, "icon", icon,))
110                                db.commit()
111                        # If the image does not exist, insert new result
112                        else:
113                                c.execute(''' INSERT INTO image_results VALUES (?,?,?,?,?,?,?) ''',(int(tb_id), icon, res[0][1], res[1][1], exp, -1,  "icon",))
114                                db.commit()
115
116                        icon_l.append(res)
117
118        for scr in screenshots:
119                # Check if has already been analysed.
120                # If it has, just append the previous result.
121                # If not, save the new result
122                c.execute(''' SELECT image_exp, image_safe FROM image_results WHERE url=?''',(scr,))
123                res = c.fetchone()
124                # If is not needed to reload the cache, tries to return the result saved
125                if cache_reload==0:
126                        if res:
127                                screens.append((('explicit',res[0]), ('safe',res[1])))
128                        else:
129                                res = analyse_explicit(illust2vec, scr)
130                                exp = False
131                                if res[0][1]>res[1][1]:
132                                        exp = True
133                                c.execute(''' INSERT INTO image_results VALUES (?,?,?,?,?,?,?) ''',(int(tb_id), scr, res[0][1], res[1][1], exp, -1,  "screenshot",))
134                                db.commit()
135                                screens.append(res)
136                else:
137                        res = analyse_explicit(illust2vec, icon)
138                        exp = False
139                        if res[0][1]>res[1][1]:
140                                exp = True
141
142                        # If the image already exists, it is needed to update the result
143                        if res:
144                                c.execute(''' UPDATE image_results SET for_id=?, image_exp=?, image_safe=?, is_mature=?, external_validator=?, icon_or_screenshot=? WHERE url=? ''', (int(tb_id), res[0][1], res[1][1], exp, -1, "icon", icon,))
145                                db.commit()
146                        # If the image does not exist, insert new result
147                        else:
148                                c.execute(''' INSERT INTO image_results VALUES (?,?,?,?,?,?,?) ''',(int(tb_id), icon, res[0][1], res[1][1], exp, -1,  "icon",))
149                                db.commit()
150
151                        icon_l.append(res)
152
153        # Check if has already been analysed.
154        c.execute(''' SELECT text_exp FROM text_results WHERE for_id=? ''',(int(tb_id),))
155        res = c.fetchone()
156       
157        # If it was already analysed and it is not needed to reload the cache, just get the result
158        if res and cache_reload==0:
159                description = res[0]
160       
161        # If exists a result and cache_reload==1, update the cache
162        elif res:
163                exp = False
164                description = text_cat(description, size, category, age)
165                if description.prob('exp')>0.5:
166                        exp = True
167                c.execute(''' UPDATE text_results SET text_exp=?, is_mature=?, external_validator=? WHERE for_id=? ''',(description.prob('exp'), exp, -1, int(tb_id),))
168                db.commit()
169       
170        # If there is no result, just insert a new one
171        else:
172                exp = False
173                description = text_cat(description, size, category, age)
174                if description.prob('exp')>0.5:
175                        exp = True
176                c.execute(''' INSERT INTO text_results VALUES (?,?,?,?) ''',(int(tb_id), description.prob('exp'), exp, -1,))
177                db.commit()
178
179        def find_features(icon_list, scr_list, description_result):
180                features = {}
181                maximum = 0
182                flag = 0
183                safe = 0
184
185                # Find maximum percentage of explicitness and its safetiness percentage.
186
187                if len(icon_list)==0:
188                        maximum = 0.5
189                        safe = 0.5
190                else:
191                        for icon in icon_list:
192                                for data in icon:
193                                        if data[0]=='explicit' and data[1]>maximum:
194                                                maximum = data[1]
195                                                flag = 1
196                                        if data[0]=='safe' and flag==1:
197                                                safe = data[1]
198                                                flag = 0
199                maximum_s = 0
200                flag = 0
201                safe_s = 0
202
203                if len(scr_list)==0:
204                        maximum_s = 0.5
205                        safe_s = 0.5
206                else:
207                        for scr in scr_list:
208                                for data in scr:
209                                        if data[0]=='explicit' and data[1]>maximum_s:
210                                                maximum_s = data[1]
211                                                flag = 1
212                                        if data[0]=='safe' and flag==1:
213                                                safe_s = data[1]
214                                                flag = 0
215
216                features['ic_exp'] = maximum
217                features['ic_non'] = safe
218                features['sc_exp'] = maximum_s
219                features['sc_non'] = safe_s
220                try:
221                        features['desc_exp'] = description_result.prob('exp')
222                except:
223                        features['desc_exp'] = description_result
224                return features
225        features = find_features(icon_l, screens, description)
226
227        # Save and close the database
228        c.execute(''' SELECT exp_per FROM final_results WHERE for_id=? ''', (int(tb_id),))
229        res = c.fetchone()
230        if res and cache_reload==0:
231                db.close()
232                return res[0]
233        elif res:
234                exp = False
235                res = classifier.prob_classify(features)
236                if res.prob('exp')>0.5:
237                        exp = True
238                c.execute(''' UPDATE final_results SET date=?, exp_per=?, is_mature=?, external_validator=? WHERE for_id=? ''', (time.time(), res.prob('exp'),exp,-1, int(tb_id),))
239                db.commit()
240                db.close()
241                return res
242        else:
243                exp = False
244                res = classifier.prob_classify(features)
245                if res.prob('exp')>0.5:
246                        exp = True
247                c.execute(''' INSERT INTO final_results VALUES (?,?,?,?,?) ''', (int(tb_id), time.time(), res.prob('exp'),exp,-1,))
248                db.commit()
249                db.close()
250                return res
251
Note: See TracBrowser for help on using the repository browser.