如何使用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
相关产品推荐
相关产品推荐

