基于词频减少文本的算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于词频减少文本的算法相关的知识,希望对你有一定的参考价值。

如何在php中基于词频减少文本?

例如,如果我有这个文字:

house house house house book book book

它应该简化为这样(或任何类似的形式):

house house book

所以这种方式最常用的词仍然是2和1书。

答案

问题实际上很有趣。据我所知,它不是关于压缩,而是词频 - 这是我的朋友,是自然语言处理领域。

我的第一个想法是:推荐使用NLTK(并在需要时学习Python),因为没有真正的PHP等价物(最近的库可能是NlpTools)。然而,事实证明,早期的NlpTools贡献者Dan Cardin创建了一个独立的库来处理你的问题:yooper/php-text-analysis

PHP Text Analysis是一个使用PHP语言执行信息检索(IR)和自然语言处理(NLP)任务的库

将PHP Text Analysis添加到项目中

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 TextAnalysisTokenizersGeneralTokenizer();
$tokens = $tokenizer->tokenize($book);

$freqDist = new TextAnalysisAnalysisFreqDist($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);
}

根据你的输入,你会发现你最常用的词是athethat等。这就是为什么你要删除stopwords。我们才开始..

Here是一些更多的样本。

另一答案

在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

未压缩的文本:房子的房子房子书书

以上是关于基于词频减少文本的算法的主要内容,如果未能解决你的问题,请参考以下文章

201671010432词频统计软件项目报告

机器学习之自然语言处理——中文分词jieba库详解(代码+原理)

基于COCA词频表的文本词汇分布测试工具v0.2

词频统计单元测试

算法与数据结构Trie树简介及应用

使用朴素贝叶斯(哈希词频率)的文本分类