Exemple #1
0
def try1():
    G = nx.MultiGraph()

    path = r"test_books\1.zip"
    xml = bm.open_book(path)
    _xpath = etree.XPath(r'//*')
    dom = etree.XML(xml)
    ans = _xpath(dom)

    for i in ans:
        """Обработка заголовков, автора и т.д. через i.text """
        if re.search(r"\b[p]", i.tag):  # предполагаю, что строки с текстом заканчиваются на p
            """ Построчная обработка книги перед предпроцессингом (Только текста) """
            if not i.text:
                continue
            sintax = get_sintax(i.text)
            add_to_graph(sintax, G)

    keys = []
    for key in G:
        if not G[key]:
            keys.append(key)
    for key in keys:
        G.remove_node(key)
    # for i in range(10):
    #     print(combined_model.make_sentence(tries=30))

    node_color = [G.degree(v)/10 for v in G]
    print(node_color)
    # node_size = [0.0005 * nx.get_node_attributes(G, 'population')[v] for v in G]
    nx.draw(G, nlist=[G.nodes], with_labels=True, node_color=node_color, font_color="k")
    plt.show()
Exemple #2
0
def compressing():
    for num in range(32800, 40000):
        path = r"test_books\%s.zip" % str(num)
        try:
            book = open_book(path)  # Проверка нормальный ли файл
            plc_path = r'graph_models\{}_graph.plc'.format(str(num))
            book_dict = BL.compress_book(path)
            print(num, book_dict)
            with open(plc_path, 'wb') as f:
                pickle.dump(book_dict, f)
        except zipfile.BadZipFile:
            continue
    def new_book_analys(self, path):
        """Обнуление переменных на случай, если была загружена прошлая книга"""
        self.book_strings = []
        self.counter = Counter([])
        self.swear_set = set()

        self.avd_word_counter = 0
        self.verb_now = 0
        self.noun_now = 0
        self.adv_now = 0
        self.verb_list = []
        self.noun_list = []
        self.adv_list = []

        xml = bm.open_book(path)
        print()
        print()

        print(xml.decode())
        print()
        print()
        _xpath = etree.XPath(r'//*')
        dom = etree.XML(xml)
        ans = _xpath(dom)

        for i in ans:
            """Обработка заголовков, автора и т.д. через i.text """
            if re.search(r"\b[p]", i.tag):  # предполагаю, что строки с текстом заканчиваются на p
                """ Построчная обработка книги перед предпроцессингом (Только текста) """
                p_text = self.preprocess_text(self, i.text)  # Обработка каждой строки книги
                """ Построчная обработка после предпроцессинга (Только текста)"""
                self.get_structure(p_text)
        print(self.counter)
        """ Работа с вторичными данными"""
        self.swear_set = self.swear_counter(self.counter)
        x_plt = [i for i in range(self._avd_quantity, len(self.noun_list)*self._avd_quantity+1, self._avd_quantity)]
        plt = vis.f_plot(x_plt, self.noun_list, x_plt, self.verb_list, x_plt, self.adv_list, colors=["red", "green", "blue"], plot_names=['Сущ.', 'Глаголы', "Прил."])
        plt.show()
Exemple #4
0
    for word in sintax:
        if len(word) > 0 and word[0] != "#":
            word = word.replace("	", " ").split()
            if word[6] == "0":
                continue
            graph.add_edge(sintax_dict[word[6]], word[2], context=word[6])


from UDPipe_api import *
import networkx as nx

G = nx.MultiGraph()

path = r"test_books\slugi.zip"
xml = bm.open_book(path)
_xpath = etree.XPath(r'//*')
dom = etree.XML(xml)
ans = _xpath(dom)
for i in ans[200:300]:
    """Обработка заголовков, автора и т.д. через i.text """
    if re.search(
            r"\b[p]",
            i.tag):  # предполагаю, что строки с текстом заканчиваются на p
        """ Построчная обработка книги перед предпроцессингом (Только текста) """
        sintax = get_sintax(i.text)
        add_to_graph(sintax, G)

# for i in range(10):
#     print(combined_model.make_sentence(tries=30))
Exemple #5
0
                r"\b[p]",
                i.tag):  # предполагаю, что строки с текстом заканчиваются на p
            if not i.text:
                continue
            """ Построчная обработка книги перед предпроцессингом (Только текста) """
            sintax = udpipe_obj.get_sintax(i.text)
            sintax_list.append(sintax)
    return sintax_list


