Разница между строкой, прочитанной из текстового файла, и строкой в переменной в Python

#python #nlp

#python #nlp

Вопрос:

Я пишу некоторый код на python, который будет считывать текстовые данные из текстовых файлов и искать три слова слева и справа от слова или фразы, содержащихся в списке python. Я написал исходный код, используя предложение, сохраненное в виде строки python, а затем преобразовал его для чтения из текстового файла. Это исходный код.

 work_list = ["for all good", "to the aid", "for all practical purposes", "all", "to", "aid", "Now"]

txt = "Now is the time to aid and for all practical purposes for all good men to come to the aid of the party"

for element in work_list:
 if element in txt: # was string in earlier version
  s = txt.split()
  # print(f'"{element}" found in file {txt}')
  # was string
  element_split = element.split()
  before = element_split[0] #get first word
  after = element_split[-1] #get last word

  three_before = "" # circumvents warning message 'variable can be initially undefined'
  for i, w in enumerate(s):  # it gives a list items a number
   if w in before: # if the first word in the phrase/word is in the string
    three_before = s[(i - 3):i] if i > 1 else ''
    three_before = ' '.join(word for word in three_before)

         # get the three words after the last word in the phrase/string
   if w in after:  # if the last word in the phrase/string is in the string
      three_after = s[(i 1):(i   4)] if i  < len(s) else ''
      three_after = ' '.join(word for word in three_after)
      print("%s <%s> %s" % (three_before, element, three_after))
 

Который выдает следующий вывод.

 is the time <to the aid> and for all
men to come <to the aid> of the party
to aid and <for all practical purposes> for all good
aid and for <all> practical purposes for
practical purposes for <all> good men to
is the time <to> aid and for
all good men <to> come to the
men to come <to> the aid of
the time to <aid> and for all
come to the <aid> of the party
 <Now> is the time
 

Код для чтения из текстового файла выглядит следующим образом

 work_list = ["for all good", "to the aid", "for all practical purposes", "all", "to", "aid", "Now"]


path = 'D:/Testing10'


context_d = {}
for filename in glob.glob(os.path.join(path, '*.txt')):
    if filename.endswith('.txt'):
        f = open(filename)
        txt = f.read()
        txt = txt.lower()
        s = txt
        s = [item.replace('May', '') for item in s]  # locate and replace all months of May before lowering
        s = [item.replace('n', '') for item in s]
        s = [item.replace('\n', '') for item in s]
       # s = [item.replace('\', '') for item in txt]
       # s = [item.replace('\s', '') for item in txt]

        for element in work_list:
         if element in txt: # was string in earlier version
          # print(f'"{element}" found in file {string}')
           # was string
          s= txt.split()

          element_split = element.split()
          before = element_split[0] #get first word
          after = element_split[-1] #get last word

          three_before = "" # circumvents warning message 'variable can be initially undefined'
          for i, w in enumerate(s):  # it gives to the list items numbers
           if w in before: # if the first word in the phrase/word is in the string
            three_before = s[(i - 3):i] if i > 1 else ''
            three_before = ' '.join(word for word in three_before)

           #    get the three words after the last word in the phrase/string
           if w in after:  # if the last word in the phrase/string is in the string
            three_after = s[(i 1):(i   4)] if i  < len(s) else ''
            three_after = ' '.join(word for word in three_after)
            print("%s <%s> %s" % (three_before, element, three_after))
 

Который выдает следующий вывод

 all practical purposes <for all good> men to come
to aid for <all> practical purposes for
practical purposes for <all> good men to
is the time <to> aid for all
all good men <to> come to the
men to come <to> the aid of
the time to <aid> for all practical
come to the <aid> of the party
 

Код, считывающий текст, содержащий предложение, не обнаруживает фразы «для всех практических целей» и «на помощь». У кого-нибудь есть идея, почему это происходит, и есть ли лучший способ найти слова через три пробела слева и справа от слова / фразы (очень важно, чтобы этот алгоритм мог подобрать все фразы)

Заранее спасибо

Комментарии:

1. [item.replace('May', '') for item in s] не будет работать. item это одиночные символы, а не слова. И вы превращаете строку в список символов.

2. Позже вы это сделаете s= txt.split() . Это возврат к оригиналу txt без каких-либо предыдущих замен.

3. Я подозреваю, что ваш файл содержит r символы.

4. Я преобразовал все replace s в txt, а затем присвоил txt s, что означает, что я больше не использую строку из read / IO, а использую список строк. Он вообще не выдает никаких выходных данных.

5. Так и должно быть txt = txt.replace(...) , без понимания списка. Это то, что у вас есть?