学习中文TF-IDF & Word2Vec- 红楼梦

从网上下载《红楼梦》的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()

结果

 《红楼梦》作者:曹雪芹ppntlieming
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_wordscount
417126231
386215936
16025宝玉3740
332042427
115931775

 词云

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(['黛玉','薛宝钗','袭人']))

袭人
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值