无需tf-idf预处理就可以对文本数据进行K-均值聚类

时间:2018-11-25 09:13:01

标签: python k-means

我使用k-means对文本数据进行聚类,而无需进行TF-IDF预处理即可将文本数据转换为数字。 我可以毫无问题地检索K-means聚类组,但是据我所知,不是K-means仅采用数字数据吗?

有人可以向我解释这种情况下,K均值如何计算文本之间的距离?

数据是具有数千行的数据框,下面是其中的一些。 “牛奶果酱面包苹果牛肉苏打水”是我聚集的文字。 “ True”表示该项目在第n个观察中显示。

//get highest id number of table to copy to
$sql = "SELECT id FROM venues ORDER BY id DESC LIMIT 1";
if( $result = mysqli_query( $mysqli, $sql ) ){
    $row = mysqli_fetch_array($result);
    $to_id = $row[ 0 ];
    //increase id 
    $to_id ++;

    //get highest id number of table to copy from
    $sql = "SELECT id FROM submitted_venues ORDER BY id DESC LIMIT 1";
    if( $result = mysqli_query( $mysqli, $sql ) ){
        $row = mysqli_fetch_array($result);
        $from_id = $row[ 0 ];
        //increase id 
        $from_id ++;

        //get highest unused id number
        $temp_id = $to_id > $from_id ? $to_id : $from_id;

        //update existing record to ensure that its id number will not conflict
        $sql = "UPDATE submitted_venues SET id = '$temp_id' WHERE id='$current_venue_id'";
        if( $result = mysqli_query( $mysqli, $sql ) ){
            $current_venue_id = $temp_id;

            //copy record to normal regular venues table
            $sql = "INSERT INTO venues SELECT * FROM submitted_venues WHERE id='$current_venue_id'";
            if( ! $result = mysqli_query( $mysqli, $sql ) )
                die("Could not copy -> " . mysqli_error($mysqli) );

            //delete record from temp db table
            $sql = "DELETE FROM submitted_venues WHERE id='$current_venue_id'";
            if( ! $result = mysqli_query( $mysqli, $sql ) )
                die("Could not delete -> " . mysqli_error($mysqli) );
        }
    }
}

我的代码

Milk    Jam     Bread   Apple   Beef    Soda
False   True    True    False   False   False
True    True    False   False   False   False
False   False   False   False   True    False
False   False   True    True    False   True

1 个答案:

答案 0 :(得分:0)

数据表示

K-Means需要数字数据而不是字符串,因为它可以计算点之间的欧几里得距离。

将字符串文档转换为数字表示形式的可能方法:

  1. 单词袋(BoW)
  2. 期限频率(TF)
  3. 术语频率-反文档频率(TF-IDF)
  4. Doc2Vec

这些方法用于某种层次结构,它们Doc2Vec可以执行最多的信息,但是要花费最大的精力来计算。 BoW花费较少的精力进行计算,但携带的信息较少。

您所代表的是单词袋。

K均值距离

经典K均值(我认为是您所拥有的)使用欧式距离来收敛质心。 在您的情况下,TrueFalse将分别被视为10

K-Means的其他变体,例如 K-Medians K-Medoids ,它们可以使用不同的距离度量。这些可以是曼哈顿距离,余弦距离或任何其他距离。

您也可以做的一件事,就是将算法中的距离函数更改为一个允许使用字符串数据的函数。例如,您可以使用Levenshtein度量来计算点之间的距离。这样,您可以将数据表示形式保留为string,而不必担心将其转换为数字表示形式。

如果您对K-Means变体或更改算法的距离度量感兴趣,建议您阅读此learning unit。它说明了K-Means的工作原理,并帮助您从头开始实施它。