1import sys 2 3from AnyQt.QtWidgets import QSizePolicy 4 5from orangecontrib.datafusion.models import Relation 6from Orange.widgets import widget, gui, settings 7from Orange.widgets.widget import OWWidget, Input, Output 8from orangecontrib.datafusion import movielens 9 10from skfusion import fusion 11 12 13class OWIMDbActors(OWWidget): 14 name = "IMDb Actors" 15 description = "Construct a movie-actor and actor-actor relation matrix." 16 priority = 80000 17 icon = "icons/IMDbActors.svg" 18 want_main_area = False 19 resizing_enabled = False 20 21 class Inputs: 22 filter = Input("Filter", Relation) 23 24 class Outputs: 25 movie_actors = Output("Movie Actors", Relation) 26 actors_actors = Output("Costarring Actors", Relation) 27 28 percent = settings.Setting(10) 29 30 def __init__(self): 31 super().__init__() 32 self.movies = None 33 self.infobox = gui.widgetBox(self.controlArea, "Select Actors") 34 35 percent = gui.hSlider( 36 gui.indentedBox(self.infobox), self, "percent", 37 minValue=1, maxValue=100, step=1, ticks=10, labelFormat="%d %%") 38 39 gui.button(self.controlArea, self, "&Apply", 40 callback=self.send_output, default=True) 41 42 self.setSizePolicy(QSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)) 43 44 self.setMinimumWidth(250) 45 self.setMaximumWidth(250) 46 47 self.movies = None 48 49 @Inputs.filter 50 def set_data(self, relation): 51 if relation is not None: 52 assert isinstance(relation, Relation) 53 if relation.col_type == movielens.ObjectType.Movies: 54 self.movies = relation.relation.col_names 55 elif relation.row_type == movielens.ObjectType.Movies: 56 self.movies = relation.relation.row_names 57 else: 58 self.error(1, "Only relations with ObjectType Movies can be used to filter actors.") 59 60 self.send_output() 61 62 def send_output(self): 63 if self.movies is not None: 64 movie_actor_mat, actors = movielens.movie_concept_matrix(self.movies, concept="actor", 65 actors=self.percent) 66 actor_actor_mat = movielens.actor_matrix(movie_actor_mat) 67 68 movies_actors = fusion.Relation(movie_actor_mat.T, name='play in', 69 row_type=movielens.ObjectType.Actors, row_names=actors, 70 col_type=movielens.ObjectType.Movies, col_names=self.movies) 71 self.Outputs.movie_actors.send(Relation(movies_actors)) 72 73 actors_actors = fusion.Relation(actor_actor_mat, name='costar with', 74 row_type=movielens.ObjectType.Actors, row_names=actors, 75 col_type=movielens.ObjectType.Actors, col_names=actors) 76 self.Outputs.actors_actors.send(Relation(actors_actors)) 77 78 79if __name__ == "__main__": 80 from AnyQt.QtWidgets import QApplication 81 app = QApplication(sys.argv) 82 ow = OWIMDbActors() 83 # ow.set_data(movies_users) 84 ow.show() 85 app.exec_() 86