2015-12-07 2 views
0

У меня есть огромный список терминов, которые я хочу извлечь из текстового файла, и объединить их в одну из следующих групп: Животное, Искусство, Здания, Транспорт, Человек, Люди, Еда , Glass, Bottle, Signage, Slogan, DJ, Party. Я в настоящее время есть четыре слова в файле Tester2:Python - чтение текстового файла в словарь

пластинчатые пицца fearns смеситель

Вот мой код:

keyword_dictionary = { 
    'Animal' : ['animal', 'dog', 'cat'], 
    'Art' : ['art', 'sculpture', 'fearns'], 
    'Buildings' : ['building', 'architecture', 'gothic', 'skyscraper'], 
    'Vehicle' : ['car','formula','f-1','f1','f 1','f one','f-one','moped','mo ped','mo-ped','scooter'], 
    'Person' : ['person','dress','shirt','woman','man','attractive','adult','smiling','sleeveless','halter','spectacles','button','bodycon'], 
    'People' : ['people','women','men','attractive','adults','smiling','group','two','three','four','five','six','seven','eight','nine','ten','2','3','4','5','6','7','8','9','10'], 
    'Food' : ['food','plate','chicken','steak','pizza','pasta','meal','asian','beef','cake','candy','food pyramid','spaghetti','curry','lamb','sushi','meatballs','biscuit','apples','meat','mushroom','jelly', 'sorbet','nacho','burrito','taco','cheese'], 
    'Glass' : ['glass','drink','container','glasses','cup'], 
    'Bottle' : ['bottle','drink'], 
    'Signage' : ['sign','martini','ad','advert','card','bottles','logo','mat','chalkboard','blackboard'], 
    'Slogan' : ['Luck is overrated'], 
    'DJ' : ['dj','disc','jockey','mixer','instrument','turntable'], 
    'Party' : ['party'] 
} 

y = 0 
while (y < 1): 
    try: 
     def search(keywords, searchFor): 
      for item in keywords: 
       for terms in keywords[item]: 
        if searchFor in terms: 
         print item 



     with open("C:/Users/USERNAME/Desktop/tester2.txt") as termsdesk: 
       for line in termsdesk: 
        this = search (keyword_dictionary, line) 
        this2 = str(this) 
        #print this2 
        #print item 
    except KeyError: 
     break 
    y = y+1 

Мои результаты должны выглядеть примерно так:

Food 
Food 
Art 
DJ 

Но вместо этого я получаю это:

DJ 

Я предполагаю, что это связано с тем, что в моем цикле что-то не так. Кто-нибудь знает, что мне нужно изменить? Я попытался переместить «while (y < 1)», но я не смог получить результаты, которые я хочу.

+0

Да, это делает. «print item» во втором абзаце «DJ» – semiflex

+2

'line' будет иметь новую строку в конце, поэтому не будет соответствовать. Вы можете удалить его с помощью [** 'line.rstrip()' **] (https://docs.python.org/2/library/stdtypes.html#str.rstrip) и использовать возвращаемое значение. –

+0

Не понимаю. Я бы разместил это прямо под циклом for в третьем абзаце? – semiflex

ответ

2

Удалить пробел в начале/конце слова из поискового запроса. Следующие работы, как и ожидалось:

def search(keywords, searchFor): 
    for key, words in keywords.iteritems(): 
     if searchFor in words: 
      print key 

with open("tester2.txt") as termsdesk: 
    for line in termsdesk: 
     this = search(keyword_dictionary, line.strip()) 
     this2 = str(this) 



$ cat tester2.txt 
plate 
pizza 
fearns 
mixer 

$ python test4.py 
Food 
Food 
Art 
DJ 

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

keyword_dict = {'DJ': ['mixer', 'speakers']} 

в

category_dict = { 
'mixer': 'DJ', 
'speakers':'DJ' 
} 

Это обратное отображение может быть построен один раз в начале, а затем повторно для каждого запроса, таким образом, превращая вашу функцию поиска в только category_dict[term]. Таким образом, поиск будет быстрее, амортизируется O (1) сложность и проще писать.

2

следующий подход будет иметь больше смысла:

keyword_dictionary = { 
    'Animal' : ['animal', 'dog', 'cat'], 
    'Art' : ['art', 'sculpture', 'fearns'], 
    'Buildings' : ['building', 'architecture', 'gothic', 'skyscraper'], 
    'Vehicle' : ['car','formula','f-1','f1','f 1','f one','f-one','moped','mo ped','mo-ped','scooter'], 
    'Person' : ['person','dress','shirt','woman','man','attractive','adult','smiling','sleeveless','halter','spectacles','button','bodycon'], 
    'People' : ['people','women','men','attractive','adults','smiling','group','two','three','four','five','six','seven','eight','nine','ten','2','3','4','5','6','7','8','9','10'], 
    'Food' : ['food','plate','chicken','steak','pizza','pasta','meal','asian','beef','cake','candy','food pyramid','spaghetti','curry','lamb','sushi','meatballs','biscuit','apples','meat','mushroom','jelly', 'sorbet','nacho','burrito','taco','cheese'], 
    'Glass' : ['glass','drink','container','glasses','cup'], 
    'Bottle' : ['bottle','drink'], 
    'Signage' : ['sign','martini','ad','advert','card','bottles','logo','mat','chalkboard','blackboard'], 
    'Slogan' : ['Luck is overrated'], 
    'DJ' : ['dj','disc','jockey','mixer','instrument','turntable'], 
    'Party' : ['party'] 
} 

terms = {v2 : k for k, v in keyword_dictionary.items() for v2 in v} 

with open('input.txt', 'r') as f_input: 
    for word in f_input: 
     print terms[word.strip()] 

Это первый берет существующий словаря и сделать реверс его, чтобы сделать его проще для поиска каждого слова.

Это даст вам следующий вывод:

Food 
Food 
Art 
DJ 
+1

'types' - это имя модуля в стандартной библиотеке. Лучше использовать другое имя. –

+1

Спасибо, пропустили это, изменили его. –

Смежные вопросы