php网站随着内容不断积累,手动分类的工作量大且容易出错,引入机器学习实现内容自动分类是高效的解决方案。下面我们一步步实现这套系统。

一、前期准备与特征提取
首先要做的是从网站已有的内容中提取分类特征,这是机器学习分类的基础。我们需要把文本内容转化为机器可识别的数值特征,通常使用TF-IDF算法实现。
下面是一段php实现TF-IDF特征提取的示例代码:
<?php
/**
* TF-IDF特征提取类
*/
class TfIdfExtractor {
private $documents = [];
private $wordDocCount = [];
private $totalDocs = 0;
// 添加文档内容
public function addDocument($content) {
$this->documents[] = $content;
$this->totalDocs++;
$words = $this->splitWords($content);
$uniqueWords = array_unique($words);
foreach ($uniqueWords as $word) {
if (!isset($this->wordDocCount[$word])) {
$this->wordDocCount[$word] = 0;
}
$this->wordDocCount[$word]++;
}
}
// 简单分词方法,实际可根据需求替换为更完善的分词逻辑
private function splitWords($content) {
// 去除html标签,这里用转义后的标签写法
$content = strip_tags(str_replace(['<', '>'], ['', ''], $content));
$content = preg_replace('/[^\x{4e00}-\x{9fa5}a-zA-Z0-9]/u', ' ', $content);
return array_filter(explode(' ', $content));
}
// 计算单个文档的TF-IDF向量
public function getTfIdfVector($content) {
$words = $this->splitWords($content);
$wordCount = array_count_values($words);
$vector = [];
$totalWords = count($words);
foreach ($wordCount as $word => $count) {
$tf = $count / $totalWords;
$idf = log($this->totalDocs / ($this->wordDocCount[$word] ?? 1));
$vector[$word] = $tf * $idf;
}
return $vector;
}
}
?>二、机器学习分类模型训练
特征提取完成后,我们需要训练分类模型。这里使用php-ai/php-ml库中的朴素贝叶斯分类器,它适合文本分类场景,部署简单且适配php环境。
首先通过composer安装依赖:
composer require php-ai/php-ml
下面是模型训练的示例代码:
<?php
require_once 'vendor/autoload.php';
use Phpml\Classification\NaiveBayes;
use Phpml\FeatureExtraction\TokenCountVectorizer;
use Phpml\Tokenization\WhitespaceTokenizer;
use Phpml\FeatureExtraction\TfIdfTransformer;
// 准备训练数据,格式为[内容, 分类标签]
$trainingData = [
['php是世界上最好的语言,适合做web开发', '编程技术'],
['python多用于数据分析和人工智能开发', '编程技术'],
['今天股市大盘上涨了2个百分点', '财经新闻'],
['央行宣布下调存款准备金率', '财经新闻'],
['新款手机发布,搭载最新处理器', '数码资讯'],
['笔记本电脑性能评测,适合办公和游戏', '数码资讯']
];
$samples = [];
$labels = [];
foreach ($trainingData as $item) {
$samples[] = $item[0];
$labels[] = $item[1];
}
// 特征提取流程
$vectorizer = new TokenCountVectorizer(new WhitespaceTokenizer());
$tfIdfTransformer = new TfIdfTransformer();
$vectorizer->fit($samples);
$vectorizer->transform($samples);
$tfIdfTransformer->fit($samples);
$tfIdfTransformer->transform($samples);
// 训练分类器
$classifier = new NaiveBayes();
$classifier->train($samples, $labels);
// 保存模型,方便后续直接调用
file_put_contents('classifier_model.ser', serialize($classifier));
file_put_contents('vectorizer.ser', serialize($vectorizer));
file_put_contents('tfidf_transformer.ser', serialize($tfIdfTransformer));
?>三、标签配置与分类结果映射
分类模型输出的是预设的分类标签,我们需要把这些标签和网站自身的标签体系做映射,同时可以配置自定义标签规则,适配不同的业务需求。
下面的代码实现了分类预测和标签映射的功能:
<?php
require_once 'vendor/autoload.php';
use Phpml\Classification\NaiveBayes;
use Phpml\FeatureExtraction\TokenCountVectorizer;
use Phpml\FeatureExtraction\TfIdfTransformer;
// 加载保存的模型
$classifier = unserialize(file_get_contents('classifier_model.ser'));
$vectorizer = unserialize(file_get_contents('vectorizer.ser'));
$tfIdfTransformer = unserialize(file_get_contents('tfidf_transformer.ser'));
// 网站标签映射规则,可根据实际业务调整
$tagMapping = [
'编程技术' => ['php', 'python', '编程', '开发'],
'财经新闻' => ['股市', '央行', '财经', '金融'],
'数码资讯' => ['手机', '电脑', '数码', '评测']
];
// 待分类的新内容
$newContent = 'php如何实现文件上传功能,需要注意哪些安全问题';
// 特征转换
$sample = [$newContent];
$vectorizer->transform($sample);
$tfIdfTransformer->transform($sample);
// 预测分类
$predictedLabel = $classifier->predict($sample)[0];
// 映射为网站标签
$siteTags = $tagMapping[$predictedLabel] ?? [];
echo "预测分类:{$predictedLabel}\n";
echo "对应网站标签:" . implode(',', $siteTags) . "\n";
?>四、集成到php网站内容发布流程
最后我们将自动分类功能集成到网站的内容发布接口中,实现内容提交后自动完成分类和标签配置。可以在内容写入数据库前调用分类逻辑,把分类结果和标签一起存入对应字段。
以下是集成到发布接口的示例:
<?php
// 假设这里是内容发布接口的处理逻辑
function publishContent($title, $content) {
// 加载模型相关文件
$classifier = unserialize(file_get_contents('classifier_model.ser'));
$vectorizer = unserialize(file_get_contents('vectorizer.ser'));
$tfIdfTransformer = unserialize(file_get_contents('tfidf_transformer.ser'));
$tagMapping = [
'编程技术' => ['php', '编程', '开发'],
'财经新闻' => ['财经', '金融'],
'数码资讯' => ['数码', '评测']
];
// 组合标题和内容作为分类输入
$input = $title . ' ' . $content;
$sample = [$input];
$vectorizer->transform($sample);
$tfIdfTransformer->transform($sample);
$category = $classifier->predict($sample)[0];
$tags = $tagMapping[$category] ?? [];
// 这里替换为实际的数据库写入逻辑
// $db->insert('articles', [
// 'title' => $title,
// 'content' => $content,
// 'category' => $category,
// 'tags' => implode(',', $tags),
// 'create_time' => time()
// ]);
return [
'category' => $category,
'tags' => $tags,
'status' => 'success'
];
}
// 调用示例
$result = publishContent('php数组常用操作方法总结', '本文总结了php中数组的增删改查、排序、遍历等常用操作方法,适合新手学习');
print_r($result);
?>注意事项
实际应用中需要注意以下几点:
- 训练数据越多,分类准确率越高,建议初期收集至少几百条已分类的内容作为训练集
- 分词逻辑可以根据业务需求优化,比如集成专业的中文分词库提升特征提取准确性
- 分类模型可以定期用新的标注数据重新训练,适配网站内容的变化
- 标签映射规则支持灵活配置,可根据网站运营需求随时调整分类和标签的对应关系