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

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

Changes made to synchronous and asynchronous requests. Bug fixed in database between app id and md5.

File size: 5.3 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):
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        # If exists, just return the value.
52        # Otherwise, create a new record in the table
53
54        c.execute(''' SELECT ID FROM app WHERE app_md5=? ''',(app_md5,))
55        res = c.fetchone()
56
57        if res:
58                c.execute(''' SELECT is_mature FROM final_results WHERE for_id=? ''',(res[0],))
59                res2 = c.fetchone()
60                if res2:
61                        db.close()
62                        return res2[0]
63                else:
64                        tb_id = res[0]
65        else:
66                c.execute(''' INSERT INTO app(app_md5) VALUES (?) ''',(app_md5,))
67                db.commit()
68                c.execute(''' SELECT ID FROM app WHERE app_md5=? ''',(app_md5,))
69                tb_id = c.fetchone()[0]
70
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 res:
90                        icon_l.append((('explicit',res[0]), ('safe',res[1])))
91                else:
92                        res = analyse_explicit(illust2vec, icon)
93                        exp = False
94                        if res[0][1]>res[1][1]:
95                                exp = True
96                        c.execute(''' INSERT INTO image_results VALUES (?,?,?,?,?,?,?) ''',(int(tb_id), icon, res[0][1], res[1][1], exp, -1,  "icon",))
97                        db.commit()
98                        icon_l.append(res)
99
100        for scr in screenshots:
101                # Check if has already been analysed.
102                # If it has, just append the previous result.
103                # If not, save the new result
104                c.execute(''' SELECT image_exp, image_safe FROM image_results WHERE url=?''',(scr,))
105                res = c.fetchone()
106                if res:
107                        screens.append((('explicit',res[0]), ('safe',res[1])))
108                else:
109                        res = analyse_explicit(illust2vec, scr)
110                        exp = False
111                        if res[0][1]>res[1][1]:
112                                exp = True
113                        c.execute(''' INSERT INTO image_results VALUES (?,?,?,?,?,?,?) ''',(int(tb_id), scr, res[0][1], res[1][1], exp, -1,  "screenshot",))
114                        db.commit()
115                        screens.append(res)
116
117
118        # Check if has already been analysed.
119        # If it has, just use the previous result.
120        # If not, save the new result
121        c.execute(''' SELECT text_exp FROM text_results WHERE for_id=? ''',(int(tb_id),))
122        res = c.fetchone()
123        if res:
124                description = res[0]
125        else:
126                exp = False
127                description = text_cat(description, size, category, age)
128                if description.prob('exp')>0.5:
129                        exp = True
130                c.execute(''' INSERT INTO text_results VALUES (?,?,?,?) ''',(int(tb_id), description.prob('exp'), exp, -1,))
131                db.commit()
132
133        def find_features(icon_list, scr_list, description_result):
134                features = {}
135                maximum = 0
136                flag = 0
137                safe = 0
138
139                # Find maximum percentage of explicitness and its safetiness percentage.
140
141                if len(icon_list)==0:
142                        maximum = 0.5
143                        safe = 0.5
144                else:
145                        for icon in icon_list:
146                                for data in icon:
147                                        if data[0]=='explicit' and data[1]>maximum:
148                                                maximum = data[1]
149                                                flag = 1
150                                        if data[0]=='safe' and flag==1:
151                                                safe = data[1]
152                                                flag = 0
153                maximum_s = 0
154                flag = 0
155                safe_s = 0
156
157                if len(scr_list)==0:
158                        maximum_s = 0.5
159                        safe_s = 0.5
160                else:
161                        for scr in scr_list:
162                                for data in scr:
163                                        if data[0]=='explicit' and data[1]>maximum_s:
164                                                maximum_s = data[1]
165                                                flag = 1
166                                        if data[0]=='safe' and flag==1:
167                                                safe_s = data[1]
168                                                flag = 0
169
170                features['ic_exp'] = maximum
171                features['ic_non'] = safe
172                features['sc_exp'] = maximum_s
173                features['sc_non'] = safe_s
174                try:
175                        features['desc_exp'] = description_result.prob('exp')
176                except:
177                        features['desc_exp'] = description_result
178                return features
179        features = find_features(icon_l, screens, description)
180
181        # Save and close the database
182        c.execute(''' SELECT exp_per FROM final_results WHERE for_id=? ''', (int(tb_id),))
183        res = c.fetchone()
184        if res:
185                db.close()
186                return res[0]
187        else:
188                exp = False
189                res = classifier.prob_classify(features)
190                if res.prob('exp')>0.5:
191                        exp = True
192                c.execute(''' INSERT INTO final_results VALUES (?,?,?,?,?) ''', (int(tb_id), time.time(), res.prob('exp'),exp,-1,))
193                db.commit()
194                db.close()
195                return res
196
Note: See TracBrowser for help on using the repository browser.