You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用php-ai/php-ml与K-means聚类将句子分组为相似集合?

基于K-means的句子相似度分组问题及修复方案

我尝试将句子数组按句中单词的相似度进行分组,希望用户能指定分组的松紧程度,因此选择K-means聚类算法(可指定分组数量),但找不到相关示例,自己写的代码无法正确生成向量化句子——因为参考示例里用了TokenCountVectorizer中不存在的fitTransform方法。

原问题代码

require 'vendor/autoload.php';

use Phpml\Clustering\KMeans;
use Phpml\FeatureExtraction\TokenCountVectorizer;
use Phpml\Tokenization\WhitespaceTokenizer;

// Define the sentences
$sentences = [
    "This is the first sentence.",
    "The second sentence is here.",
    "Here is the third sentence.",
    "And the fourth sentence is here too.",
    "This is a different sentence.",
    "Another unique sentence here."
];

// Tokenize the sentences
$tokenizer = new WhitespaceTokenizer();
$tokenizedSentences = [];
foreach ($sentences as $sentence) {
    $tokens = $tokenizer->tokenize($sentence);
    $tokenizedSentences[] = $tokens;
}

// Vectorize the sentences
$vectorizer = new TokenCountVectorizer($tokenizer);
$vectorizedSentences = $vectorizer->fitTransform($tokenizedSentences);

// Perform K-means clustering
$kmeans = new KMeans(2);
$clusters = $kmeans->cluster($vectorizedSentences);

// Output the clusters
foreach ($clusters as $clusterId => $cluster) {
    echo "Cluster " . ($clusterId + 1) . ":\n";
    foreach ($cluster as $index) {
        echo "- " . $sentences[$index] . "\n";
    }
    echo "\n";
}

问题核心

TokenCountVectorizer类中并没有fitTransform方法,正确的流程是先调用fit()方法拟合语料构建词汇表,再调用transform()方法生成向量;同时手动分词的步骤是多余的,向量器会自动处理分词。

修复后的代码

require 'vendor/autoload.php';

use Phpml\Clustering\KMeans;
use Phpml\FeatureExtraction\TokenCountVectorizer;
use Phpml\Tokenization\WhitespaceTokenizer;

// 定义句子数组
$sentences = [
    "This is the first sentence.",
    "The second sentence is here.",
    "Here is the third sentence.",
    "And the fourth sentence is here too.",
    "This is a different sentence.",
    "Another unique sentence here."
];

// 初始化向量器,传入分词器
$vectorizer = new TokenCountVectorizer(new WhitespaceTokenizer());

// 拟合语料,构建词汇表
$vectorizer->fit($sentences);

// 将句子转换为词频向量
$vectorizedSentences = $vectorizer->transform($sentences);

// 执行K-means聚类,指定2个分组
$kmeans = new KMeans(2);
$clusters = $kmeans->cluster($vectorizedSentences);

// 输出聚类结果
foreach ($clusters as $clusterId => $cluster) {
    echo "Cluster " . ($clusterId + 1) . ":\n";
    foreach ($cluster as $index) {
        echo "- " . $sentences[$index] . "\n";
    }
    echo "\n";
}

关键修复点

  • 移除手动分词步骤:TokenCountVectorizer会自动对输入的句子执行分词操作
  • 拆分向量转换流程:
    • fit($sentences):分析所有句子,提取并构建词汇表
    • transform($sentences):基于词汇表,将每个句子转换为对应的词频向量

内容的提问来源于stack exchange,提问作者Mr J

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 08:17:47