if __name__ == '__main__':
    udpipe = UDPipe()
    for book_num in range(0, 100000):
        book_path = r'E:\books\flibusta_' + str(book_num) + '.zip'
        try:
            book_xml = book_manager.open_book(book_path)
            book_info = get_base_info_from_book_xml(book_xml)
            print(book_num, book_info)
            # rating = LitresParser.get_rating(book_info['author_name'] + " " + book_info['author_second_name'],
            #                            book_info['title'])
            # print(rating)
            sintax_list = get_sintax_list(udpipe, book_xml)
            sintax_save_path = r"E:\sintax_lists\sintax_flibusta_" + str(
                book_num) + '.plc'
            with open(sintax_save_path, 'wb') as f:
                clf = pickle.dump(sintax_list, f)
                print("Сохранено :) ")
        except zipfile.BadZipFile:
            # book = open(book_path, 'r', encoding='utf8')
            continue  # Там есть полезная инфа, но книги нет
        except BookNotFound:
Exemple #6
0
def compress_book(path):
    UD = udpipe.UDPipe()
    G = nx.MultiGraph()

    xml = bm.open_book(path)
    _xpath = etree.XPath(r'//*')
    dom = etree.XML(xml)
    ans = _xpath(dom)

    author = dict()
    book_title = None

    sintax_time = time.time()
    # Создаем первичный граф
    for i in ans[:100]:  # TODO Распаралелить?
        """Обработка заголовков, автора и т.д. через i.text """
        if re.search(
                r"\b[p]",
                i.tag):  # предполагаю, что строки с текстом заканчиваются на p
            if not i.text:
                continue
            """ Построчная обработка книги перед предпроцессингом (Только текста) """
            text_list = i.text.split(". ")
            for text in text_list:
                sintax = UD.get_sintax(text)
                add_to_graph(sintax, G)
        else:
            if re.search(r"\blast-name",
                         i.tag) and author.get('last', None) is None:
                author["last"] = i.text
            if re.search(r"\bmiddle-name",
                         i.tag) and author.get('middle', None) is None:
                author["middle"] = i.text
            if re.search(r"\bfirst-name",
                         i.tag) and author.get('first', None) is None:
                author["first"] = i.text
            if re.search(r"\bbook-title", i.tag) and book_title is None:
                book_title = i.text

    print(book_title)
    author_str = author.get('last', "")
    if author_str:
        if author.get('first', ""):
            author_str += ' ' + author['first'][:1].upper() + "."
            if author.get('middle', ""):
                author_str += author['middle'][:1].upper() + "."
    print(author_str)
    print("Время обработки синтаксиса из {} равно {}".format(
        str(len(ans)), str(time.time() - sintax_time)))
    # with open(r"sintax_models\slugi_sintax_dict.plk", 'wb') as f:
    #     pickle.dump(sintax_dict, f)
    # Граф собран - дальше постобработка
    # Объединим синонимы
    sintax_time = time.time()

    G = combine_synonims(G)
    print("Время обработки синонимов для {} равно {}".format(
        str(len(G)), str(time.time() - sintax_time)))

    # убираем указательные местоимения
    sintax_time = time.time()
    G = delete_target_pronouns(G)
    print("Время обработки местоимений для {} равно {}".format(
        str(len(G)), str(time.time() - sintax_time)))

    # Удаляем одинокие вершины
    keys = []
    for key in G:
        if not G[key]:
            keys.append(key)
    for key in keys:
        G.remove_node(key)

    return {"book_title": book_title, "author": author_str, "graph": G}
