コード例 #1
0
class NormalizationModule(SingleMethodModule):
    attribute = 'normalizer'
    title = 'Normalization'
    toggle_enabled = True
    enabled = settings.Setting(False)

    methods = [
        preprocess.PorterStemmer,
        preprocess.SnowballStemmer,
        preprocess.WordNetLemmatizer,
        preprocess.UDPipeLemmatizer,
    ]

    SNOWBALL = 1
    UDPIPE = 3

    snowball_language = settings.Setting('English')
    udpipe_language = settings.Setting('English')
    udpipe_tokenizer = settings.Setting(False)

    def __init__(self, master):
        super().__init__(master)

        label = gui.label(self, self, 'Language:')
        label.setAlignment(Qt.AlignRight)
        self.method_layout.addWidget(label, self.SNOWBALL, 1)
        snowball_box = widgets.ComboBox(self, 'snowball_language',
                               items=preprocess.SnowballStemmer.supported_languages)
        snowball_box.currentIndexChanged.connect(self.change_language)
        self.method_layout.addWidget(snowball_box, self.SNOWBALL, 2)
        self.methods[self.SNOWBALL].language = self.snowball_language

        self.udpipe_tokenizer_box = QCheckBox("UDPipe tokenizer", self,
                                              checked=self.udpipe_tokenizer)
        self.udpipe_tokenizer_box.stateChanged.connect(self.change_tokenizer)
        self.method_layout.addWidget(self.udpipe_tokenizer_box, self.UDPIPE, 1)
        self.udpipe_label = gui.label(self, self, 'Language:')
        self.udpipe_label.setAlignment(Qt.AlignRight)
        self.method_layout.addWidget(self.udpipe_label, self.UDPIPE, 2)
        self.udpipe_models = UDPipeModels()
        self.create_udpipe_box()
        self.udpipe_online = self.udpipe_models.online
        self.on_off_button.stateChanged.connect(self.check_udpipe_online)
        self.check_udpipe_online()
        self.methods[self.UDPIPE].language = self.udpipe_language
        self.methods[self.UDPIPE].use_tokenizer = self.udpipe_tokenizer

    def create_udpipe_box(self):
        if not self.udpipe_models.supported_languages:
            self.group.button(self.UDPIPE).setEnabled(False)
            self.udpipe_tokenizer_box.setEnabled(False)
            self.udpipe_label.setEnabled(False)
            self.udpipe_box = widgets.ComboBox(self, 'udpipe_language', items=[''])
            self.udpipe_box.setEnabled(False)
        else:
            self.group.button(self.UDPIPE).setEnabled(True)
            self.udpipe_tokenizer_box.setEnabled(True)
            self.udpipe_label.setEnabled(True)
            self.udpipe_box = widgets.ComboBox(self, 'udpipe_language',
                                          items=self.udpipe_models.supported_languages)
        self.udpipe_box.currentIndexChanged.connect(self.change_language)
        self.method_layout.addWidget(self.udpipe_box, self.UDPIPE, 3)

    def check_udpipe_online(self):
        current_state = self.udpipe_models.online
        if self.udpipe_online != current_state:
            self.create_udpipe_box()
            self.udpipe_online = current_state

        self.master.Warning.udpipe_offline.clear()
        self.master.Warning.udpipe_offline_no_models.clear()
        if not current_state and self.enabled:
            if self.udpipe_models.supported_languages:
                self.master.Warning.udpipe_offline()
            else:
                self.master.Warning.udpipe_offline_no_models()

    def change_language(self):
        if self.methods[self.SNOWBALL].language != self.snowball_language:
            self.methods[self.SNOWBALL].language = self.snowball_language

            if self.method_index == self.SNOWBALL:
                self.change_signal.emit()

        if self.methods[self.UDPIPE].language != self.udpipe_language:
            self.methods[self.UDPIPE].language = self.udpipe_language

            if self.method_index == self.UDPIPE:
                self.change_signal.emit()

    def change_tokenizer(self):
        self.udpipe_tokenizer = self.udpipe_tokenizer_box.isChecked()
        if self.methods[self.UDPIPE].use_tokenizer != self.udpipe_tokenizer:
            self.methods[self.UDPIPE].use_tokenizer = self.udpipe_tokenizer

            if self.method_index == self.UDPIPE:
                self.change_signal.emit()
