本文目录导读:

在PHP项目中实现特征提取,通常需要结合具体应用场景(如文本分析、图像处理、用户行为分析等),以下是几种常见实现方式:
文本特征提取
中文分词与关键词提取
// 使用结巴分词PHP扩展 use Fukuball\Jieba\Jieba; use Fukuball\Jieba\Finalseg; // 初始化 Jieba::init(); // 分词 $text = "PHP是一种通用开源脚本语言"; $words = Jieba::cut($text, true); // 精确模式 // 关键词提取(TF-IDF) $keywords = Jieba::extractTag($text, 10); // 提取前10个关键词
N-Gram特征
function extractNgram($text, $n = 2) {
$ngrams = [];
$text = str_replace(' ', '', $text);
$len = mb_strlen($text);
for ($i = 0; $i <= $len - $n; $i++) {
$ngram = mb_substr($text, $i, $n);
if (!isset($ngrams[$ngram])) {
$ngrams[$ngram] = 0;
}
$ngrams[$ngram]++;
}
return $ngrams;
}
// 使用
$bigrams = extractNgram("PHP特征提取", 2);
图像特征提取
使用GD或Imagick
// 颜色直方图特征
function extractColorHistogram($imagePath, $bins = 16) {
$image = imagecreatefromjpeg($imagePath);
$width = imagesx($image);
$height = imagesy($image);
$histogram = array_fill(0, $bins * 3, 0);
$totalPixels = $width * $height;
for ($x = 0; $x < $width; $x++) {
for ($y = 0; $y < $height; $y++) {
$rgb = imagecolorat($image, $x, $y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
$rBin = floor($r / (256 / $bins));
$gBin = floor($g / (256 / $bins));
$bBin = floor($b / (256 / $bins));
$histogram[$rBin]++;
$histogram[$bins + $gBin]++;
$histogram[$bins * 2 + $bBin]++;
}
}
imagedestroy($image);
// 归一化
foreach ($histogram as &$value) {
$value /= $totalPixels;
}
return $histogram;
}
用户行为特征提取
时间序列特征
class UserBehaviorExtractor {
public function extractFeatures($userId, $startDate, $endDate) {
$behaviors = $this->getUserBehaviors($userId, $startDate, $endDate);
return [
'total_actions' => count($behaviors),
'unique_days' => $this->countUniqueDays($behaviors),
'action_frequency' => $this->calculateFrequency($behaviors),
'peak_hours' => $this->findPeakHours($behaviors),
'action_distribution' => $this->getActionDistribution($behaviors),
'session_features' => $this->extractSessionFeatures($behaviors)
];
}
private function calculateFrequency($behaviors) {
$intervals = [];
$lastTime = null;
foreach ($behaviors as $behavior) {
if ($lastTime) {
$intervals[] = $behavior['timestamp'] - $lastTime;
}
$lastTime = $behavior['timestamp'];
}
return [
'mean_interval' => array_sum($intervals) / count($intervals),
'std_interval' => $this->calculateStdDev($intervals)
];
}
private function extractSessionFeatures($behaviors) {
$sessionThreshold = 1800; // 30分钟
$sessions = [];
$currentSession = [];
foreach ($behaviors as $behavior) {
if (empty($currentSession)) {
$currentSession[] = $behavior;
} else {
$lastBehavior = end($currentSession);
if ($behavior['timestamp'] - $lastBehavior['timestamp'] > $sessionThreshold) {
$sessions[] = $currentSession;
$currentSession = [$behavior];
} else {
$currentSession[] = $behavior;
}
}
}
if (!empty($currentSession)) {
$sessions[] = $currentSession;
}
$sessionLengths = array_map('count', $sessions);
return [
'total_sessions' => count($sessions),
'avg_session_length' => array_sum($sessionLengths) / count($sessionLengths),
'max_session_length' => max($sessionLengths)
];
}
}
数值特征提取
统计特征
class StatisticalFeatureExtractor {
public static function extractFeatures($data) {
$n = count($data);
if ($n === 0) return [];
$sum = array_sum($data);
$mean = $sum / $n;
$sorted = $data;
sort($sorted);
return [
'count' => $n,
'mean' => $mean,
'median' => self::getMedian($sorted),
'mode' => self::getMode($data),
'std_dev' => self::getStdDev($data, $mean),
'variance' => self::getVariance($data, $mean),
'min' => min($data),
'max' => max($data),
'range' => max($data) - min($data),
'q1' => $sorted[floor($n * 0.25)],
'q3' => $sorted[floor($n * 0.75)],
'iqr' => $sorted[floor($n * 0.75)] - $sorted[floor($n * 0.25)],
'skewness' => self::getSkewness($data, $mean, $n),
'kurtosis' => self::getKurtosis($data, $mean, $n)
];
}
private static function getStdDev($data, $mean) {
return sqrt(self::getVariance($data, $mean));
}
private static function getVariance($data, $mean) {
$variance = 0;
foreach ($data as $value) {
$variance += pow($value - $mean, 2);
}
return $variance / count($data);
}
private static function getSkewness($data, $mean, $n) {
$numerator = 0;
$denominator = 0;
foreach ($data as $value) {
$diff = $value - $mean;
$numerator += pow($diff, 3);
$denominator += pow($diff, 2);
}
return ($n * $numerator) / (($n - 1) * ($n - 2) * pow($denominator / $n, 1.5));
}
}
使用机器学习库
集成TensorFlow PHP
// 安装:composer require php-ai/php-ml
use Phpml\FeatureExtraction\TfIdfTransformer;
use Phpml\FeatureExtraction\TokenCountVectorizer;
use Phpml\Tokenization\WhitespaceTokenizer;
$samples = [
'PHP is a scripting language',
'Python is also popular',
'PHP and Python are different'
];
// 词袋模型
$vectorizer = new TokenCountVectorizer(new WhitespaceTokenizer());
$vectorizer->fit($samples);
$vectorizer->transform($samples);
// TF-IDF转换
$transformer = new TfIdfTransformer($samples);
$transformer->fit($samples);
$transformer->transform($samples);
实用建议
性能优化
// 使用缓存减少重复计算
$cacheKey = "features_{$contentHash}";
$features = $cache->get($cacheKey);
if ($features === false) {
$features = $this->extractFeatures($data);
$cache->set($cacheKey, $features, 3600);
}
// 批量处理
$batchSize = 100;
$results = [];
foreach (array_chunk($largeDataset, $batchSize) as $batch) {
$batchResults = $this->processBatch($batch);
$results = array_merge($results, $batchResults);
}
错误处理
try {
$features = $extractor->extract($data);
} catch (FeatureExtractionException $e) {
error_log("特征提取失败: " . $e->getMessage());
$features = $this->getFallbackFeatures();
}
选择具体的实现方式取决于你的项目需求、数据类型和性能要求,对于复杂场景,建议结合使用多种特征提取方法,并考虑使用专门的数据分析工具或ML库。