在本教程中,我会利用 Python 来说明怎样聚类一系列的文档。我所演示的实例会识别出 top 100 电影的(来自 IMDB 列表)剧情简介的隐藏结构。关于这个例子的详细讨论在初始版本里。本教程包括:
- 对所有剧情简介分词(tokenizing)和词干化(stemming)
- 利用 tf-idf 将语料库转换为向量空间(vector space)
- 计算每个文档间的余弦距离(cosine distance)用以测量相似度
- 利用 k-means 算法进行文档聚类
- 利用多维尺度分析(multidimensional scaling)对语料库降维
- 利用 matplotlib 和 mpld3 绘制输出的聚类
- 对语料库进行Ward 聚类算法生成层次聚类(hierarchical clustering)
- 绘制 Ward 树状图(Ward dendrogram)
- 利用 隐含狄利克雷分布(LDA) 进行主题建模
整个项目在我的 github repo 都可以找到。其中‘cluster_analysis ‘工作簿是一个完整的版本;‘cluster_analysis_web’ 为了创建教程则经过了删减。欢迎下载代码并使用‘cluster_analysis’ 进行单步调试(step through)。
如果你有任何问题,欢迎用推特来联系我 @brandonmrose。
在此之前,我先在前面导入所有需要用到的库
1 2 3 4 5 6 7 8 |
import numpy as np import pandas as pd import nltk import re import os import codecs from sklearn import feature_extraction import mpld3 |
出于走查的目的,想象一下我有 2 个主要的列表:
- ‘titles’:按照排名的影片名称
- ‘synopses’:对应片名列表的剧情简介
我在 github 上 po 出来的完整工作簿已经导入了上述列表,但是为了简洁起见,我会直接使用它们。其中最最重要的是 ‘synopses’ 列表了,‘titles’ 更多是作为了标记用的。
1 2 |
print titles[:10] #前 10 个片名 |
1 |
['The Godfather', 'The Shawshank Redemption', "Schindler's List", 'Raging Bull', 'Casablanca', "One Flew Over the Cuckoo's Nest", 'Gone with the Wind', 'Citizen Kane', 'The Wizard of Oz', 'Titanic'] |
停用词,词干化与分词
本节我将会定义一些函数对剧情简介进行处理。首先,我载入 NLTK 的英文停用词列表。停用词是类似“a”,“the”,或者“in”这些无法传达重要意义的词。我相信除此之外还有更好的解释。
1 2 |
# 载入 nltk 的英文停用词作为“stopwords”变量 stopwords = nltk.corpus.stopwords.words('english') |
1 |
print stopwords[:10] |
1 |
['i', 'me', 'my', 'myself', 'we', 'our', 'ours', 'ourselves', 'you', 'your'] |
接下来我导入 NLTK 中的 Snowball 词干分析器(Stemmer)。词干化(Stemming)的过程就是将词打回原形。
1 2 3 |
# 载入 nltk 的 SnowballStemmer 作为“stemmer”变量 from nltk.stem.snowball import SnowballStemmer stemmer = SnowballStemmer("english") |
以下我定义了两个函数:
- tokenize_and_stem:对每个词例(token)分词(tokenizes)(将剧情简介分割成单独的词或词例列表)并词干化
- tokenize_only: 分词即可
我利用上述两个函数创建了一个重要的字典,以防我在后续算法中需要使用词干化后的词(stems)。出于展示的目的,后面我又会将这些词转换回它们原本的的形式。猜猜看会怎样,我实在想试试看!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
# 这里我定义了一个分词器(tokenizer)和词干分析器(stemmer),它们会输出给定文本词干化后的词集合 在本教程中,我会利用 Python 来说明怎样聚类一系列的文档。我所演示的实例会识别出 top 100 电影的(来自 IMDB 列表)剧情简介的隐藏结构。关于这个例子的详细讨论在初始版本里。本教程包括:
整个项目在我的 github repo 都可以找到。其中‘cluster_analysis ‘工作簿是一个完整的版本;‘cluster_analysis_web’ 为了创建教程则经过了删减。欢迎下载代码并使用‘cluster_analysis’ 进行单步调试(step through)。 如果你有任何问题,欢迎用推特来联系我 @brandonmrose。 在此之前,我先在前面导入所有需要用到的库
出于走查的目的,想象一下我有 2 个主要的列表:
我在 github 上 po 出来的完整工作簿已经导入了上述列表,但是为了简洁起见,我会直接使用它们。其中最最重要的是 ‘synopses’ 列表了,‘titles’ 更多是作为了标记用的。
停用词,词干化与分词本节我将会定义一些函数对剧情简介进行处理。首先,我载入 NLTK 的英文停用词列表。停用词是类似“a”,“the”,或者“in”这些无法传达重要意义的词。我相信除此之外还有更好的解释。
接下来我导入 NLTK 中的 Snowball 词干分析器(Stemmer)。词干化(Stemming)的过程就是将词打回原形。
以下我定义了两个函数:
我利用上述两个函数创建了一个重要的字典,以防我在后续算法中需要使用词干化后的词(stems)。出于展示的目的,后面我又会将这些词转换回它们原本的的形式。猜猜看会怎样,我实在想试试看!
|