Exemple #7
0
def try4():
    G = nx.MultiGraph()
    clf = train_logistic_regression(300, "person_train", const.person_list, const.non_person_list)

    path = r"test_books\slugi.zip"
    path = r"test_books\1.zip"

    xml = bm.open_book(path)
    _xpath = etree.XPath(r'//*')
    dom = etree.XML(xml)
    ans = _xpath(dom)

    for i in ans:
        """Обработка заголовков, автора и т.д. через i.text """
        if re.search(r"\b[p]", i.tag):  # предполагаю, что строки с текстом заканчиваются на p
            if not i.text:
                continue
            """ Построчная обработка книги перед предпроцессингом (Только текста) """
            sintax = get_sintax(i.text)
            add_to_graph4(sintax, G)

    # Граф собран - дальше постобработка

    keys = []  # Удалим вершины без ребер
    for key in G:
        if not G[key]:
            keys.append(key)
    for key in keys:
        G.remove_node(key)

    # Обединим синонимы
    noun_word_list = []
    noun_vec_list = []
    verb_word_list = []
    verb_vec_list = []

    for word in G:  # Соберем вектора для объединения синонимов
        if is_pronoun(word):  # Метоимения не объединяем
            continue
        token_word = tokenizer.get_stat_token_word(morph, word)
        if token_word is None:
            continue
        vec = client.get_vec(token_word)
        if len(vec) == 0:
            continue

        if token_word.find("NOUN") != -1:  # Пока объединим только существительные
            noun_word_list.append(word)
            noun_vec_list.append(vec)
        if token_word.find("VERB") != -1:  # объединяем глаголы
            verb_word_list.append(word)
            verb_vec_list.append(vec)

    size = len(noun_vec_list)
    for base in range(size):  # Объединяем синонимы существительныз
        for comp in range(base+1, size):
            if cosine(noun_vec_list[base], noun_vec_list[comp]) < 0.5:
                old_name1 = noun_word_list[base]
                old_name2 = noun_word_list[comp]
                if old_name1 == old_name2:
                    continue
                new_vec = (noun_vec_list[base] + noun_vec_list[comp]) / 2
                res = json.loads(client.get_word_by_vec(new_vec.tostring()).decode())["res"][0]
                new_name = res[0].split("_")[0]
                combine_nodes(old_name1, old_name2, new_name, G)
                for word in range(len(noun_word_list)):
                    if noun_word_list[word] in [old_name1, old_name2]:
                        noun_word_list[word] = new_name

    size = len(verb_vec_list)
    for base in range(size):  # Объединяем синонимы глаголов
        for comp in range(base+1, size):
            if cosine(verb_vec_list[base], verb_vec_list[comp]) < 0.5:
                old_name1 = verb_word_list[base]
                old_name2 = verb_word_list[comp]
                if old_name1 == old_name2:
                    continue
                new_vec = (verb_vec_list[base] + verb_vec_list[comp]) / 2
                res = json.loads(client.get_word_by_vec(new_vec.tostring()).decode())["res"][0]
                new_name = res[0].split("_")[0]
                combine_nodes(old_name1, old_name2, new_name, G)
                for word in range(len(verb_word_list)):
                    if verb_word_list[word] in [old_name1, old_name2]:
                        verb_word_list[word] = new_name

    # убираем указательные местоимения
    target_pronouns = ["ты", "вы", "он", "она", "они"]
    story_hystory = nx.get_edge_attributes(G, "story_time")

    print(story_hystory)
    for pron in target_pronouns:  # Пробегаемся по местоимениям
        if pron not in G.nodes:
            continue

        pron_edges = list(G[pron].keys())
        for base_edge in pron_edges:  # берем все их связи
            if is_pronoun(base_edge) or is_continue_word(base_edge):  # Связи с проходными словами и метоимениями можно не учитывать
                continue
            min_person = None
            person = None

            st_time = None
            for q in range(10000):
                if (pron, base_edge, q) in story_hystory.keys():
                    st_time = story_hystory[(pron, base_edge, q)]
                if (base_edge, pron, q) in story_hystory.keys():
                    st_time = story_hystory[(base_edge, pron, q)]
                if st_time is not None:
                    break
            if st_time is None:
                # print(G[base_edge])
                # for line in story_hystory:  # Когда объединяли синонимы - мы выкидывали время в сюжете
                #     if line[0] == base_edge or line[1] == base_edge:
                #         print(line)
                continue

            for edge in story_hystory:  # Ищем ближайшего персонажа к данному
                for word in edge[:2]:
                    if is_pronoun(word):
                        continue
                    token_word = tokenizer.get_stat_token_word(morph, word)
                    if token_word is None or token_word.find("NOUN") == -1:
                        continue
                    vec = client.get_vec(token_word)
                    if vec is None or len(vec) == 0:
                        continue
                    is_person = clf.predict(vec.reshape(1, -1))
                    if is_person != 0:
                        continue

                    dist = math.fabs(story_hystory[edge]-st_time)
                    if story_hystory[edge] < st_time:
                        dist /= 2
                    if min_person is None or dist < min_person:
                        min_person = math.fabs(story_hystory[edge]-st_time)
                        person = word
            replace_edge(pron, base_edge, person, G)

    for pron in target_pronouns:
        if pron in G.nodes:
            G.remove_node(pron)

    # i_do = G["я"].keys()
    # max_inter = 0
    # max_key = None
    # for key in G.nodes:
    #     if len(G[key].keys() & i_do)/len(G[key].keys() | i_do) > max_inter and not is_pronoun(key):
    #         max_key = key
    #         max_inter = len(G[key].keys() & i_do)/len(G[key].keys() | i_do)
