Найти значение словаря в предложениях и вывод предложения, ключ - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь найти слово в качестве значения в словаре в предложении (строка csv). И если слово найдено в предложении, я бы хотел, чтобы вывод был идентификатором, предложением и ключом.

Запуск python 3.6 в качестве кадра данных для панд. Я могу получить значения, но не могу заставить цикл работать на .items(), чтобы получить ключ, который также должен быть возвращен


dict = {'housing': 'homeless',
           'housing2': 'homelessness',
           'housing3': 'evicted',
           'housing4': 'shelter'}

# dataframe with one row for each ID and sentence 
sentences = []
for row in text.itertuples():
    for sentence in row[2].split('.'):
        if sentence != '': 
            sentences.append((row[1], sentence))
sentence = pd.DataFrame(sentences, columns=['ID', 'sentence'])

#find dictionary value in sentences
def find_sdh(x):
    val = [x for k in dict.values() if k in x]
    if val:
        return val

# link sentence, id, value 
sentence['sdh'] = sentence['sentence'].apply(find_sdh)

# drop null values
df = sentence.dropna(subset=['sdh'])

Это обеспечивает согласованное значение словаря с идентификатором и предложением.

(ID,sentence)
(246,'This is an example.')
(132,'This is a test.')  
(662,'This is fake data.')  

Мне нужен идентификатор, предложение и ключ (связанный с соответствующим значением)

(ID, sentence, key)
(246, This is an example., key1)
(132, This is a test., key5)
(662, This is fake data, key3)

Пожалуйста и спасибо!

1 Ответ

0 голосов
/ 11 июля 2019

Вы можете просто добавить другой метод для назначения во второй столбец:

def find_keys(x):
    result = [k for k, v in dict.items() if v in x]
    if result:  # not sure you need this
        return result

sentence['keys'] = sentence['sentence'].apply(find_keys)

В качестве альтернативы, вы можете назначить кортеж (sentence, key) для нового столбца другим методом, но с этим может быть сложнее работать. Я не уверен в синтаксисе здесь, потому что я не уверен в структуре ваших данных:

def find_stuff(x):
    result = [(x, k) for k, v in dict.items() if v in x]
    if result:  # again not sure you need this
        return result

sentence['stuff'] = sentence.sentence.apply(find_stuff)

Что касается проверки if result:, каждая функция в Python имеет неявный return None в конце. Если ваше понимание списка ничего не присваивает result, тогда result - это просто пустой массив [], который не является None, но оба оцениваются как False, и часто нижестоящий код не будет заботиться о различия. Я не уверен в поведении с .apply(), но у вас может быть тот же результат, если вы просто полностью сбросите чек и всегда вернете свой результат. Стоит проверить, потому что это делает код немного чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...