#python #loops #dictionary #nlp #tags
#python #циклы #словарь #nlp #Теги
Вопрос:
Я хочу создать диктофон из другого, но с сохранением того же ключа. Я попытался обновить значение моего первого словаря, но я получил ошибку. Итак, теперь я пытаюсь создать новый словарь из первого.
Я бы хотел, чтобы ключ был таким же и не менял их.
# -*- 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 laidn', '2': 'Je suis belle n', '3': "Je n'aime pas la viande"}
Ожидаемый ответ, я бы хотел, чтобы тег соответствовал ключу их исходного предложения
d_tag = { "1" : ['tutPRO:PERttu', 'estVER:prestêtre', 'laidtADJtlaid'],
"2" : ['JetPRO:PERtje', 'suistVER:prestsuivre|être', 'belletADJtbeau'],
"3" : ['JetPRO:PERtje', "n'tADVtne", 'aimetVER:prestaimer', 'pastADVtpas', 'latDET:ARTtle', 'viandetNOMtviande']}
Позже я хотел бы извлечь только третье слово (перебирать второй словарь и переписывать новый с тем же ключом, но содержащий только лемму, которая находится в индексе [2] .
Это означает получение чего-то подобного :
d_lemma = { "1" : ['tu', 'être', 'laid'],
"2" : ['Je', 'suivre|être', 'beau'],
"3" : ['Je', "ne", 'aimer', 'pas', 'le', 'viande']}
приведенный выше код не работает, есть идеи, как его изменить, чтобы получить результат, который я ожидаю для второго словаря.
К сожалению, мне приходится использовать ключ для сохранения предложений, чтобы я мог записывать значения одно за другим в csv либо на каждом шаге, либо в конце.
Ответ №1:
Чтобы сопоставить новые значения тегов со связанным ключом, сделайте ключ ключом, а новое значение значением:
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']}
Комментарии:
1. спасибо, iti работает для моего небольшого примера, к сожалению, когда я устал от реального файла csv, в котором 5423 строки на столбец [1], он говорит: индекс списка вне диапазона, вы знаете, как я могу это решить?
2. Файл «CSV_2.py «, строка 33, в <модуле> d[токен[0]] = токен[1] Ошибка индекса: список индексов вне диапазона
3. @kely789456123 эта ошибка возникает из-за того, что у вас есть строка в файле, которая содержит достаточное количество частей при разделении разделителем
';'
. Вы могли бы проверить этоlen(token) > 0
перед добавлениемd
. Однако вероятной причиной является то, что исходный csv имеет пустую строку в конце. Обработка файла сcsv.reader
помощью вместо итерации вручную должна обрабатывать этот случай автоматически.