Exemple #1
0
def test_json_parse(file_r_name, path_w):
    parsed = []
    with open(file_r_name, 'r') as file_r, \
            open(path_w + 'json_parse.json', 'w') as file_w:
        for line in file_r:
            line_parse = lem.json_parse(line)
            parsed.append(line_parse)
        pretty_json(parsed, file_w)
    print('Done test_json_parse')
Exemple #2
0
def test_build_edge_dict(file_r_name, file_weights_name, path_w):
    # default
    with open(file_r_name, 'r') as file_json, \
            open(path_w + 'edges.json', 'w') as file_w:
        edge_dict = lem.build_edge_dict(file_json)
        edges = {' - '.join(edge): count for edge, count in edge_dict.items()}
        pretty_json(edges, file_w)

    # different options
    path_w += 'options/'
    if not os.path.exists(path_w):
        os.makedirs(path_w)
    weights_options = (None, True)
    bastard_options = (True, False)
    non_cyrillic_options = (True, False)

    for weights in weights_options:
        for bastard in bastard_options:
            for non_cyrillic in non_cyrillic_options:
                with open(file_r_name, 'r') as file_json:
                    if weights:
                        file_weights = open(file_weights_name, 'r')
                    else:
                        file_weights = None

                    file_w_name = '{0}edges (' \
                                  'weights={1}, ' \
                                  'bastard={2}, ' \
                                  'non_cyrillic={3}' \
                                  ').json'.format(path_w, weights,
                                                  bastard, non_cyrillic)
                    file_w = open(file_w_name, 'w')
                    edge_dict = lem.build_edge_dict(file_json, file_weights,
                                                    bastard, non_cyrillic)
                    edges = {' - '.join(edge): count for edge, count in
                             edge_dict.items()}
                    pretty_json(edges, file_w)
    print('Done test_build_edge_dict')
Exemple #3
0
file_nodes_json_name = path_w + 'nodes.json'
file_edges_json_name = path_w + 'edges.json'

# Создаём узлы
with open(file_json_name, 'r') as file_json, \
        open(file_weight_name, 'r') as file_weight, \
        open(file_nodes_name, 'w') as file_nodes, \
        open(file_nodes_json_name, 'w') as file_nodes_json:
    # создаём словарь узлов
    node_dict = lem.build_node_dict(file_json, weights=file_weight,
                                    include_bastard=bastard,
                                    include_non_cyrillic=non_cyrillic)
    # записываем узлы в файл для Gephi
    lem.write_node_dict(file_nodes, node_dict)
    # отдельно сохраняем json-версию словаря узлов (для отладки)
    pretty_json(node_dict, file_nodes_json)

# Создаём рёбра
with open(file_json_name, 'r') as file_json, \
        open(file_weight_name, 'r') as file_weight, \
        open(file_edges_name, 'w') as file_edges, \
        open(file_edges_json_name, 'w') as file_edges_json:
    # создаём словарь рёбер
    edge_dict = lem.build_edge_dict(file_json, weights=file_weight,
                                    include_bastard=bastard,
                                    include_non_cyrillic=non_cyrillic)
    # записываем рёбра в файл для Gephi
    lem.write_edge_dict(file_edges, edge_dict)
    # отдельно сохраняем json-версию словаря рёбер (для отладки)
    edges = {' - '.join(edge): count for edge, count in edge_dict.items()}
    pretty_json(edges, file_edges_json)
