Нечеткое совпадение из списка кандидатов на строку - PullRequest
2 голосов
/ 29 января 2020

У меня есть список названий компаний, которые я пытаюсь проанализировать из большого количества документов PDF.

Я заставил файлы PDF через Apache Tika извлечь необработанный текст, и Я прочитал список из 200 компаний.

Я застрял, пытаясь использовать какую-то комбинацию FuzzyWuzzy и Spacy для извлечения необходимых совпадений.

Это насколько я я получил:

import spacy
from fuzzywuzzy import fuzz, process

nlp = spacy.load("en_core_web_sm")
doc = nlp(strings[1])

companies = []
candidates = []

for ent in doc.ents:
  if ent.label_ == "ORG":
    candidates.append(ent.text)

process.extractBests(company_name, candidates, score_cutoff=80)

Я пытаюсь сделать следующее:

  1. Прочитать строку документа
  2. Разобрать любое нечеткое название компании, совпадающее с оценкой, скажем 80 +
  3. Возвращает названия компаний, содержащиеся в документе, и их оценки.

Справка!

1 Ответ

1 голос
/ 29 января 2020

Это способ, которым я заполнил candidates - mpg - это Pandas DataFrame:

for s in mpg['name'].values: 
    doc = nlp(s) 
    for ent in doc.ents: 
        if ent.label_ == 'ORG': 
            candidates.append(ent.text) 

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

candidates = ['buick'
             ,'buick skylark'
             ,'buick estate wagon'
             ,'buick century']

В приведенном ниже методе используется fuzz.token_sort_ratio, который описывается как «возвращение меры сходства последовательностей между 0 и 100, но сортировка токена перед сравнением». Попробуйте некоторые из них, которые частично описаны здесь: https://github.com/seatgeek/fuzzywuzzy/issues/137

results = {} # dictionary to store results 
companies = ['buick'] # you'll have more companies
for company in companies:
    results[company] = process.extractBests(company,candidates,
                                            scorer=fuzz.token_sort_ratio,
                                            score_cutoff=50)

И результаты:

In [53]: results                                                                
Out[53]: {'buick': [('buick', 100), 
                    ('buick skylark', 56), 
                    ('buick century', 56)]}

В этом случае, используя 80 в качестве отсечки оценка будет работать лучше, чем 50.

...