2014-11-28 3 views
2

Я использую следующий код, чтобы открыть текстовый файл, удалить HTML, и искать слова до и после определенного ключевого слова:Python: Поиск слов до и после пары ключевых слов

import nltk 
import re 

text = nltk.clean_html(open('file.txt').read()) 
text = text.lower() 

pattern = re.compile(r'''(?x) ([^\(\)0-9]\.)+ | \w+(-\w+)* | \.\.\. ''') 
text = nltk.regexp_tokenize(text, pattern) 

#remove the digits from text 
text = [i for i in text if not i.isdigit()] 

# Text is now a list of words from file.txt 
# I now loop over the Text to find all words before and after a specific keyword 

keyword = ['foreign'] 
for i, w in enumerate(text): #it gives to the list items numbers 
    if w in keyword: 
     before_word = text[i-5:i-1] if i > 0 else '' 
     before_word = ' '.join(word for word in before_word) 
     after_word = text[i+1:i+5] if i+1 < len(text) else '' 
     after_word = ' '.join(word for word in after_word) 
     print "%s <%s> %s" % (before_word, w, after_word) 

Это коды хорошо работает, если keyword - одно слово. Но что, если я хочу найти 5 слов до и после 'foreign currency'? Проблема в том, что в text все слова, разделенные пробелом, представляют собой другой элемент в списке text. Я не могу сделать keyword = ['foreign currency']. Как я могу решить эту проблему?

Sample .txt файл here.

+0

Можете ли вы показать, как выглядит файл ur inpu и что такое ожидаемый выход ur – Hackaholic

+0

@Hackaholic Я добавил образец txt-файла. Образец слов, которые нужно найти, будет «может отрицательно повлиять на колебания валютного курса» – Plug4

ответ

2

Считаете ли вы регулярное выражение?

Это будет соответствовать и захватить пять слов, прежде чем, и пять слов после иностранной валюты

((\w+){5})foreign currency((\w+){5}) 

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

Вот обновлённое регулярное выражение, которое составляет 5 слов до и 1-5 слов ниже, фраза использует «непробельного» символы, разделенные «без слов» символами для слов, и захватывают в качестве одного группы, включая поиск текста:

((\S+\W){5}foreign currency(\W\S+){1,5}) 

в противном случае, вы можете попробовать:

  1. Присоединиться текст все в одной строке, нет перевода строки
  2. Использование something = text.find('foreign currency') для найти первое положение этого текста
  3. графа назад оттуда, посимвольно ищут пространства, 5 слов
  4. графа форвардов с конца, посимвольно ищет пространства, 5 слов
  5. Loop все из это, используя something = text.find('foreign currency', previous_end_pos), чтобы сказать, чтобы начать работу после окончания предыдущего шага, чтобы найти следующий экземпляр.
+0

Если я использую ваш код регулярного выражения, как я могу сохранить слово «иностранная валюта»? В текущем регулярном выражении отображаются только 5 предыдущих и 5 слов. – Plug4

+0

@ Plug4: Это так, потому что вы специально просили об этом: * «что, если я хочу найти 5 слов до и после» * ... в любом случае, я обновил свой ответ с отредактированным регулярным выражением, которое фиксирует всю фразу с окружающими словами, и более подходит для более широкого диапазона текста и символов. – TessellatingHeckler

+0

Извините за путаницу! Hmmm но почему-то: 're.findall ('((\ S + \ W) {5} валюта (\ W \ S +) {1,5})', текст)' freezes мой компьютер ... занимает слишком много времени искать? – Plug4

0

Вы думали об использовании переменной для количества слов в «ключевое слово» и перебирая в тексте этого количества элементов в то время?

Смежные вопросы