В настоящее время я пытаюсь выполнить поиск по нескольким pdf-файлам для определенных единиц оборудования. Я понял, как разобрать файл PDF в python вместе со списком оборудования. В настоящее время у меня проблемы с фактической функцией поиска. Лучший способ, который я нашел для этого в Интернете, - это токенизировать текст и поиск по нему с помощью ключевых слов (код ниже), но, к сожалению, некоторые названия оборудования состоят из нескольких слов, в результате чего эти имена превращаются в бессмысленные слова. как «синий» и «испариться», которые встречаются в тексте много раз и тем самым насыщают возвраты. Единственный способ, который я придумал, чтобы справиться с этим, - это искать только уникальные слова в названиях оборудования и удалять более распространенные, но мне было интересно, есть ли более элегантное решение, поскольку даже уникальные слова имеют тенденцию иметь несколько ложных результатов на документ.
В основном я ищу способ поиска в текстовом файле таких фраз, как «Синий передатчик 3», без разбора этой фразы на [«Синий», «Передатчик», «3»]
вот что у меня есть до сих пор
import PyPDF2
import nltk
from nltk import word_tokenize
from nltk.corpus import stopwords
import re
#open up pdf and get text
pdfName = 'example.pdf'
read_pdf = PyPDF2.PdfFileReader(pdfName)
text = ""
for i in range(read_pdf.getNumPages()):
page = read_pdf.getPage(i)
text += "Page No - " + str(1+read_pdf.getPageNumber(page)) + "\n"
page_content = page.extractText()
text += page_content + "\n"
#tokenize pdf text
tokens = word_tokenize(text)
punctuations = ['(',')',';',':','[',']',',','.']
stop_words = stopwords.words('english')
keywords = [word for word in tokens if not word in stop_words and not word in punctuations]
#take out the endline symbol and join the whole equipment data set into one long string
lines = [line.rstrip('\n') for line in open('equipment.txt')]
totalEquip = " ".join(lines)
tokens = word_tokenize(totalEquip)
trash = ['Black', 'furnace', 'Evaporation', 'Evaporator', '500', 'Chamber', 'A']
searchWords = [word for word in tokens if not word in stop_words and not word in punctuations and not word in trash]
for i in searchWords:
for word in splitKeys:
if i.lower() in word.lower():
print(i)
print(word + "\n")
Любая помощь или идеи, которые вы могли бы иметь, были бы очень признательны
Каков ваш вклад и каков желаемый результат?
@FailSafe Мои входные данные — это файл PDF для поиска и текстовый файл, содержащий список оборудования, оба из которых являются константами в моем коде. Желаемым результатом будет список всего оборудования, упомянутого в pdf-файле.
Я имею в виду, дайте нам образец того, как выглядит ваш ввод, и на его основе какой результат вы хотите получить. Вот так: stackoverflow.com/questions/55126197/…
моим вводом будет строка текста, например: «это содержимое pdf-файла, содержащего кучу различной информации, например, об оборудовании. Одним из таких устройств является Blue Machine 7, очень импортное оборудование. ." и это также будет список оборудования, разобранный на различные части оборудования, такие как: [Фиолетовый молоток, розовый молоток, Синяя машина 7]. Я хотел бы найти текст для каждой единицы оборудования и вернуть Blue Machine 7, как это было в тексте.
Честно говоря, мне нужно немного больше (и вы должны отредактировать свой первоначальный пост, чтобы показать свой вклад и желаемый результат). С тем, что вы только что дали мне, как бы конкретно это ни было, вы можете использовать цикл for для перебора нужных строк, чтобы эффективно выполнять re.findall('(Blue[\s]*Machine[\s]*7)', string), re.findall('(Purple[\s]*hammer)', string) и т. д., и это не похоже на то, что вы хотите, исходя из вашего первоначального поста






Только что понял, что это может быть неясно, splitKeys - это набор данных токенов из файла pdf.