1.中文文本预处理操作步骤实例
1.1读取txt文件到数组中
f = open(r"Description.txt") line = f.readline() data_list = [] while line: data=line.strip('\n').split(',') data_list.append(data) line = f.readline() f.close() data_array = np.array(data_list)
1.2去除指定无用的符号
#去除指定无用的符号 def process(our_data): m1 = map(lambda s: s.replace(' ', ''), our_data) return list(m1) for item in data_array: process(item)
1.3让文本只保留汉字
#让文本只保留汉字 def is_chinese(uchar): if uchar >= u'\u4e00' and uchar <= u'\u9fa5': return True else: return False def format_str(content): content_str = '' for i in content: if is_chinese(i): content_str = content_str + i return content_str chinese_list = [] f = open('test.txt','w') for item in data_array: f.write(format_str("".join(item))+'\n') chinese_list.append(format_str("".join(item))) # print(chinese_list) f.close()
1.4对文本进行结巴分词
# 对文本进行jieba分词 fenci_list=[] def fenci(datas): cut_words = map(lambda s: list(jieba.cut(s)), datas) return list(cut_words) fenci_list=fenci(chinese_list)
1.5去除停用词
#去除停用词 f = open(r"StopWords.txt") line = f.readline() stopwords = [] while line: data=line.strip('\n').split(',') stopwords.append(data) line = f.readline() f.close() # 去掉文本中的停用词 def drop_stopwords(contents, stopwords): contents_clean = [] for line in contents: line_clean = [] for word in line: if word in stopwords: continue line_clean.append(word) contents_clean.append(line_clean) return contents_clean word_list =[] word_list =drop_stopwords(fenci_list,stopwords)
1.6将文本转为tfidf向量并输入到算法中
f = open('test.txt','w') for item in word_list : f.write(" ".join(item)+'\n') f.close() file=open('test.txt','r') words=[] for line in file.readlines(): curline=line.strip().split('\n') words.append("".join(curline)) file.close() # print(words) # print(len(words)) #将文本转为tfidf向量并输入到算法中 dictionary = corpora.Dictionary(word_list) new_corpus = [dictionary.doc2bow(text) for text in word_list] tfidf = models.TfidfModel(new_corpus) tfidf_vec = [] for i in range(len(words)): string = words[i] string_bow = dictionary.doc2bow(string.split()) string_tfidf = tfidf[string_bow] tfidf_vec.append(string_tfidf) # print(tfidf_vec)
1.7用lsi向量来保证向量的维度一致
#用lsi向量来保证向量的维度一致 # num_topics参数可以用来指定维度 lsi_model = models.LsiModel(corpus = tfidf_vec,id2word = dictionary,num_topics=2) lsi_vec = [] for i in range(len(words)): string = words[i] string_bow = dictionary.doc2bow(string.split()) string_lsi = lsi_model[string_bow] lsi_vec.append(string_lsi) # print(lsi_vec)
1.8把gensim计算的tfidf向量格式转为array格式
#把gensim计算的tfidf向量格式转化为array格式 from scipy.sparse import csr_matrix data = [] rows = [] cols = [] line_count = 0 for line in lsi_vec: for elem in line: rows.append(line_count) cols.append(elem[0]) data.append(elem[1]) line_count += 1 lsi_sparse_matrix = csr_matrix((data,(rows,cols))) # 稀疏向量 lsi_matrix = lsi_sparse_matrix.toarray() # 密集向量 print(lsi_matrix)
2.结巴分词
2.1安装结巴分词器
- 全自动安装:easy_install jieba 或者 pip install jieba / pip3 install jieba
- 半自动安装:先下载 http://pypi.python.org/pypi/jieba/ ,解压后运行 python setup.py install
- 手动安装:将 jieba 目录放置于当前目录或者 site-packages 目录
最后通过 import jieba 来引用。
2.2 分词类型
(1) 精确模式:此模式下面会尽可能的将句子精确切开。
(2) 全模式:此模式下会将所有可能的词语都进行分词。
(3) 搜索引擎模式:在精确模式的基础上,对长词再进行划分,提高分词的召回率,适合用于搜索引擎分词。
2.3 自定义添加词和字典
当我们在进行分词的时候可能会有一些新的词语,而这些词语分词器没有进行对应的训练,那么就可能导致分词有误。
3.TF-IDF原理
3.1什么是TF-IDF
TF-IDF(Term Frequency-Inverse Document Frequency, 词频-逆文件频率).
是一种用于资讯检索与资讯探勘的常用加权技术。TF-IDF是一种统计方法,用以评估一字词对于一个文件集或一个语料库中的其中一份文件的重要程度。字词的重要性随着它在文件中出现的次数成正比增加,但同时会随着它在语料库中出现的频率成反比下降。
词频 (term frequency, TF) 指的是某一个给定的词语在该文件中出现的次数。这个数字通常会被归一化(一般是词频除以文章总词数), 以防止它偏向长的文件。(同一个词语在长文件里可能会比短文件有更高的词频,而不管该词语重要与否。)
公式:
逆向文件频率 (inverse document frequency, IDF) IDF的主要思想是:如果包含词条t的文档越少, IDF越大,则说明词条具有很好的类别区分能力。某一特定词语的IDF,可以由总文件数目除以包含该词语之文件的数目,再将得到的商取对数得到。
公式:
某一特定文件内的高词语频率,以及该词语在整个文件集合中的低文件频率,可以产生出高权重的TF-IDF。因此,TF-IDF倾向于过滤掉常见的词语,保留重要的词语。
Fw=在某一类中词条w出现的次数该类中所有的词条数目