Exemple #4
0
def make_gephi_files(file_data_name='data/input.txt',
                     path_r='data/', path_w='output/',
                     query_column=1, weight_column=None, sep='\t',
                     headers=False, mystem='/Applications/mystem',
                     bastard=True, non_cyrillic=True,
                     nodes_cut=0, edges_cut=0):
    """
    Функция верхнего уровня для создания файлов узлов и рёбер для Gephi.
    Позволяет сделать всё "в один клик" с настройками по умолчанию.
    Все параметры необязательные.

    :param file_data_name: файл с данными (по умолчанию data/input.txt)
    :param path_r: путь к папке с данными (сюда будут сохраняться промежуточные
    файлы с запросами и весами)
    :param path_w: путь к папке, куда будут записываться все финальные файлы
    :param query_column: номер столбца с запросами  (по умолчанию 1)
    :param weight_column: номер столбца с весами  (по умолчанию отсуствует,
    т.е. каждому запросу будет присвоен единичный вес)
    :param sep: разделитель столбцов (по умолчанию '\t')
    :param headers: есть ли в файле заголовки (по умолчанию False)
    :param mystem: см. функцию lem
    :param bastard: см. функцию lem_filter
    :param non_cyrillic: см. функцию lem_filter
    :param nodes_cut: см. функцию write_node_dict
    :param edges_cut: см. функцию write_edge_dict
    """
    if not os.path.exists(path_r):
        os.makedirs(path_r)
    if not os.path.exists(path_w):
        os.makedirs(path_w)

    # Параметры по умолчанию
    params = ['-cldige', 'utf-8', '--format', 'json']
    path_r = path_r.rstrip('/') + '/'
    file_query_name = path_r + 'queries.txt'
    file_weight_name = path_r + 'weights.txt'
    path_w = path_w.rstrip('/') + '/'
    file_lems_name = path_w + 'lems.txt'
    file_json_name = path_w + 'lems.json'
    file_nodes_name = path_w + 'nodes.csv'
    file_edges_name = path_w + 'edges.csv'
    file_nodes_json_name = path_w + 'nodes.json'
    file_edges_json_name = path_w + 'edges.json'

    # Сохраняем столбцы с запросами и весами в отдельные файлы
    with open(file_data_name, 'r') as file_data, \
            open(file_query_name, 'w') as file_query, \
            open(file_weight_name, 'w') as file_weight:
        if headers:
            next(file_data)
        for line in file_data:
            line = line.rstrip('\n').split(sep)
            print(line[query_column - 1], file=file_query)
            if weight_column:
                print(line[weight_column - 1], file=file_weight)
            else:
                print(1, file=file_weight)

    # Прогоняем через леммер
    with open(file_query_name, 'r') as file_query, \
            open(file_json_name, 'w') as file_json:
        lem(file_query, file_json, mystem=mystem, params=params)

    # Список лемм для каждой исходной строки (для проверки)
    with open(file_json_name, 'r') as file_json, \
            open(file_lems_name, 'w') as file_lems:
        for line in file_json:
            line_parse = json_parse(line)
            words = lem_filter(line_parse, include_bastard=bastard,
                               include_non_cyrillic=non_cyrillic)
            lems = [word['lex'] for word in words]
            print(' '.join(lems), file=file_lems)

    # Создаём словари узлов и рёбер
    # Узлы
    with open(file_json_name, 'r') as file_json, \
            open(file_weight_name, 'r') as file_weight:
        node_dict = build_node_dict(file_json, weights=file_weight,
                                    include_bastard=bastard,
                                    include_non_cyrillic=non_cyrillic)
    # Рёбра
    with open(file_json_name, 'r') as file_json, \
            open(file_weight_name, 'r') as file_weight:
        edge_dict = build_edge_dict(file_json, weights=file_weight,
                                    include_bastard=bastard,
                                    include_non_cyrillic=non_cyrillic)

    # Сохраняем словари в json-файлы
    # Узлы
    with open(file_nodes_json_name, 'w') as file_nodes_json:
        pretty_json(node_dict, file_nodes_json)

    # Рёбра
    with open(file_edges_json_name, 'w') as file_edges_json:
        edges = {' - '.join(edge): count for edge, count in edge_dict.items()}
        pretty_json(edges, file_edges_json)

    # Записываем словари для Gephi
    # Узлы
    with open(file_nodes_name, 'w') as file_nodes:
        write_node_dict(file_nodes, node_dict, sep=';', cut=nodes_cut)

    # Рёбра
    with open(file_edges_name, 'w') as file_edges:
        write_edge_dict(file_edges, edge_dict, sep=';', cut=edges_cut)