机器学习--文本分析(jieba)
一、jieba
jieba分词有三种拆词模式:
jieba.cut(cut_all=False) # 精确模式 适用于文本分析(建模)
jieba.cut(cut_all=True) # 全模式 适合搜索引擎
jieba.cut_for_search() # 搜索引擎模式
cut方法拆完是一个生成器对象
jieba.lcut(cut_all=False) # 精确模式 适用于文本分析(建模)
jieba.lcut(cut_all=True) # 全模式 适合搜索引擎
jieba.lcut_for_search() # 搜索引擎模式
lcut方法拆完是一个列表
二、练习
2.1 词云图制作
import wordcloudimport jiebaimport numpy as npimport pandas as pdfrom PIL import Imageimport matplotlib.pyplot as pltdouyin = pd.read_csv('douyin.csv')# 导入停用词列表stopwords = pd.read_csv('stopwords.txt',encoding='gbk',header=None, error_bad_lines=False)[0].values.tolist()stopwords1 = ['️', '!', '—', '❤',',','•']content = ""for i in douyin['signature'].values:if type(i) == float:continuewords = jieba.lcut(i,cut_all=False)for word in words:if word in stopwords or word in stopwords1:continuecontent += word+" "importance_words = pd.Series(content.split(" ")).value_counts()[1:300]bgimg = np.array(Image.open('bgimg.png'))genclr=wordcloud.ImageColorGenerator(bgimg)wc = wordcloud.WordCloud(font_path='./FZZJ-LongYTJW.TTF', # 设置字体background_color="white", # 背景颜色max_words=200, # 词云显示的最大词数max_font_size=300, # 字体最大值min_font_size=5, #字体最小值random_state=42, #随机数mask=bgimg, #造型遮盖color_func=genclr)# 渲染文字的函数, importance_words文字列表, wc.generate_from_frequencies(importance_words)plt.figure(figsize=(24, 24))plt.imshow(wc)plt.axis('off')
效果如下:
2.2 文本集合转换成词频向量集合
# 拆词默认以【空格】作为分隔符# 如果是英文,可以直接进行转换# 如果是汉语,需要先分词处理,再做转换from sklea.feature_extraction.text import CountVectorizer# 注意文本集的形式 是一维列表,每一条文本是一个元素statements = ['hello world hello world','good moing hello','good good hello world','moing hello good hello']# step1. 构造词频转换器cv = CountVectorizer()# step2. 对文本集进行词频转换,得到一个matrixmatrix = cv.fit_transform(statements)# step3. 提取矩阵的内容,就是词频向量count_vector = matrix.toarray()# step4. 提取词频转换器cv解析的词汇columns = cv.get_feature_names()# step5. 整合结果train = DataFrame(data=count_vector, columns=columns)
2.3 汉字集合转为词频向量集合
import jiebastatements = ["桃花坞里桃花庵", "桃花庵里桃花仙", "桃花仙人种桃树", "再买桃花换酒钱","酒醒只在花前坐","酒醉还来花下眠"]# 只 在 还来 处理成停用词stop_words = ['只','在', '还来']# 把 花前坐 处理成一个词jieba.load_userdict({'花前坐'})for index, statement in enumerate(statements):message = ""for word in jieba.lcut(statement):if word not in stop_words:message += word + " "statements[index] = message.rstrip(" ")# step2: 词频向量转换cv = CountVectorizer()matrix = cv.fit_transform(statements)DataFrame(data=matrix.toarray(), columns=cv.get_feature_names())# 词频-逆文档频率# 用于处理,某条文本中,若干个【相同词频】的词汇的重要性的一种评估手段from sklea.feature_extraction.text import TfidfVectorizertfidf_vc = TfidfVectorizer()m = tfidf_vc.fit_transform(statements)# m.toarray()DataFrame(data=m.toarray(), columns=tfidf_vc.get_feature_names())
2.4 垃圾邮件识别
import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seabo as sns%matplotlib inlinefrom sklea.feature_extraction.text import CountVectorizer,TfidfVectorizerimport re# 导入数据集SMS = pd.read_table('SMSSpamCollection',header=None)# 取出文档集合和标签集合text = SMS.iloc[:,1]target = SMS.iloc[:,0]tf = TfidfVectorizer()matrix = tf.fit_transform(text)# 取出词频-逆文档频率矩阵的值matrix.toarray()# 取出矩阵特征tf.get_feature_names()# 处理数字开头的单词# 返回值为True不包含数字def not_numric(x):patte = '.*\d.*'re_obj = re.compile(patte)retu len(re_obj.findall(x)) ==0def process_statements(text):# 对每一个句子先做处理,删除无效词汇(停用词处理)for index,statement in text.items():# 汉语需要jieba分词,英文直接按空格拆word_list = statement.split(" ")good_statement = ""for word in word_list:# 如果是True,单词保留if not_numric(word):good_statement += word + " "# 更新文本集原语句text.loc[index] = good_statement# 先拆分数据集,在处理符合实际应用场景from sklea.model_selection import train_test_split# 对训练集进行去数字处理process_statements(X_train_text)# 进行tf-idf转换tf = TfidfVectorizer()# tf.fit之后,其中每一个单词的逆文档频率固定tf.fit(X_train_text)matrix = tf.transform(X_train_text)X_train = matrix.toarray()X_train = pd.DataFrame(data=X_train,columns=tf.get_feature_names())from sklea.naive_bayes import MultinomialNB# 生成多项式朴素贝叶斯模型mnb = MultinomialNB()mnb.fit(X_train,y_train)# 注意测试集转换用训练集的tf对象X_test = tf.transform(X_test_text)X_test = pd.DataFrame(data=X_test.toarray(),columns=tf.get_feature_names())mnb.score(X_test,y_test)# 生成伯努利朴素贝叶斯模型from sklea.naive_bayes import BeoulliNBbnb = BeoulliNB()bnb.fit(X_train,y_train)bnb.score(X_test,y_test)
作者:小昀小杭
来源链接:https://blog.csdn.net/weixin_50267049/article/details/110731828
版权声明:
1、JavaClub(https://www.javaclub.cn)以学习交流为目的,由作者投稿、网友推荐和小编整理收藏优秀的IT技术及相关内容,包括但不限于文字、图片、音频、视频、软件、程序等,其均来自互联网,本站不享有版权,版权归原作者所有。
2、本站提供的内容仅用于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯相关权利人及本网站的合法权利。
3、本网站内容原作者如不愿意在本网站刊登内容,请及时通知本站(javaclubcn@163.com),我们将第一时间核实后及时予以删除。