2016-05-27 2 views
1

Я работаю с словарями python и ntlk на некоторых отзывах. У меня есть и вход (txt) файл, который является простым обзором. В словаре all_dict.txt. У меня есть все слова (отрицательные и положительные) со словом полярности и значения.Как получить значения словаря в Python

all_dict.txt выглядит следующим образом

"acceptable":("positive",1),"good":("positive",1),"shame":("negative",2),"bad":("negative",4),... 

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

"acceptable_positive":1,"good_positive":1,"shame_negative":2,"bad_negative":4 

Я пробовал с dict.get(), dict.values, но я не получаю то, что хочу. Есть ли способ для извлечения ключа и значения автоматически ?:

Я пытался с моим кодом:

f_all_dict=open('all_dict.txt','r',encoding='utf-8').read() 
f = eval(f_all_dict) 

result_all = {} 

for word in f.items(): 
    suffix, pol=result_all[word] #pol->polarity 
    result_all[word + "_" + suffix] = pol 

Но я получаю KeyError если слово не существует во входном файле (обзор).

Спасибо за вашу помощь

ответ

3

Во-первых, dict.items() возвращают dictitem объект содержит кортежи ключ и значение, и если вы хотите, чтобы передать его в качестве ключа к словарю это поднять KeyError.

suffix, pol=result_all[word] 

Во-вторых вы лучше использовать with заявление, чтобы иметь дело с внешними объектами, такими как файлы. И используйте ast.literal_eval() для оценки вашего словаря. Также вы можете получить доступ к своим ценностям, используя распашные переменные, распаковывающие :-) в понимании dict.

from ast import literal_eval 
with open('all_dict.txt','r',encoding='utf-8') as f_all_dict: 
    dictionary = literal_eval(f_all_dict.read().strip()) 

result_all = {"{}_{}".format(word, suffix): pol for word, (suffix, pol) in dictionary.items()} 
+0

«возвращать кортеж ключа и значения» не соответствует действительности, он возвращает экземпляр 'dict_items', который может быть повторен. –

+0

@MarkusMeskanen Действительно, я просто пропустил тег Python 3.x :-) – Kasramvd

+0

Это помогло, я использовал 'literal_eval()' и модифицировал свой код с этим. Я получил результаты, которые хотел. Спасибо :) –

0

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

f_all_dict=open('all_dict.txt','r',encoding='utf-8').read() 
f = literal_eval(f_all_dict) 

result_all = {} 

for word in f.items(): 
    result_all = {"{}_{}".format(word, suffix): pol * tokens.count(word) for word, (suffix, pol) in f.items()} 
    print(result_all) 
Смежные вопросы