Как определить шаблоны текстовых шаблонов в наборе строковых данных? - PullRequest
0 голосов
/ 14 апреля 2019

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

-

Моя самая успешная попытка решить эту проблему - разбить текстовые записи на массивы слов, сравнить массивы слова одного размера для каждого слова, чтобы записать шаблоны, найденные в списке шаблонов.

Как и следовало ожидать, он не идеален и борется за наборы данных, длина которых превышает 50 000 записей.

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

-

Это моя первая попытка в Python, использующая очень простую логику.

samples = ['Your order 12345 has been confirmed. Thank you',
'Your order 12346 has been confirmed. Thank you',
'Your order 12347 has been confirmed. Thank you',
'Your order 12348 has been confirmed. Thank you',
'Your order 12349 has been confirmed. Thank you',
'The code for your bakery purchase is 1234',
'The code for your bakery purchase is 1237',
'The code for your butcher purchase is 1232',
'The code for your butcher purchase is 1231',
'The code for your gardening purchase is 1235']

samples_split = [x.split() for x in samples]
identified_templates = []

for words_list in samples_split:
    for j,words_list_ref in enumerate(samples_split):
         template = str()
         if len(words_list) != len(words_list_ref) or words_list==words_list_ref:
            continue
         else:
            for i,word in enumerate(words_list):
                if word == words_list_ref[i]:
                    template += ' '+word
                else:
                    template += ' %'
            identified_templates.append(template)

templates = dict()          
for template in identified_templates:
    if template not in templates.keys():
        templates[template]=1

templates_2 = dict()

for key, value in templates.items():
    if '% % %' not in key:
        templates_2[key]=1

print(templates_2)  

В идеале код должен принимать следующие данные:

- “Your order tracking number is 123” 
- “Thank you for creating an account with us” 
- “Your order tracking number is 888”
- “Thank you for creating an account with us” 
- “Hello Jim, what is your issue?”
- “Hello Jack, what is your issue?”

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

- “Your order tracking number is {}”,2
- “Thank you for creating an account with us”,2
- “Hello {}, what is your issue?”,2 

1 Ответ

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

Вы можете попробовать следующий код.Я надеюсь, что результат соответствует вашим ожиданиям.

import re
templates_2 = {}
samples = ['Your order 12345 has been confirmed. Thank you',
'Your order 12346 has been confirmed. Thank you',
'Your order 12347 has been confirmed. Thank you',
'Your order 12348 has been confirmed. Thank you',
'Your order 12349 has been confirmed. Thank you',
'The code for your bakery purchase is 1234',
'The code for your bakery purchase is 1237',
'The code for your butcher purchase is 1232',
'The code for your butcher purchase is 1231',
'The code for your gardening purchase is 1235']

identified_templates = [re.sub('[0-9]+', '{}', asample) for asample in samples]
unique_identified_templates = list(set(identified_templates))
for atemplate in unique_identified_templates:
    templates_2.update({atemplate:identified_templates.count(atemplate)})
for k, v in templates_2.items():
    print(k,':',v)

Выход:

The code for your gardening purchase is {} : 1
Your order {} has been confirmed. Thank you : 5
The code for your bakery purchase is {} : 2
The code for your butcher purchase is {} : 2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...