从网上下载《红楼梦》的txt文件
一. 读入:
df_content_read=pd.read_csv("E:\\Downloads\\红楼梦.txt",sep='\r\n',encoding='utf-8')
df_content_read.head(10)
结果:
《红楼梦》作者:曹雪芹 | |
---|---|
0 | 简介 |
1 | 《红楼梦》,文中提及的书名还有《石头记》、《情僧录》、《风月宝鉴》、《金陵十二钗》。 乾隆四... |
2 | 目录 |
3 | 第 一 回 |
4 | 甄士隐梦幻识通灵 |
5 | 贾雨村风尘怀闺秀 |
6 | 第 二 回 |
7 | 贾夫人仙逝扬州城 |
8 | 冷子兴演说荣国府 |
9 | 第 三 回 |
二、去标点符号
import string
from zhon.hanzi import punctuation
def del_puctuation(text):
a=""
for item in text:
if item in punctuation:#中文标点符号
continue
else:
a+=item
return a
#df_content_read.iloc[0:,0:1]
df_content_read['ppnt']=df_content_read.iloc[0:,0:1]
df_content_read.head()
df_content_read['lieming']=df_content_read.ppnt.apply(del_puctuation)
df_content_read.head()
结果
《红楼梦》作者:曹雪芹 | ppnt | lieming | |
---|---|---|---|
0 | 简介 | 简介 | 简介 |
1 | 《红楼梦》,文中提及的书名还有《石头记》、《情僧录》、《风月宝鉴》、《金陵十二钗》。 乾隆四... | 《红楼梦》,文中提及的书名还有《石头记》、《情僧录》、《风月宝鉴》、《金陵十二钗》。 乾隆四... | 红楼梦文中提及的书名还有石头记情僧录风月宝鉴金陵十二钗 乾隆四十九年甲辰1784梦觉主人序本... |
2 | 目录 | 目录 | 目录 |
3 | 第 一 回 | 第 一 回 | 第 一 回 |
4 | 甄士隐梦幻识通灵 | 甄士隐梦幻识通灵 | 甄士隐梦幻识通灵 |
三、中文分词
import jieba as jb
import codecs
import jieba.analyse
def cut_text(text):#词云那个例子用的
list=( ','.join(jb.cut(text)))
word =list.split(",")
return word
def cut_text_cidai(text):#词袋模型用的
list=( ' '.join(jb.cut(text)))
word =list
return word
df_content0=pd.DataFrame()
df_content0_cidai=pd.DataFrame()
df_content0['content_S']=df_content_read.lieming.apply(cut_text)
df_content0.head()
df_content0_cidai['content_S']=df_content_read.lieming.apply(cut_text_cidai)
df_content0_cidai.head()
#index=1000
#content_S_str=",".join(jieba.cut(df_content['lieming'][index]))
#print (content_S_str)
结果
content_S | |
---|---|
0 | 简介 |
1 | 红楼梦 文中 提及 的 书名 还有 石头记 情僧录 风月 宝鉴 金陵 十二钗 乾隆 四十... |
2 | 目录 |
3 | 第 一 回 |
4 | 甄士隐 梦幻 识通灵 |
四、导入网上下载的停止词
stopwords=pd.read_csv("stopwords.txt",index_col=False,sep="\t",quoting=3,names=['stopword'],encoding='utf8')
五、去掉停止词
def drop_stopwords(contents,stopwords):
contents_clean=[]
all_words=[]
global word
for line in contents:
line_clean=[]
for word in line:
if word in stopwords:
continue
if word=="\r\n":
continue
if word=="\t":
continue
if word==" ":
continue
line_clean.append(word)
all_words.append(str(word))
contents_clean.append(line_clean)
return contents_clean,all_words
stopwords=pd.read_csv("stopwords.txt",index_col=False,sep="\t",quoting=3,names=['stopword'],encoding='utf8')
stopwords=stopwords[3:]
#词云用的
contents=df_content0.content_S.values.tolist()
stopwords=stopwords.stopword.values.tolist()
contents_clean,all_wors=drop_stopwords(contents,stopwords)
#词袋用的
#contents=df_content0_cidai.content_S.values.tolist()
#stopwords=stopwords.stopword.values.tolist()
#contents_clean,all_wors=drop_stopwords(contents,stopwords)
df_content=pd.DataFrame({'contents_clean':contents_clean})
df_content.head()
结果
df_content=pd.DataFrame({'contents_clean':contents_clean})
df_content.head()
contents_clean | |
---|---|
0 | [简介] |
1 | [红楼梦, 文中, 提及, 书名, 石头记, 情僧录, 风月, 宝鉴, 金陵, 十二钗, 乾... |
2 | [目录] |
3 | [回] |
4 | [甄士隐, 梦幻, 识通灵] |
六、统计词袋
print("共有",len(contents_clean),"条数据,",len(all_wors),"个词汇")
共有 3090 条数据, 254261 个词汇
df_all_words=pd.DataFrame({'all_words':all_wors})
df_all_words.head()
all_words | |
---|---|
0 | 简介 |
1 | 红楼梦 |
2 | 文中 |
3 | 提及 |
4 | 书名 |
词频统计
words_count=df_all_words.groupby(by=['all_words'])['all_words'].agg({'count':numpy.size})
words_count=words_count.reset_index().sort_values(by=['count'],ascending=False)
words_count.head()
all_words | count | |
---|---|---|
41712 | 道 | 6231 |
38621 | 说 | 5936 |
16025 | 宝玉 | 3740 |
33204 | 笑 | 2427 |
11593 | 听 | 1775 |
词云
from wordcloud import WordCloud
import matplotlib.pyplot as plt
%matplotlib inline
import matplotlib
matplotlib.rcParams['figure.figsize']=(10.0,5.0)
wordcloud=WordCloud(font_path="./data/simhei.ttf",background_color="white",max_font_size=80)
word_frequence={x[0]:x[1] for x in words_count.head(100).values}
wordcloud=wordcloud.fit_words(word_frequence)
plt.imshow(wordcloud)
tf-idf提取关键词
import jieba.analyse
index=666
print(df_content_read['lieming'][index])
content_S_str="".join(contents[index])
print(" ".join(jieba.analyse.extract_tags(content_S_str,topK=5,withWeight=False)))
结果
宝钗看毕又从新翻过正面来细看口内念道莫失莫忘仙寿恒昌念了两遍乃回头向莺儿笑道你不去倒茶也在这里发呆作什么"莺儿嘻嘻笑道我听这两句话倒象和姑娘的项圈上的两句话是一对儿宝玉听了忙笑道原来姐姐那项圈上也有八个字我也赏鉴赏鉴宝钗道你别听他的话没有什么字宝玉笑央好姐姐你怎么瞧我的了呢宝钗被缠不过因说道也是个人给了两句吉利话儿所以錾上了叫天天带着不然沉甸甸的有什么趣儿一面说一面解了排扣从里面大红袄上将那珠宝晶莹黄金灿烂的璎珞掏将出来.宝玉忙托了锁看时果然一面有四个篆字两面八字共成两句吉谶.亦曾按式画下形相
赏鉴 项圈 宝玉 两句话 一面
word2vec
# 设定词向量训练的参数
num_features = 300 # Word vector dimensionality
min_word_count = 10 # Minimum word count
num_workers = 4 # Number of threads to run in parallel
context = 20 # Context window size
itera=10
model_name = '{}features_{}minwords_{}context.model'.format(num_features, min_word_count, context)
from gensim.models.word2vec import Word2Vec
import os
#需要list<list>格式,之前做成一个整list,训练不出数据
model = Word2Vec(contents_clean, workers=num_workers,
size=num_features, min_count = min_word_count,
window = context,iter=itera)
# If you don't plan to train the model any further, calling
# init_sims will make the model much more memory-efficient.
model.init_sims(replace=True)
# It can be helpful to create a meaningful model name and
# save the model for later use. You can load it later using Word2Vec.load()
model.save(os.path.join('.', 'models', model_name))
结果
model.most_similar("宝玉")
[('睡', 0.7938694953918457),
('呆呆', 0.7760806083679199),
('袭人', 0.7745546102523804),
('林黛玉', 0.7742149233818054),
('枕头', 0.7708580493927002),
('晴雯', 0.7403253316879272),
('睡着', 0.7350031137466431),
('袭', 0.7328057289123535),
('向宝玉', 0.7326967716217041),
('袭人见', 0.7319577932357788)]
print(model.doesnt_match(['黛玉','薛宝钗','袭人']))
袭人