Я пытаюсь реализовать анализ настроений с помощью PHP-ML. У меня есть набор данных обучения примерно 15000 записей. У меня есть работающий код, однако я должен уменьшить набор данных до 100 записей, чтобы он работал. Когда я пытаюсь запустить полный набор данных, я получаю эту ошибку:
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 917504 bytes) in C:\Users\<username>\Documents\Github\phpml\vendor\php-ai\php-ml\src\Phpml\FeatureExtraction\TokenCountVectorizer.php on line 95
У меня есть два файла index.php:
<?php
declare(strict_types=1);
namespace PhpmlExercise;
include 'vendor/autoload.php';
include 'SentimentAnalysis.php';
use PhpmlExercise\Classification\SentimentAnalysis;
use Phpml\Dataset\CsvDataset;
use Phpml\Dataset\ArrayDataset;
use Phpml\FeatureExtraction\TokenCountVectorizer;
use Phpml\Tokenization\WordTokenizer;
use Phpml\CrossValidation\StratifiedRandomSplit;
use Phpml\FeatureExtraction\TfIdfTransformer;
use Phpml\Metric\Accuracy;
use Phpml\Classification\SVC;
use Phpml\SupportVectorMachine\Kernel;
$dataset = new CsvDataset('clean_tweets2.csv', 1, true);
$vectorizer = new TokenCountVectorizer(new WordTokenizer());
$tfIdfTransformer = new TfIdfTransformer();
$samples = [];
foreach ($dataset->getSamples() as $sample) {
$samples[] = $sample[0];
}
$vectorizer->fit($samples);
$vectorizer->transform($samples);
$tfIdfTransformer->fit($samples);
$tfIdfTransformer->transform($samples);
$dataset = new ArrayDataset($samples, $dataset->getTargets());
$randomSplit = new StratifiedRandomSplit($dataset, 0.1);
$trainingSamples = $randomSplit->getTrainSamples();
$trainingLabels = $randomSplit->getTrainLabels();
$testSamples = $randomSplit->getTestSamples();
$testLabels = $randomSplit->getTestLabels();
$classifier = new SentimentAnalysis();
$classifier->train($randomSplit->getTrainSamples(), $randomSplit->getTrainLabels());
$predictedLabels = $classifier->predict($randomSplit->getTestSamples());
echo 'Accuracy: '.Accuracy::score($randomSplit->getTestLabels(), $predictedLabels);
И SentimentAnalysis.php:
<?php
namespace PhpmlExercise\Classification;
use Phpml\Classification\NaiveBayes;
class SentimentAnalysis
{
protected $classifier;
public function __construct()
{
$this->classifier = new NaiveBayes();
}
public function train($samples, $labels)
{
$this->classifier->train($samples, $labels);
}
public function predict($samples)
{
return $this->classifier->predict($samples);
}
}
Я довольно новичок в машинном обучении и php-ml, поэтому я не совсем уверен, как определить, где проблема, или есть ли способ исправить это, не имея тонны памяти. Самое большее, что я могу сказать, это то, что ошибка происходит в TokenCountVectorizer в строке 22 индексного файла. Кто-нибудь имеет какие-либо идеи, что может быть причиной этой проблемы?
Ссылка на PHP-ML находится здесь: http://php-ml.readthedocs.io/en/latest/
Спасибо
Эта ошибка возникает из-за того, что в память загружается больше, чем то, что PHP настроил для обработки в одном процессе. Есть и другие причины, но они встречаются гораздо реже.
В вашем случае ваш экземпляр PHP, кажется, настроен на максимальное 128MB памяти, которая будет использоваться. В машинном обучении это не очень много, и если вы используете большие наборы данных, вы наверняка достигнете этого предела.
Чтобы изменить объем памяти, которую вы разрешаете использовать PHP 1GB Вы можете редактировать свой php.ini
файл и набор
memory_limit = 1024M
Если у вас нет доступа к файлу php.ini, но у вас все еще есть права на изменение настроек, вы можете сделать это во время выполнения, используя
<?php
ini_set('memory_limit', '1024M');
В качестве альтернативы, если вы запускаете апаш Вы можете попытаться установить предел памяти, используя .htaccess
файловая директива
php_value memory_limit 1024M
Обратите внимание, что большинство решений общего хостинга и т. Д. Имеют жесткое и зачастую низкое ограничение на объем памяти, который вам разрешено использовать.
fgets
а также SplFileObject::fgets
загружать прочитанные файлы построчно вместо чтения всего файла в память сразу.unset
данные или большие объекты, с которыми вы закончили и больше не нуждаетесь в памяти. Обратите внимание, что сборщик мусора в PHP не обязательно сразу освобождает память. Вместо этого, по замыслу, он будет делать это, когда почувствует, что требуемые циклы ЦП существуют или до того, как сценарию не хватит памяти, что бы ни произошло первым.echo memory_get_usage() / 1024.0 . ' kb' . PHP_EOL;
распечатать использование памяти в заданном месте в вашей программе, чтобы попытаться определить, сколько памяти используют разные части.Других решений пока нет …