如何在PHP中基于词频减少文本?
例如,如果我有这个文字:
house house house house book book book
它应该简化为类似的东西(或任何类似的形式):
house house book
所以这种方式最常用的单词仍然是2,并且按1预订。
答案 0 :(得分:1)
压缩&在PHP中解压缩字符串:gzcompress,gzuncompress
示例:强>
$text = "house house house house book book book";
echo "Orignal text lenght : ". strlen($text)."<br>";
$compressed = gzcompress($text, 9);
echo "Compressed text: ".$compressed."<br>";
echo "Compress text length :". strlen($compressed);
echo "<br>";
echo "Uncompressed text :".$uncompressed = gzuncompress($compressed);
<强>输出:强>
原始文字长度:38
压缩文本:x /-NU R
压缩文字长度:22
未压缩文本:房屋住宅图书书
答案 1 :(得分:1)
问题实际上很有趣。据我了解,它不是关于压缩,而是关于词频 - 这是我的朋友,是自然语言处理领域。
我的第一个想法是:推荐使用NLTK(并在必要时学习Python),因为没有真正的PHP等价物(最近的库可能是NlpTools)。然而,事实证明,早期的NlpTools贡献者Dan Cardin创建了一个独立的库来处理您的问题:yooper/php-text-analysis
PHP Text Analysis是一个用于执行信息检索的库 使用PHP的(IR)和自然语言处理(NLP)任务 语言
将PHP文本分析添加到项目中
composer require yooper/php-text-analysis
以下是如何使用它的示例:
<?php
require_once('vendor/autoload.php');
$book = file_get_contents('pg74.txt'); // tom sawyer from the gutenberg project http://www.gutenberg.org/cache/epub/74/pg74.txt
// Create a tokenizer object to parse the book into a set of tokens
$tokenizer = new \TextAnalysis\Tokenizers\GeneralTokenizer();
$tokens = $tokenizer->tokenize($book);
$freqDist = new \TextAnalysis\Analysis\FreqDist($tokens);
//Get the top 10 most used words in Tom Sawyer
$top10 = array_splice($freqDist->getKeyValuesByFrequency(), 0, 10);
对freq_dist
的调用会返回FreqDist个实例。
然后,您可以自己计算单词的权重(freq / numberOfAllTokens)或使用getKeyValuesByWeight()
方法。
$top10[0]/$freqDist->getTotalTokens();
$weights = $freqDist->getKeyValuesByWeight();
...或者通过出现您最不频繁的首字词来标准化所选字词的频率,例如:
foreach ($top10 as $word => $freq) {
$relWeight[$word] = $freq/end($top10);
}
根据您的输入,您会发现最常用的字词为a
,the
,that
等。这就是您要删除stopwords的原因。我们才开始......
Here还有更多样本。