Применение функции к определенному подразделу для каждого ключа с использованием словарного понимания - PullRequest
0 голосов
/ 11 мая 2018

Я пытаюсь выполнить словарное понимание, которое применяет функцию только к определенному внутреннему подразделу.Функция удаляет неанглийские слова из строк.Я хотел бы, чтобы он применялся к 'title' подразделу только для каждого ключа в словаре.

# imports

import nltk

# function to remove non-English words

words = set(nltk.corpus.brown.words())

def strip_non_en(string, words):
    " ".join(w for w in nltk.wordpunct_tokenize(string)\
    if w.lower() in words or not w.isalpha())
    return string


# dict example:

meta_data = {
'12345.xml': {'author': ['Presley'],
'date': 1956,
'doi': None,
'title': 'Heartbreak Hotel'},
'67890.xml': {'author': ['Iglesias'],
'date': 1972,
'doi': None,
'title': 'For a little bit of your love Por Un Poco De Tu Amor'}
}

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

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

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

word_set = set(nltk.corpus.brown.words())

def strip_non_en(string, words=word_set, key=None):
    if key in (None, 'title'):
        string = ' '.join(w for w in nltk.wordpunct_tokenize(string) \
                          if w.lower() in words or not w.isalpha())
    return string    

new_dict = {a: strip_non_en(b, key=a) for a, b in meta_data.items()} 
0 голосов
/ 11 мая 2018

Вы можете проверить, является ли текущий ключ 'title', и если это так, вызвать функцию и передать текущее значение функции:

new_dict = {a:strip_non_en(b, words) if a == 'title' else b for a, b in meta_data.items()} 

Кроме того, вы можете слегка изменить свою функцию strip_non_en так что параметр words является необязательным.Таким образом, words не нужно передавать каждый раз:

def strip_non_en(string, words=words):
  " ".join(w for w in nltk.wordpunct_tokenize(string)\
  if w.lower() in words or not w.isalpha())
  return string

new_dict = {a:strip_non_en(b) if a == 'title' else b for a, b in meta_data.items()} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...