前言
学习任务
基本思路:
首先用read_csv方式读取数据——>再使用jieba对句子进行搜索引擎的分词——>再将分完后的词将其合成一个str,便于后续计算tf-idf——>使用Scikit-learn计算tf-idf,将其处理成向量
一、文本预处理
1.数据的读取——panda
tsv格式的读取
与读取csv的区别就在于加一个属性sep,并设置为\t即可
具体参照:https://blog.csdn.net/zgljl2012/article/details/79109525
read_csv方式:https://www.jianshu.com/p/ebb64a159104
数据的编码
UTF-8和GBK的区别
(但不太用得到)
https://zhidao.baidu.com/question/133119038.html
2.中文分词——jieba
jieba分词:强大的Python 中文分词库
主要功能:是做中文分词,可以进行简单分词、并行分词、命令行分词,当然它的功能不限于此,目前还支持关键词提取、词性标注、词位置查询等
主要运用:jieba.lcut_for_search()
github:https://github.com/fxsjy/jieba/blob/master/README.md
3.Scikit-learn计算TF-IDF
如何使用Scikit-learn计算TF-IDF
https://www.cnblogs.com/caiyishuai/p/9511567.html
sklearn——CountVectorizer详解
https://blog.csdn.net/weixin_38278334/article/details/82320307
计算TF-IDF的多种方法
https://blog.csdn.net/asialee_bird/article/details/81486700
疑惑:可以使用jieba自带的函数去计算TF-IDF吗?
在jieba自带的文档里提到:
其是将文本划分和关键字提取放在一起了吗?那它是如何划分的?是否损失了引擎专用的文本划分的优点?
在尝试过程中不知道如何去让所有的句子放在一起,我认为它的待提取文本就只针对一个文本段,而不是很多篇章,所以不知道如何使用。
4.代码示例
import pandas as pd
import jieba
import jieba.analyse
from sklearn.feature_extraction.text import CountVectorizer, HashingVectorizer, TfidfTransformer,TfidfVectorizer
#数据读入
fileName = 'D:/study/alyun_data/corpus.tsv'
df_train=pd.read_csv(fileName, sep='\t', header=None,index_col=0).astype(str)
list_train=df_train[1].tolist()
#中文
res=[]
i=0
for term in list_train:
seg_list = jieba.lcut_for_search(term)
seg_str=' '.join(seg_list)
res.append(seg_str)
if i %10000==0:
print(i/10000)
i+=1
# print(res)
#tf-idf权重计算
#该类会将文本中的词语转换为词频矩阵,矩阵元素a[i][j] 表示j词在i类文本下的词频
vectorizer = CountVectorizer(max_df=0.8,max_features=100000)
#该类会统计每个词语的tf-idf权值
tf_idf_transformer = TfidfTransformer()
#将文本转为词频矩阵并计算tf-idf
tf_idf = tf_idf_transformer.fit_transform(vectorizer.fit_transform(res))
word=vectorizer.get_feature_names()#获取词袋模型中的所有词语
#将tf-idf矩阵抽取出来,元素a[i][j]表示j词在i类文本中的tf-idf权重
weight = tf_idf.toarray()
总结
疑惑:在对文本进行编码的时候,(文本==向量),这个矩阵是否过度稀疏(有0的个数太多),在对特征进行取舍的时候,该如何进行?
在计算相似度的时候,或许可以使用余弦相似度的方法?