对中文汉字进行特征提取

方法一:CountVectorizer方法进行特征提取

from sklearn.feature.extraction.text import CountVectorizer

这个方法根据分词进行数量统计继续文本分类

文本特征提取

作用:对文本进行特征值化

sklearn.feature_extraction.text.CountVectorizer(stop_words = [])

 返回:词频矩阵

CountVectorizer.fit_transform(X) X:文本或者包含文本字符串的可迭代对象

 返回:sparse矩阵 在后面加上 .toarray() 可以转换为二维数组

CountVectorizer.inverse_transform(X) X:array数组或者sparse矩阵

 返回:转换之前数据格

CountVectorizer.get_feature_names()

 返回:单词列表,也可以说是返回特征名字



中文特征提取举例(手动分词)

from sklearn.feature_extraction.text import CountVectorizer
#中文 需要分词,否则是以整句作为一个词。英文则不需要,因为英文单词本来就有空格
def chinese_text_count_demo():
    data = ["我 爱 北京 天安门", "天安门 上 太阳 升"]
    
    # 1、实例化一个转换器类(为什么叫转化器,因为是将 文本 转化为 数值)
    transfer = CountVectorizer()
    
    # 2、调用fit_transform
    data_new = transfer.fit_transform(data)
    print("data_new:\n", data_new.toarray())
    print("特征名字:\n", transfer.get_feature_names())
    
    return None

if __name__ == '__main__':
    chinese_text_count_demo()

输出结果:
data_new:
 [[1 1 0]
 [0 1 1]]
特征名字:
 ['北京', '天安门', '太阳']

解析:上面第一行表示的是,data第一句话

数字表示的是,这个 特征词 出现的次数

中文特征提取举例(使用jieba分词)

首先你需要在自己的cmd命令行中下载jieba

pip3 install jieba / pip install jieba

from sklearn.feature_extraction.text import CountVectorizer
import jieba

def cut_word(text):
    #进行中文分词
    return " ".join(list(jieba.cut(text)))
    # jieba.cut(text)返回的是一个生成器对象,需要转换为迭代器
    #return "".join(jieba.lcut(text))
    #jieba.cut(text)直接返回一个列表list

def auto_chinese_text_count_demo():
    data = ["你说这该怎么办"
           ,"唐龙大声问怎么回事"
           ,"晚上找个地方喝几盅怎么样"
           ,"老忠领他们到朱老明那里站在大柏树坟前说你看看这个地势怎么样我们的人要是从城里过来经过大渡口或是小渡口沿着千里堤"]
    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))
    
    print("句子分词后:\n", data_new)
    
    # 1、实例化一个转换器类
    transfer = CountVectorizer(stop_words = ["",""])#停顿词应该预处理清理,这里只是示范
    
    # 2、调用fit_transform
    data_vector_value = transfer.fit_transform(data_new)
    print("data_vector_value:\n", data_vector_value.toarray())
    print("特征名字:\n", transfer.get_feature_names())
    
    return None
    
    
if __name__ =='__main__':
    auto_chinese_text_count_demo()


输出结果:
句子分词后:
 ['你 说 这 该 怎么办', '唐龙 大声 问 怎么回事', '晚上 找个 地方 喝 几盅 怎么样', '老忠领 他们 到 朱老明 那里 站 在 大柏树 坟前 说 你 看看 这个 地势 怎么样 我们 的 人 要 是从 城里 过来 经过 大渡口 或是 小 渡口 沿着 千里 堤']
