文本聚类——文本预处理

文本是非结构化的数据,我们无法直接对文本进行聚类处理。在此之前,应该对文本进行一些预处理操作,将
文本信息转化成统一的结构化的形式。再对这些结构化的数据进行聚类。

文本预处理对于聚类的效果有着重要的作用,预处理的质量高低影响着聚类结果的好坏。
对于英文文本的预处理一般包含以下几个步骤:

  1. 分词
  2. 去除非英文文本
  3. 拼写检查,转换小写
  4. 词干化处理
  5. 去停用词
  6. 词频统计
  7. 特征选择

分词——tokenize

分句:tokenize segment

NLTK中使用nltk.sent_tokenize(text) #对文本按照句子进行分割

分词:tokenize sentence

NLTK中使用nltk.word_tokenize #对句子按照单词进行分割,返回一个列表,表示每个句子为单位的分词结果

      
      
1
2
      
      
tokens = [ word.lower() for sentence in nltk.sent_tokenize(text)
for word in nltk.word_tokenize(sentence)]

去除非英文文本

使用正则表达式剔除,python re模块中的re.search就可以
search(pattern,string):在字符串中寻找模式

      
      
1
2
3
      
      
for token in tokens:
if re.search('[a-zA-Z]', token):
filtered_tokens.append(token)

转换小写

使用lower()方法
此方法返回的所有基于大小写字符被转化为小写字符串的一个副本。

      
      
1
2
3
      
      
tokens = [ word.lower() for sentence in nltk.sent_tokenize(text)
for word in nltk.word_tokenize(sentence)]
sentence)]

词干化处理——stemming

Stemming 是抽取词的词干或词根形式(不一定能够表达完整语义)
NLTK中提供了三种最常用的词干提取器接口,即

  1. Porter stemmer
  2. Lancaster Stemmer
  3. Snowball Stemmer。

我是采用了第三种snowball stemmer

      
      
1
2
      
      
from nltk.stem.snowball import SnowballStemmer
stemmer = SnowballStemmer("english")

扫描二维码关注公众号,回复: 7397626 查看本文章

去停用词——stopwords

使用nltk.corpus的stopwords
分词后使用filter进行筛选

      
      
1
2
3
      
      
from nltk.corpus import stopwords
//disease_List分词结果
filtered = [w for w in disease_List if(w not in stopwords.words('english')]

tf_idf

含义解释

TF-IDF是Term Frequency - Inverse Document Frequency的缩写,即“词频-逆文本频率”。它由两部分组成,TF和IDF。

使用scikit-learn进行TF-IDF预处理

在scikit-learn中,有两种方法进行TF-IDF的预处理。分别是:

  1. 用CountVectorizer类向量化之后再调用TfidfTransformer类进行预处理。
  2. 直接用TfidfVectorizer完成向量化与TF-IDF预处理。
    我使用的第二种
            
            
    1
    2
    3
    4
            
            
    from sklearn.feature_extraction.text import TfidfVectorizer
    tfidf2 = 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是指的等价类的个数。

  1. 当N等于1时,即n-1=0,出现在第i位上的词独立与历史,记为unigram;
  2. 当N等于2时,即n-1=1,出现在第i位上的词只与前一个词有关,也就是一阶马尔科夫链,记为bigram;
  3. 当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在给定文本中的出现次数。

原文:大专栏  文本聚类——文本预处理


猜你喜欢

转载自www.cnblogs.com/petewell/p/11612084.html
今日推荐