0
0 комментариев

Добрый день!
Реализую классификатор текстов, содержащих вопросы с этого сайта. На данный момент имеется вот такой код:

import requests
import nltk
import string
 
from collections import Counter
from bs4 import BeautifulSoup
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.externals import joblib
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction import DictVectorizer
from pandas import DataFrame
 
 
from sklearn.naive_bayes import MultinomialNB
import re
import os
 
# ----#
# количество классов для обучения
class_total = 0
# лист классов
class_list = []
# количество файлов в каждой папке для обучения
files_total = 3300
# лист файлов (с обучающей выборкой и не только)
files = []
files_class_num = []
# файлов загружено в словарь
file_num = 0
# классов загружено в словарь
class_num = 0
 
#print("Введите количество классов: ")
#class_total = int(input())
class_total = 2
 
classes_written = 0
# while classes_written < class_total:
#     print("Введите класс номер " + str(classes_written + 1) + ": ")
#     class_list.append(input())
#     classes_written += 1
class_list.append('cpp')
class_list.append('java')
 
# записываем тестовую выборку
while class_num < class_list.__len__():
    file_num = 1
    #пока не перебрали все обучающие файлы
    while file_num < files_total+1:
        # если такой файл существует
        # адрес типа : O:/lang/cpp/article_1.htm
        str1 = 'O:/lang/' + class_list[class_num] + '/article_' + str(file_num) + '.htm';
        if os.path.isfile('O:/lang/' + class_list[class_num] + '/article_' + str(file_num) + '.htm'):
            # октрыть файл
            current_file = open('O:/lang/' + class_list[class_num] + '/article_' + str(file_num) + '.htm', "r")
            # записать в переменную содержимое
            line = current_file.read()
            # переменная для удадения всех знаков препинания
            trantab = line.maketrans(string.punctuation, ' ' * len(string.punctuation))
            r = line
            text_without_punct = r.lower().translate(trantab)
            files.append(text_without_punct)
            files_class_num.append(class_num)
        file_num += 1
    class_num += 1
 
# записываем дополнительные тексты
 
 
count_vectorizer = CountVectorizer()
counts = count_vectorizer.fit_transform(files)
 
classifier = MultinomialNB()
classifier.fit(counts, files_class_num)
print('обучение done')
 
joblib.dump(classifier, 'model of 3300.pkl')
 
prediction = classifier.predict(counts[4000])
if(prediction==0):
    print('это срр')
else:
    print('это java')

Обучающая выборка состоит из текстовых файлов по языкам cpp и java, по 3300 в каждой папке.

По данному коду есть несколько вопросов.

Первый, и самый главный — как реализовать обучение без необходимости держать огромный объём выборки в памяти разом, то есть как реализовать «добучение» по схеме: открыл файл — векторизовал — включил в существующую модель?

Второй вопрос — как выводить процент соответствия поданного на вход текста тому или иному классу (предположим, текст на 85% можно отнести к вопросам по java, и только на 15% — к cpp)?

Третий вопрос состоит в том, что у меня получалось брать контрольный пример для классификации только из самой обучающей выборки. В примерах в Сети чаще всего поступают так же. А как использовать случайный текст извне?

4й вопрос — какими методами процесс классификации можно сделать точнее? Буду благодарен, если вы подскажете ресурс, на котором можно почитать про ту или иную модель классификации на русском языке, желательно в сравнении / с примерами (текущая выбрана для проверки работоспособности).

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


Добавить комментарий