Example #1
0
class MainWindow(QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.setWindowTitle('Програма для морфологічного аналізу слів, та вирішування тестів')
        self.ui.pushButton_solve.clicked.connect(self.solve)
        self.parser_obj = MyParser()
        self.another = Another()
        self.ab = About()
        self.settings  = Settings()
        self.ui.action.triggered.connect(self.another.instruction)
        self.ui.action_about.triggered.connect(self.ab.about)
        self.ui.action_3.triggered.connect(self.settings.show_set)
        self.settings.ui.checkBox.clicked.connect(self.hide_predict)

        self.show_message('Програма не гарантує 100% правильність відповіді')

    def hide_predict(self):
        self.ui.checkBox_predict.hide()
        self.ui.groupBox_predict.hide()


    def solve(self):
        self.ROW = int(self.ui.lineEdit_number_of_row.text())
        self.WORDS = int(self.ui.lineEdit_number_of_words.text())
        self.answer = AnswerWindow(self.ROW,self.WORDS)
        text = self.ui.plainTextEdit.toPlainText()
        massive = self.make_2d_massive(text)
        self.answer.my_masive = massive
        self.check_parameters(massive)
        self.export = FileExport(self.global_save,self.ROW,self.WORDS)
        self.ui.actionTXT.triggered.connect(self.export.txt)
        self.ui.actionJSON.triggered.connect(self.export.json)

    def check_parameters(self,massive):
        if self.ui.checkBox_predict.isChecked():
            if self.ui.radioButton_rid.isChecked():
                msg = 'Я думаю відповідь '
                self.show_message(msg+self.predict_by_rid(self.find_rid(massive),
                                    woman=self.ui.checkBox_2.isChecked(),
                                    man = self.ui.checkBox_3.isChecked(),
                                    ser = self.ui.checkBox_4.isChecked()))

            elif self.ui.radioButton_chislo.isChecked():
                msg = 'Я думаю відповідь '
                self.show_message(msg + self.predict_by_chislo(self.find_chislo(self.find_vidminok(massive),massive),
                                                                mnog = self.ui.radioButton_5.isChecked(),
                                                                odni = self.ui.radioButton_6.isChecked()))

            elif self.ui.radioButton_vidmina.isChecked():
                msg = 'Я думаю відповідь '
                self.show_message(msg + self.predict_by_vidmina(self.find_vidmina(massive),
                                        a0 = self.ui.checkBox_vidm_1.isChecked(),
                                        a1 = self.ui.checkBox_vidm_2.isChecked(),
                                        a2 = self.ui.checkBox_vidm_3.isChecked(),
                                        a3 = self.ui.checkBox_vidm_4.isChecked()))
            else:
                self.show_message("Виберіть що хочете знайти")
        else:
            if self.ui.radioButton_rid.isChecked():
                self.answer.show_text(self.find_rid(massive))
            elif self.ui.radioButton_chislo.isChecked():
                self.answer.show_text(self.find_chislo(self.find_vidminok(massive),massive))
            elif self.ui.radioButton_vidminok.isChecked():
                self.answer.show_table(self.find_vidminok(massive))
            elif self.ui.radioButton_vidmina.isChecked():
                self.answer.show_text(self.find_vidmina(massive))
            else:
                self.show_message("Виберіть що хочете знайти")

    def show_message(self,answ):
        self.ui.msg.setText(str(answ))
        self.ui.msg.show() #print answer

    def make_2d_massive(self,PText):
        txt = PText.split('\n')
        l = []
        for n in range(len(txt)): #make 2d massive
            l.append(txt[n].split(","))
        for k in range(len(txt)): # delete upper letter
            text = l[k][0]
            text = text[1:len(text)]
            l[k][0] = text
        for i in range(self.ROW): #delete space in front of
            for j in range(self.WORDS):
                text = l[i][j]
                text = text[1:len(l[i][j])]
                l[i][j] = text
        return(l)

#--------------------------- find block ---------------------------------------
    def find_rid(self,massive):
        res = []
        for i in range(self.ROW):
            n = []
            for j in range(self.WORDS):
                try:
                    html = self.parser_obj.get_html("https://slovnyk.ua/index.php?swrd={}".format(massive[i][j]))
                    tmp = self.parser_obj.parse_word_data(html)[1]
                    tmp = tmp[1:len(tmp)-4]
                    n.append(tmp)
                except:
                    n.append("Слова немає в базі")
            res.append(n)
        self.global_save = res
        return(res)

    def find_vidminok(self,massive):
        res = []
        for i in range(self.ROW):
            n = []
            for j in range(self.WORDS):
                try:
                    html = self.parser_obj.get_html("https://slovnyk.ua/index.php?swrd={}".format(massive[i][j]))
                    n.append(self.parser_obj.parse_word_vidminok(html))
                except:
                    mb = []
                    for b in range(7):
                        mb.append(["Слова немає в базі","X","X"])
                    n.append(mb)
            res.append(n)
        self.global_save = res
        return res

    def find_chislo(self,massive,massive2):
        odnina = []
        mnogina = []
        res = []
        for i in range(self.ROW):
            n = []
            for j in range(self.WORDS):
                d = massive[i][j]
                wrd = massive2[i][j]
                for k in range(len(d)):
                    odnina.append(d[k][1])
                    mnogina.append(d[k][len(d[k])-1])
                if wrd in odnina:
                    n.append("Однина")
                elif wrd in mnogina:
                    n.append("Множина")
                else:
                    n.append("Слова немає в базі")
            res.append(n)
        self.global_save = res
        return res

    def find_vidmina(self,massive):
        vidminok = self.find_vidminok(massive)
        rid = self.find_rid(massive)
        res = []
        for i in range(self.ROW):
            n = []
            for j in range(self.WORDS):
                d = vidminok[i][j]
                if rid[i][j] == 'чоловічий':
                    if d[0][1][len(d[0][1])-1] == 'а':
                        n.append("1 відміна")
                    elif d[0][1][len(d[0][1])-1] == 'я':
                        n.append("1 відміна")
                    else:
                        n.append("2 відміна")
                elif rid[i][j] == 'жіночий':
                    if d[0][1][len(d[0][1])-1] == 'а':
                        n.append("1 відміна")
                    elif d[0][1][len(d[0][1])-1] == 'я':
                        n.append("1 відміна")
                    else:
                        n.append("3 відміна")
                elif rid[i][j] == 'середній':
                    count = 0
                    for bn in range(7):
                        if 'ат' in d[bn][1]:
                            count += 1
                        elif 'ят' in d[bn][1]:
                            count += 1
                        elif 'ен' in d[bn][1]:
                            count += 1
                    if count:
                        n.append("4 відміна")
                    else:
                        n.append("2 відміна")
                else:
                    n.append("X")
            res.append(n)
        self.global_save = res
        return(res)

#--------------------------- predict block ------------------------------------
    def predict_by_rid(self,data,**params):
        l = []
        if params['woman']:
            l.append("жіночий")
        if params['man']:
            l.append("чоловічий")
        if params['ser']:
            l.append("середній")
        if len(l) > 1:
            if l[0] == 'жіночий':
                if l[1] == 'чоловічий':
                    l.append("чоловічий і жіночий")
        res = []
        for i in range(self.ROW):
            count = 0
            for j in range(self.WORDS):
                if data[i][j] in l:
                    count +=1
            res.append(count)
        answer = ANSWER_LETTER[res.index(max(res))]
        self.global_save = answer
        return(answer)

    def predict_by_chislo(self,data,**params):
        l =[]
        if params['mnog']:
            l.append("Множина")
        if params['odni']:
            l.append("Однина")
        res = []
        for i in range(self.ROW):
            count = 0
            for j in range(self.WORDS):
                if data[i][j] in l:
                    count += 1
            res.append(count)
        answer = ANSWER_LETTER[res.index(max(res))]
        self.global_save = answer
        return(answer)

    def predict_by_vidmina(self,data,**params):
        l = []
        for k in range(4):
            if params["a"+str(k)]:
                l.append(str(k+1)+ " відміна")
        res = []
        for i in range(self.ROW):
            count = 0
            for j in range(self.WORDS):
                if data[i][j] in l:
                    count += 1
            res.append(count)
        answer = ANSWER_LETTER[res.index(max(res))]
        self.global_save = answer
        return(answer)