#
    # print(max_key)
    # print((G[max_key].keys() & i_do))
    keys = []
    for key in G:
        if not G[key]:
            keys.append(key)
    for key in keys:
        G.remove_node(key)
    persons = []
    per_vec = []
    for node in G.nodes:
        token_word = tokenizer.get_stat_token_word(morph, node)
        if token_word is None or token_word.find("NOUN") == -1:
            continue
        vec = client.get_vec(token_word)
        if vec is None or len(vec) == 0:
            continue
        is_person = clf.predict(vec.reshape(1, -1))
        if is_person == 0:
            test_v = tokenizer.get_stat_token_word(morph, "налогоплательщик")
            test_vec = client.get_vec(test_v)
            print(node, cosine(test_vec, vec))

            persons.append(node)
            per_vec.append(vec)
    print("persons = ", persons)
    print()
    for i in persons:
        print(i)
    test_v = tokenizer.get_stat_token_word(morph, "налогоплательщик")
    test_vec = client.get_vec(test_v)
    s = 1
    for vec in per_vec:
        s *= cosine(test_vec, vec)
        print(cosine(test_vec, vec))
    s ** (1/len(persons))
    print(s)

    for per in persons:
        print(per, G[per])
    print()
    for per in G["человек"]:
        token_word = tokenizer.get_stat_token_word(morph, per)

        print(token_word)

    node_color = [(G.degree(v))*3 for v in G]
    node_size = [400 * nx.get_node_attributes(G, 'size')[v] for v in G]
     #print(nx.get_node_attributes(G, 'size'))
    nx.draw(G, nlist=[G.nodes], with_labels=True, node_color=node_color, font_color="k", node_size=node_size)
    plt.show()
Exemple #8
0
def try3():
    G = nx.MultiGraph()

    path = r"test_books\slugi.zip"
    xml = bm.open_book(path)
    _xpath = etree.XPath(r'//*')
    dom = etree.XML(xml)
    ans = _xpath(dom)

    for i in ans[599:600]:
        """Обработка заголовков, автора и т.д. через i.text """

        if re.search(r"\b[p]", i.tag):  # предполагаю, что строки с текстом заканчиваются на p
            """ Построчная обработка книги перед предпроцессингом (Только текста) """
            sintax = get_sintax(i.text)
            add_to_graph3(sintax, G)

    keys = []
    for key in G:
        if not G[key]:
            keys.append(key)
    for key in keys:
        G.remove_node(key)
    # for i in range(10):
    #     print(combined_model.make_sentence(tries=30))
    noun_word_list = []
    noun_vec_list = []
    verb_word_list = []
    verb_vec_list = []

    for word in G:  # Соберем вектора
        token_word = tokenizer.get_stat_token_word(morph, word)
        if token_word is None:
            continue
        vec = client.get_vec(token_word)
        if len(vec) == 0:
            continue

        if token_word.find("NOUN") != -1:  # Пока объединим только соществительные
            noun_word_list.append(word)
            noun_vec_list.append(vec)
        if token_word.find("VERB") != -1:  # Пока объединим только соществительные
            verb_word_list.append(word)
            verb_vec_list.append(vec)

    size = len(noun_vec_list)
    for base in range(size):
        for comp in range(base+1, size):
            if cosine(noun_vec_list[base], noun_vec_list[comp]) < 0.5:
                # print(noun_word_list[base], noun_word_list[comp])
                old_name1 = noun_word_list[base]
                old_name2 = noun_word_list[comp]
                if old_name1 == old_name2:
                    continue
                new_vec = (noun_vec_list[base] + noun_vec_list[comp]) / 2
                # print(new_vec)
                res = json.loads(client.get_word_by_vec(new_vec.tostring()).decode())["res"][0]
                new_name = res[0].split("_")[0]
                # print(new_name)
                # new_name = old_name1 + old_name2
                combine_nodes(old_name1, old_name2, new_name, G)
                for word in range(len(noun_word_list)):
                    if noun_word_list[word] in [old_name1, old_name2]:
                        noun_word_list[word] = new_name

    size = len(verb_vec_list)
    for base in range(size):
        for comp in range(base+1, size):
            if cosine(verb_vec_list[base], verb_vec_list[comp]) < 0.5:
                old_name1 = verb_word_list[base]
                old_name2 = verb_word_list[comp]
                if old_name1 == old_name2:
                    continue
                new_vec = (verb_vec_list[base] + verb_vec_list[comp]) / 2
                # print(new_vec)
                res = json.loads(client.get_word_by_vec(new_vec.tostring()).decode())["res"][0]
                new_name = res[0].split("_")[0]
                # new_name = old_name1 + old_name2
                combine_nodes(old_name1, old_name2, new_name, G)
                for word in range(len(verb_word_list)):
                    if verb_word_list[word] in [old_name1, old_name2]:
                        verb_word_list[word] = new_name

    keys = []
    for key in G:
        if not G[key]:
            keys.append(key)
    for key in keys:
        G.remove_node(key)

    node_color = [G.degree(v)*3 for v in G]
    # print(G["я"])
    # for word in G["я"]:
    #     if len(G[word]) > 1:
    #         print(G[word])
    node_size = [400 * nx.get_node_attributes(G, 'size')[v] for v in G]
    print(nx.get_node_attributes(G, 'size'))
    nx.draw(G, nlist=[G.nodes], with_labels=True, node_color=node_color, font_color="k", node_size=node_size)
    plt.show()