Python - просматривайте список ключевых слов и просматривайте предложения, чтобы найти количество совпадений между ключевыми словами и словом «доступ» - PullRequest
0 голосов
/ 18 июня 2019

У меня есть список ключевых слов, которые мне нужно знать, если они находятся в пределах 4 слов от слова «доступ» в предложении из списка. В конце я хочу указать общее количество совпадений с ключевым словом. слово «доступ» для определенного предложения из списка.

Токовый выход:

[«Меньшинство», «пациенты», «часто», «иметь», «барьер», «с», «их», «доступ», «к», «здравоохранение».] 0
[«Сельские», «пациенты», «часто», «цитировать», «расстояние», «как», «а», «барьер», «к», «доступ», «здоровье», «услуги».]]
[«Меньшинство», «пациенты», «часто», «имеют», «барьеры», «с», «их», «доступ», «к», «здравоохранение».] 0
[«Меньшинство», «пациенты», «часто», «имеют», «барьеры», «с», «их», «доступ», «к», «здравоохранение».] 1

Желаемый вывод:

[«Меньшинство», «пациенты», «часто», «иметь», «барьеры», «с», «их», «доступ», «к», «здравоохранение».] 2
[«Я, заядлый, пользователь, Microsoft, Access, базы данных»] 0
[«Сельские», «пациенты», «часто», «цитировать», «расстояние», «как», «а», «барьер», «к», «доступ», «здравоохранение», «услуги».]] 3

  accessdesc = ["care", "services", "healthcare", "barriers"] 

  sentences = ["Minority patients often have barriers with their access to 
  healthcare.", "I am an avid user of Microsoft Access databases", "Rural 
  patients often cite distance as one of the barriers to access healthcare 
  services."] 

  for sentence in sentences:                     
      nummatches = 0
      for desc in accessdesc:
           sentence = sentence.replace(".","") if "." in sentence else ''
           sentence = sentence.replace(",","") if "," in sentence else ''

           if 'access' in sentence.lower() and desc in sentence.lower():
           sentence = sentence.lower().split()

           access_position = sentence.index('access') if "access" in 
           sentence else 0

           desc_position = sentence.index(desc) if desc in sentence else 0

               if abs(access_position - desc_position) < 5  :

                   nummatches = nummatches + 1

               else:
                   nummatches = nummatches + 0
           print(sentence, nummatches)

1 Ответ

1 голос
/ 18 июня 2019

Я думаю, вам нужно изменить порядок ваших циклов с:

for desc in accessdesc:    
    for sentence in sentences: 

на:

for sentence in sentences:
    nummatches = 0 # Resets the count to 0 for each sentence
    for desc in accessdesc: 

Это будет означать, что вы можете проверить каждое слово в предложении перед вамиперейти к следующему предложению.Затем просто переместите оператор print(sentence, nummatches) за пределы второго цикла, чтобы вы выводили результат после каждого предложения.

Еще одна вещь, на которую следует обратить внимание, - это строка if 'access' and desc in sentence :.and объединяет выражение слева и выражение справа от него и проверяет, что оба они оцениваются как True.Это означает, что он проверяет access == True, True и desc in sentence.Что вы хотите здесь, чтобы проверить, если доступ и desc находятся в состоянии отправки.Я также рекомендовал бы игнорировать регистр для этой проверки, поскольку 'access' не равен 'Access'.Таким образом, вы можете переписать это

if 'access' in sentence.lower() and desc in sentence.lower():
    sentence = sentence.lower().split()

Итак, теперь, когда вы проверяете, что desc находится в предложении в условии if, вам не нужно проверять снова, как вы упомянули в комментарии.

Как отмечается, ваш код, скорее всего, будет работать должным образом, только если access или одно из ключевых слов появятся в предложении только один раз или менее, так как sentence.index() найдет только первое вхождение строки.Для обработки нескольких вхождений строк потребуется дополнительная логика.

РЕДАКТИРОВАТЬ

Таким образом, ваши строки, заменяющие знаки препинания, например, sentence = sentence.replace(".","") if "." in sentence else '', установят предложение в '' если эта пунктуация не существует в предложении.Вы можете сделать все замены в одной строке, а затем проверить список, а не строку предложения.Также вам нужно проверить, что слово существует в списке разбиения, а не в строке, поэтому оно соответствует только целым словам.

'it' in 'bit'
>>> True
'it' in ['bit']
>>> False

Таким образом, вы можете переписать свой код так:

for sentence in sentences:                     
    nummatches = 0
    words = sentence.replace(".","").replace(",","").lower().split()
    # moved this outside of the second loop as the sentence doesn't change through the iterations
    # Not changing the sentence variable so can print in it's original form
    if 'access' not in words:
        continue # No need to proceed if access not in the sentence
    for desc in accessdesc:
         if desc not in words:
             continue # Can use continue to go to the next iteration of the loop
         access_position = words.index('access')
         desc_position = words.index(desc)

         if abs(access_position - desc_position) < 5  :
             nummatches += 1
             # else statement not required
    print(sentence, nummatches) # moved outside of the second loop so it prints after checking through all the words

Как уже упоминалось, это будет работать только в том случае, если слово "access" или одно из ключевых слов появляются в предложении только один или менее раз.Если они появляются более одного раза, использование index () найдет только первое вхождение.Посмотрите на этот ответ и посмотрите, сможете ли вы найти решение для своего кода.Также взгляните на этот ответ о том, как убрать пунктуацию из строки.

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