data_vector_value:
 [[0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 0 0 1 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
 [0 1 0 0 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 0 0]
 [1 0 1 0 1 0 1 1 0 1 1 0 0 1 1 1 0 1 0 1 1 1 1 1 1 1 1 1]]
特征名字:
 ['他们', '几盅', '千里', '唐龙', '地势', '地方', '坟前', '城里', '大声', '大柏树', '大渡口', '怎么办', '怎么回事', '怎么样', '我们', '或是', '找个', '是从', '晚上', '朱老明', '沿着', '渡口', '看看', '经过', '老忠领', '过来', '这个', '那里']

 

方法二:TfidfVectorizer方法进行特征提取

from sklearn.feature_extraction.text import TfidfVectorizer

sklearn.feature_extraction.text.TfidfVectorizer(stop_words=None)

返回:权重矩阵

TfidfVectorizer.fit_transform(X)

X:文本或者包括文本字符串的可迭代对象

返回:sparse矩阵

TfidfVectorizer.inverse_transform(X)

X:array数组或者sparse矩阵

返回:转换之前数据格式

TfidfVectorizer.get_feature_names()

返回:单词列表,也可以说是特征名字

 

TfidfVectorizer衡量的就是一个词在文章中的重要程度

TF-IDF的主要思想是:如果某个词或短语在一篇文章中出现的概率高,并且在其他文章中很少出现,则认为此词或者短语具有很好的类别区分能力。(适合:分类)

TF-IDF作用:用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。

TfidfVectorizer = TF + IDF

  --> TF   - 词频(term frequency,tf)

  --> IDF - 逆向文档频率(inverse document frequency, idf)

  举例:

  假设现在有两个关键词“经济”,“非常”。

  现在基础数据是1000篇文章的语料库。其中1000篇文章“非常”一词出现的频率很高,10篇文章“经济”一词出现的很高。

  计算公式:

  TF(词频)= 出现的频率/总次数

  IDF(逆向文档频率) = log10 (文件总数/包含该词语的文件数目)

  TF-IDF = TF * IDF

  要求计算:

  现有两篇文章

  文章A(100词):10次“经济” TF-IDF:0.2

    tf:10/100 = 0.1

    idf:lg (1000/10) = 2

  文章B(100词):10次“非常” TF-IDF:0.1

    tf:10/100 = 0.1

    idf:lg (1000/100) = 1


from sklearn.feature_extraction.text import TfidfVectorizer
import jieba

def cut_word(text):
    #进行中文分词
    return " ".join(list(jieba.cut(text)))
    # jieba.cut(text)返回的是一个生成器对象,需要转换为迭代器
    #return "".join(jieba.lcut(text))
    #jieba.cut(text)直接返回一个列表list

def tf_idf_demo():
    data = ["你说这该怎么办"
           ,"唐龙大声问怎么回事"
           ,"晚上找个地方喝几盅怎么样"
           ,"老忠领他们到朱老明那里站在大柏树坟前说你看看这个地势怎么样我们的人要是从城里过来经过大渡口或是小渡口沿着千里堤"]
    
    data_new = []
    for sent in data:
        data_new.append(cut_word(sent))
    
    transfer = TfidfVectorizer( stop_words = ["",""])
    
    data_feature_value = transfer.fit_transform(data_new)
    print("data_feature_value:\n", data_feature_value.toarray())
    print("特征名字:\n", transfer.get_feature_names())
    
    return None

if __name__ =='__main__':
    tf_idf_demo()


输出结果:
data_feature_value:
 [[0.         0.         0.         0.         0.         0.
  0.         0.         0.         0.         0.         1.
  0.         0.         0.         0.         0.         0.
  0.         0.         0.         0.         0.         0.
  0.         0.         0.         0.        ]
 [0.         0.         0.         0.57735027 0.         0.
  0.         0.         0.57735027 0.         0.         0.
  0.57735027 0.         0.         0.         0.         0.
  0.         0.         0.         0.         0.         0.
  0.         0.         0.         0.        ]
 [0.         0.46516193 0.         0.         0.         0.46516193
  0.         0.         0.         0.         0.         0.
  0.         0.36673901 0.         0.         0.46516193 0.
  0.46516193 0.         0.         0.         0.         0.
  0.         0.         0.         0.        ]
 [0.22575266 0.         0.22575266 0.         0.22575266 0.
  0.22575266 0.22575266 0.         0.22575266 0.22575266 0.
  0.         0.17798599 0.22575266 0.22575266 0.         0.22575266
  0.         0.22575266 0.22575266 0.22575266 0.22575266 0.22575266
  0.22575266 0.22575266 0.22575266 0.22575266]]
特征名字:
 ['他们', '几盅', '千里', '唐龙', '地势', '地方', '坟前', '城里', '大声', '大柏树', '大渡口', '怎么办', '怎么回事', '怎么样', '我们', '或是', '找个', '是从', '晚上', '朱老明', '沿着', '渡口', '看看', '经过', '老忠领', '过来', '这个', '那里']

 

 

参考链接:https://www.cnblogs.com/ftl1012/p/10498480.html

posted @ 2019-09-25 23:52  何侠客  阅读(2813)  评论(1编辑  收藏  举报