其他分享
首页 > 其他分享> > 基于sklearn的中文文本的特征提取(BOW, TF-IDF)

基于sklearn的中文文本的特征提取(BOW, TF-IDF)

作者:互联网

一、练习

(一)导入库

Scikit-Learn中TF-IDF权重计算方法主要用到两个类:CountVectorizer和TfidfTransformer。

1.CountVectorizer

CountVectorizer类会将文本中的词语转换为词频矩阵,例如矩阵中包含一个元素a[i][j],它表示j词在i类文本下的词频。它通过fit_transform函数计算各个词语出现的次数,通过get_feature_names()可获取词袋中所有文本的关键字,通过toarray()可看到词频矩阵的结果。

2.TfidfTransformer

TfidfTransformer用于统计vectorizer中每个词语的TF-IDF值。

import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer

(二) 生成数据

corpus = [
  "帮我 查下 明天 北京 天气 怎么样",
  "帮我 查下 今天 北京 天气 好不好",
  "帮我 查询 去 北京 的 火车",
  "帮我 查看 到 上海 的 火车",
  "帮我 查看 特朗普 的 新闻",
  "帮我 看看 有没有 北京 的 新闻",
  "帮我 搜索 上海 有 什么 好玩的",
  "帮我 找找 上海 东方明珠 在哪"
]


print(corpus[0].split(' '))

(三)id列表用于存储第i个句子的序号,word列表用于存储第i个句子中的单词

num = 0
num_list = []
word_list = []
for ii0 in range(len(corpus)):
    num += 1
    word = corpus[ii0].split(' ')
    for i in word:
        num_list.append(num)
        word_list.append(i)
print(num_list, word_list)

(四)将两个列表转换成dataframe

# 将不同列表转换为DataFrame
from pandas.core.frame import DataFrame
cp = {'id':num_list, 'word':word_list}
df = DataFrame(cp)
df.head(10)

(五)读取现有数据

import pandas as pd
df.to_csv('corpus.csv', index=False, encoding='gbk')
df.head(5)

二、正式开始

(一)加载库,并读取数据

自然语言工具包(NLTK)是最受欢迎的自然语言处理(NLP)库。

# 从这里开始
# 首先导入所需要的库
import nltk
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer


df = pd.read_csv('corpus.csv', encoding='gbk')
df.head()

(二)将数据转换成列表

# 将数据转化成列表
id_list = list(df.id)
word_list = list(df.word)
print(id_list, word_list)
df.groupby(['id'])
cps = []
for i in df.groupby(['id']):
    seg_list = list(i[1].word)
    print(seg_list)
    seg = ' '.join(seg_list)
    cps.append(seg)

(三)计算词频

# 计算词频
import nltk
for i in cps:
    ii = i.split(' ')
    cfd = dict(nltk.FreqDist(ii))
    print(cfd)

FreqDist函数接收list类型的参数后,会自动创建字典,生成对应的值为键值,而value就是元素的次数。

# 运用sklearn的BOW方法

# step 1 声明一个向量化工具vectorizer
vectoerizer = CountVectorizer(min_df=1, max_df=1.0, token_pattern='\\b\\w+\\b')
# step 2 根据语料集统计词袋(fit)
vectoerizer.fit(corpus)
# step 3 打印语料集的词袋信息
bag_of_words = vectoerizer.get_feature_names()
print("Bag of words:")
print(bag_of_words)
print("len of bag_of_words:", len(bag_of_words))
# step 4 将语料集转化为词袋向量(transform)
X = vectoerizer.transform(corpus)
# 查看数值特征
print("Vectorized corpus:")
print(X.toarray())
# step 5 还可以查看每个词在词袋中的索引
print("index of `的` is : {}".format(vectoerizer.vocabulary_.get('的')))
# step 1 声明一个TF-IDF转化器(TfidfTransformer)
tfidf_transformer = TfidfTransformer()
# step 2 根据语料集的词袋向量计算TF-IDF(fit)
tfidf_transformer.fit(X.toarray())
# step 3 打印TF-IDF信息:比如结合词袋信息,可以查看每个词的TF-IDF值
for idx, word in enumerate(vectoerizer.get_feature_names()):
  print("{}\t{}".format(word, tfidf_transformer.idf_[idx]))
# step 4 将语料集的词袋向量表示转换为TF-IDF向量表示
tfidf = tfidf_transformer.transform(X)
print(tfidf.toarray())

 

标签:word,df,print,list,BOW,TF,step,IDF,import
来源: https://blog.csdn.net/weixin_42295205/article/details/92701697