コード例 #2
0
class NormalizeEditor(ScBaseEditor):
    DEFAULT_GROUP_BY = False
    DEFAULT_GROUP_VAR = None
    DEFAULT_METHOD = Normalize.CPM

    def __init__(self, parent=None, master=None, **kwargs):
        super().__init__(parent, **kwargs)
        self._group_var = self.DEFAULT_GROUP_VAR
        self._master = master
        self._master.input_data_changed.connect(self._set_model)
        self.setLayout(QVBoxLayout())

        form = QFormLayout()
        cpm_b = QRadioButton("Counts per million", checked=True)
        med_b = QRadioButton("Median")
        self.group = QButtonGroup()
        self.group.buttonClicked.connect(self._on_button_clicked)
        for i, button in enumerate([cpm_b, med_b]):
            index = index_to_enum(Normalize.Method, i).value
            self.group.addButton(button, index - 1)
            form.addRow(button)

        self.group_by_check = QCheckBox("Cell Groups: ",
                                        enabled=self.DEFAULT_GROUP_BY)
        self.group_by_check.clicked.connect(self.edited)
        self.group_by_combo = QComboBox(enabled=self.DEFAULT_GROUP_BY)
        self.group_by_model = DomainModel(order=(DomainModel.METAS,
                                                 DomainModel.CLASSES),
                                          valid_types=DiscreteVariable,
                                          alphabetical=True)
        self.group_by_combo.setModel(self.group_by_model)
        self.group_by_combo.currentIndexChanged.connect(self.changed)
        self.group_by_combo.activated.connect(self.edited)

        form.addRow(self.group_by_check, self.group_by_combo)
        self.layout().addLayout(form)

        self._set_model()

    def _set_model(self):
        data = self._master.data
        self.group_by_model.set_domain(data and data.domain)
        enable = bool(self.group_by_model)
        self.group_by_check.setChecked(False)
        self.group_by_check.setEnabled(enable)
        self.group_by_combo.setEnabled(enable)
        if self.group_by_model:
            self.group_by_combo.setCurrentIndex(0)
            if self._group_var and self._group_var in data.domain:
                index = self.group_by_model.indexOf(self._group_var)
                self.group_by_combo.setCurrentIndex(index)
        else:
            self.group_by_combo.setCurrentText(None)

    def _on_button_clicked(self):
        self.changed.emit()
        self.edited.emit()

    def setParameters(self, params):
        method = params.get("method", self.DEFAULT_METHOD)
        index = enum_to_index(Normalize.Method, method)
        self.group.buttons()[index].setChecked(True)
        self._group_var = params.get("group_var", self.DEFAULT_GROUP_VAR)
        group = bool(self._group_var and self.group_by_model)
        if group:
            index = self.group_by_model.indexOf(self._group_var)
            self.group_by_combo.setCurrentIndex(index)
        group_by = params.get("group_by", self.DEFAULT_GROUP_BY)
        self.group_by_check.setChecked(group_by and group)

    def parameters(self):
        index = self.group_by_combo.currentIndex()
        group_var = self.group_by_model[index] if index > -1 else None
        group_by = self.group_by_check.isChecked()
        method = index_to_enum(Normalize.Method, self.group.checkedId())
        return {"group_var": group_var, "group_by": group_by, "method": method}

    @staticmethod
    def createinstance(params):
        group_var = params.get("group_var")
        group_by = params.get("group_by", NormalizeEditor.DEFAULT_GROUP_BY)
        method = params.get("method", NormalizeEditor.DEFAULT_METHOD)
        return NormalizeGroups(group_var, method) \
            if group_by and group_var else NormalizeSamples(method)

    def __repr__(self):
        method = self.group.button(self.group.checkedId()).text()
        index = self.group_by_combo.currentIndex()
        group_var = self.group_by_model[index] if index > -1 else None
        group_by = self.group_by_check.isChecked()
        group_text = ", Grouped by: {}".format(group_var) if group_by else ""
        return "Method: {}".format(method) + group_text