Создать новый словарь из другого, но сохранив тот же ключ - PullRequest
0 голосов
/ 18 апреля 2019

Я хочу создать диктонну из другого, но с тем же ключом. Я попытался обновить значение моего первого словаря, но я получил ошибку. Поэтому сейчас я пытаюсь создать новый словарь из первого.

Я бы хотел, чтобы ключ был таким же, а не менял их.

# -*- coding: UTF-8 -*-
import codecs 
import re
import os
import sys, argparse
import subprocess
import pprint
import csv
from itertools import islice
import pickle

try:
    import treetaggerwrapper
    from treetaggerwrapper import TreeTagger, make_tags
    print("import TreeTagger OK")
except:
    print("Import TreeTagger pas Ok")

from itertools import islice
from collections import defaultdict



#export le lexique de sentiments
pickle_in = open("dict_pickle", "rb")
dico_lexique = pickle.load(pickle_in)


# extraction colonne verbatim
d = {}
with open(sys.argv[1], 'r', encoding="cp1252",) as csv_file:
    csv_file.readline()
    for line in csv_file:
        token = line.split(';')
        d[token[0]] = token[1]
#print(d)

#Writing in a new csv file 

with open('result.csv','wb', sep=';', encoding='Cp1252') as f:
    w = csv.writer(f)
    w.writerows(d.items())

tagger = treetaggerwrapper.TreeTagger(TAGLANG='fr')

d_tag = {}
for key,val in d.items():
    newvalues = tagger.tag_text(val)
    #print(newvalues)
    for key,val in d_tag.items():
        d_tag[key] = d[key]
        d_tag[val] = newvalues
print(d_tag)


#Writing in a new csv file, Writing the key to be sure it coincides

with open('result.csv','wb', sep=';', encoding='Cp1252') as f:
    w = csv.writer(f)
    w.writerows(d_tag.items())

файл (это пример, оригинал имеет около 6000 строк в CSV

id;Verbatim;score
1;tu es laid;5
2;Je suis belle; 6
3;Je n'aime pas la viande;7

Как это выглядит после извлечения первого и второго столбца:

{'1': 'tu es laid\n', '2': 'Je suis belle \n', '3': "Je n'aime pas la viande"}

Ожидаемый ответ, я бы хотел, чтобы тег соответствовал ключу их исходного предложения

d_tag = { "1" : ['tu\tPRO:PER\ttu', 'es\tVER:pres\têtre', 'laid\tADJ\tlaid'],
"2" : ['Je\tPRO:PER\tje', 'suis\tVER:pres\tsuivre|être', 'belle\tADJ\tbeau'],
"3" : ['Je\tPRO:PER\tje', "n'\tADV\tne", 'aime\tVER:pres\taimer', 'pas\tADV\tpas', 'la\tDET:ART\tle', 'viande\tNOM\tviande']}

Позже я хотел бы извлечь только третье слово (зацикливание во втором словаре и переписать новое с тем же ключом, но содержащим только лемму, содержащуюся в индексе [2].

Это значит, что нужно получить что-то вроде этого:

d_lemma = { "1" : ['tu', 'être', 'laid'],
"2" : ['Je', 'suivre|être', 'beau'],
"3" : ['Je', "ne", 'aimer', 'pas', 'le', 'viande']}

приведенный выше код не работает, есть идеи, как его изменить, чтобы получить ожидаемый результат для второго словаря.

К сожалению, мне нужно использовать ключ, чтобы сохранить предложения, чтобы я мог записывать значения по одному в CSV на каждом шаге или в конце.

1 Ответ

1 голос
/ 20 апреля 2019

Чтобы сопоставить новые значения тега с соответствующим ключом, сделайте ключ ключом, а новое значение - значением:

d_tag = {}
for key, val in d.items():
    newvalues = tagger.tag_text(val)
    d_tag[key] = newvalues

Этот код может быть сокращен при использовании словарного понимания:

d_tag = {key: tagger.tag_text(val) for key, val in d.items()} 

Чтобы получить словарь леммы, необходимо вызвать str.split для каждого элемента в каждом списке значений, затем извлечь третий элемент в каждом результате и добавить его в список значений для соответствующего ключа.

d_lemma = defaultdict(list)
for k, v in d_tag.items():
    for elem in v:
        parts = elem.split('\t')
        d_lemma[k].append(parts[2])

Результат:

defaultdict(<class 'list'>, {'1': ['tu', 'être', 'laid'], '2': ['je', 'suivre|être', 'beau'], '3': ['je', 'ne', 'aimer', 'pas', 'le', 'viande']})

Опять же, код может быть сокращен с использованием словарного понимания с внутренним списком для создания значения:

d_lemma = {k: [p.split('\t')[2] for p in v] for k, v in d_tag.items()}

Результат:

{'1': ['tu', 'être', 'laid'], '2': ['je', 'suivre|être', 'beau'], '3': ['je', 'ne', 'aimer', 'pas', 'le', 'viande']}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...