文本聚类——文本预处理
Posted petewell
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了文本聚类——文本预处理相关的知识,希望对你有一定的参考价值。
文本是非结构化的数据,我们无法直接对文本进行聚类处理。在此之前,应该对文本进行一些预处理操作,将
文本信息转化成统一的结构化的形式。再对这些结构化的数据进行聚类。
文本预处理对于聚类的效果有着重要的作用,预处理的质量高低影响着聚类结果的好坏。
对于英文文本的预处理一般包含以下几个步骤:
- 分词
- 去除非英文文本
- 拼写检查,转换小写
- 词干化处理
- 去停用词
- 词频统计
- 特征选择
分词——tokenize
分句:tokenize segment
NLTK中使用nltk.sent_tokenize(text) #对文本按照句子进行分割
分词:tokenize sentence
NLTK中使用nltk.word_tokenize #对句子按照单词进行分割,返回一个列表,表示每个句子为单位的分词结果
|
|
去除非英文文本
使用正则表达式剔除,python re模块中的re.search就可以
search(pattern,string):在字符串中寻找模式
|
|
转换小写
使用lower()方法
此方法返回的所有基于大小写字符被转化为小写字符串的一个副本。
|
|
词干化处理——stemming
Stemming 是抽取词的词干或词根形式(不一定能够表达完整语义)
NLTK中提供了三种最常用的词干提取器接口,即
- Porter stemmer
- Lancaster Stemmer
- Snowball Stemmer。
我是采用了第三种snowball stemmer
|
|
去停用词——stopwords
使用nltk.corpus的stopwords
分词后使用filter进行筛选
|
|
tf_idf
含义解释
TF-IDF是Term Frequency - Inverse Document Frequency的缩写,即“词频-逆文本频率”。它由两部分组成,TF和IDF。
使用scikit-learn进行TF-IDF预处理
在scikit-learn中,有两种方法进行TF-IDF的预处理。分别是:
- 用CountVectorizer类向量化之后再调用TfidfTransformer类进行预处理。
- 直接用TfidfVectorizer完成向量化与TF-IDF预处理。
我使用的第二种1234from sklearn.feature_extraction.text import TfidfVectorizertfidf2 = TfidfVectorizer()re = tfidf2.fit_transform(corpus)print re
N-gram基本原理
语言模型的作用在于构建为字符串s的概率分布p(s),也即是一个字符串作为一个句子出现的概率。语言模型与句子是否合法没有关系,即便一句话是符合逻辑的,但仍可以认为其出现的概率为零。但反过来不成立,即如果一句话不符合逻辑,那么直接认为这句话出现的概率为零。
对于一个有m个词的句子s=sw1w2w3…wm而言,其概率为:
P(s)=p(w1)p(w2|w1)p(w3|w1w2)…p(wm|w1w2…wm),即产生第i个词的概率是由产生的i-1个词共同决定的,这i-1个词称为第i个词的历史。如果历史的长度为i-1,词汇集有L个,那么将会有L的i-1次方个历史情况,这种数据量是不可想象的。为了解决这个问题,引用等价类的方法减少参数,即:如果两个历史最近的n-1(1≤n≤k)个词相同,那么把这两个历史映射到同一个等价类当中。这种方法就称为N元语法(n-gram),N是指的等价类的个数。
- 当N等于1时,即n-1=0,出现在第i位上的词独立与历史,记为unigram;
- 当N等于2时,即n-1=1,出现在第i位上的词只与前一个词有关,也就是一阶马尔科夫链,记为bigram;
- 当N等于3时,即n-1=2,出现在第i位上的词与前两个词有关,也就是二阶马尔科夫链,记为trigram。
以bigram为例,为了使i=1时有意义,在句子之前加一个标记;为了使所有字符串的概率纸盒等于1,在句子末尾加一个标记。为了估计p(wi|wi-1),可以用最大似然估计(MLE)计算:p(wi|wi-1)=c(wi-1wi)/(求和)c(wi-1wi),其中c表示wi-1wi在给定文本中的出现次数。
原文:大专栏 文本聚类——文本预处理
以上是关于文本聚类——文本预处理的主要内容,如果未能解决你的问题,请参考以下文章