2016-02-29 5 views
0

У меня есть текстовый файл, содержащий содержимое книги. Я хочу взять этот файл и создать индекс, который позволяет пользователю выполнять поиск по файлу для выполнения поиска.Индексирование и поиск в текстовом файле

Поиск будет состоять из ввода слова. Затем программа вернет следующее:

  • Каждая глава, которая включает это слово.
  • Номер строки строки , содержащей слово.
  • Вся строка, на которой написано слово.

Я попытался следующий код:

infile = open(file) 

Dict = {} 

word = input("Enter a word to search: ") 

linenum = 0 
line = infile.readline() 
for line in infile 
    linenum += 1 
    for word in wordList: 
     if word in line: 
      Dict[word] = Dict.setdefault(word, []) + [linenum] 
      print(count, word) 
    line = infile.readline() 

return Dict 

Что-то вроде этого не работает, и, кажется, слишком неудобно для обработки других модулей, которые потребовались бы:

  • «или» оператору поиск по одному слову
  • Оператор «и» для поиска одного слова и другого в той же главе

Любые предложения были бы замечательными.

+0

Это домашнее задание? Поиск трудный. Используйте существующее решение, такое как ElasticSearch. –

+0

Раньше я работал в системах управления документами, которые делают то же самое, что и для одной книги, для целых библиотек и подтверждают комментарий @AssafLavie, что индексирование текста сложно. Процесс резки текста в словах гораздо сложнее, чем вначале, особенно потому, что некоторые слова на самом деле являются фразами («1 февраля 2016 года» одно слово или три слова? «Яблоко и/или апельсин ..» «три слова или четыре?». Используйте встроенную библиотеку индексирования текста. – christutty

+0

Как сделать это рабочим примером? Вы делаете такие вещи, как переменные, которые не существуют, и пытайтесь «возвратить», когда вы не находитесь в функции. Это затрудняет ответ. – tdelaney

ответ

1
def classify_lines_on_chapter(book_contents): 
    lines_vs_chapter = [] 
    for line in book_contents: 
     if line.isupper(): 
      current_chapter = line.strip() 
     lines_vs_chapter.append(current_chapter) 
    return lines_vs_chapter 


def classify_words_on_lines(book_contents): 
    words_vs_lines = {} 
    for i, line in enumerate(book_contents): 
     for word in set([word.strip(string.punctuation) for word in line.split()]): 
      if word: 
       words_vs_lines.setdefault(word, []).append(i) 
    return words_vs_lines 


def main(): 
    skip_lines = 93 

    with open('book.txt') as book: 
     book_contents = book.readlines()[skip_lines:] 

    lines_vs_chapter = classify_lines_on_chapter(book_contents) 
    words_vs_lines = classify_words_on_lines(book_contents) 

    while True: 
     word = input("Enter word to search - ") 
     # Enter a blank input to exit 
     if not word: 
      break 

     line_numbers = words_vs_lines.get(word, None) 
     if not line_numbers: 
      print("Word not found!!\n") 
      continue 

     for line_number in line_numbers: 
      line = book_contents[line_number] 
      chapter = lines_vs_chapter[line_number] 
      print("Line " + str(line_number + 1 + skip_lines)) 
      print("Chapter '" + str(chapter) + "'") 
      print(line) 


if __name__ == '__main__': 
    main() 

Попробуйте на this input file. Переименуйте его как book.txt перед запуском.

+0

Спасибо за ваше время! это хорошая оптимизированная сборка, которая на самом деле очень похожа на мою попытку.всего несколько примечаний: это может быть мой входной файл, но его встреча с ошибкой индекса за пределами границ в 'chapter = lines_vs_chapter [line_number]' 2) говорит, что пользователь вводит _n_ слова, есть ли функциональность для обработки этого? или и/или операнды, о которых я упоминал в исходном сообщении – newtTongue

+0

Можете ли вы загрузить свой входной файл, чтобы я мог его отладить. Кроме того, я не понимаю, что вы подразумеваете под «n словами»? –

+0

от _n_ я просто имею в виду, если пользователь хотел найти несколько слов в одном и том же поиске. поэтому пользователь вводит = (слово _space_ word2 _space_ word3, ...), и он ищет и возвращает только главы, которые содержат все эти слова с строками, на которых они происходят. поэтому он вернет заголовок главы, затем первое слово, номер строки и строку первого слова. затем напечатайте второе слово, номер строки и строку этого слова и т. д. и/или будет функционировать подобно оператору поисковой системы: принимает 2 слова, показывает главы и выводит оба слова, или показывает главу и строку с (или) двумя входами – newtTongue

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