Как искать в PDF-документах название компании или символ акций? - PullRequest
1 голос
/ 26 апреля 2019

Я пытаюсь найти акции / компании, упомянутые в пачке документов PDF.Иногда используется название компании (например, American Express), в других случаях PDF содержит только символ акций (например, AXP).

Я довольно легко могу найти символы с помощью этого кода:

import PyPDF2
import os
import re

tickers = ['AMZN', 'V', 'ETSY', 'AXP', 'AA', 'FB'] 

source_dir = '/Users/person/folder/'
for dir, subdir, files in os.walk(source_dir):
    for file in files:
        if file.endswith('.pdf'):
            file = os.path.join(dir, file)
            pdfFileObj = open(file, 'rb')
            pdfReader = PyPDF2.PdfFileReader(pdfFileObj)
            if pdfReader.isEncrypted:
                print("Skipping " + file)
                pass
            else:
                num_pages = pdfReader.numPages

                count = 0
                text = " "

                while count < num_pages:
                    pageObj = pdfReader.getPage(count)
                    count += 1
                    text += pageObj.extractText()

                print("\n" + file)
                # print(text)

                matches = re.findall(regex, text)
                matches = list(dict.fromkeys(matches))
                for match in matches:
                    print("- " + match)

Но иногда в PDF-файлах упоминается только название компании.Как мне найти или тикер акций или название компании, а затем вернуть оба?Таким образом, желаемый результат будет:

/Users/person/folder/file.pdf
- AMZN (Amazon)
- AXP (American Express)
- AA (American Airlines)
- V (Visa)

У меня есть CSV-файл, который сопоставляет тикер с названием компании, но я открыт для создания базы данных или словаря, если это облегчит задачу.

Вот пример данных тикера / названия компании:

| Ticker | Company Name     |
-----------------------------
|  AMZN  | Amazon Inc       |
-----------------------------
|   V    | Visa Inc.        |
-----------------------------
|  ETSY  | Etsy             |
-----------------------------
|  AXP   | American Express |
----------------------------- 
|  AA   | American Airlines |
----------------------------- 
|  FB    | Facebook         |
----------------------------- 

А вот пример текста:

- Etsy (ETSY): Etsy do eiusmod tempor incid is Duis aute irure Etsy dolor in reprehenderit in volup 
- AXP: Excepteur sint occaecat cupidatat non proident, sunt in culpa AXP deserunt
- AA: American Airlines id est laborum. 
- V: enim ad minim veniam (V) est. 

Как мне решить эту проблему?

1 Ответ

0 голосов
/ 30 апреля 2019

Этот подход может оказаться полезным:

import re

# Create dict from tickers and company
# Can be done from csv file
s = {'AMZN' : 'Amazon Inc.',
'V' : 'Visa Inc.',
'ETSY' : 'Etsy',
'AXP' : 'American Express',
'AA' : 'American Airlines',
'FB' : 'Facebook'}


# Create regex from dict s
regex = ''
for key, item in s.items():
    regex = regex + r'\b' + key + r'|\b' + item + r'|'

# Remove last '|' (or)
regex = regex[:-1]

Теперь ваше регулярное выражение будет выглядеть примерно так:

regex = '\bAMZN|\bAmazon Inc.|\bV|\bVisa Inc.|   ..etc..   |\bFB|\bFacebook'

После поиска вы можете создать найденное поле тикеров:

matches = re.findall(regex, text)

# Create an empty dictionary of matches
matches_d = dict()

for m in matches:
    if m in s.keys():
        matches_d[m] = s[m]
    if m in s.values():
        # Find key from value
        key = list(s.keys())[list(s.values()).index(m)]
        matches_d[key] = s[key]

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

['Etsy', 'ETSY', 'AXP', 'Facebook', 'AA', 'American Airlines', 'V']

match_d (последний словарь) будет выглядеть так:

{'ETSY': 'Etsy',
 'AXP': 'American Express',
 'AA': 'American Airlines',
 'V': 'Visa Inc.'}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...