#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(...)
, без понимания списка. Это то, что у вас есть?