python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战

目录

1 需要导入的模块

import numpy as np
import pandas as pd

import jieba
import jieba.analyse

import matplotlib.pyplot as plt

plt.style.use('seaborn')  # 改变图像风格
plt.rcParams['font.family'] = ['Arial Unicode MS', 'Microsoft Yahei', 'SimHei', 'sans-serif']  # 解决中文乱码
plt.rcParams['axes.unicode_minus'] = False  # simhei黑体字 负号乱码 解决

2 中文分词基础步骤

2.1 载入数据

1 载入数据

写法1
with open(r'data\text.txt','r',encoding='GBk') as f:
    a = f.read()

写法2
with open('data\\text.txt','r',encoding='GBk') as f:
    a = f.read()
a

2.2 分词

  • cut() 切割
 2 分词
b = jieba.cut(a)
b  # &#x5F97;&#x5230;&#x5730;&#x5740;&#xFF1A;<generator object tokenizer.cut at 0x000001ae80ffbe48>
list(b) # &#x5217;&#x8868;&#x5316;
</generator>

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
遍历一遍
for i in jieba.cut(a):
    print(i)

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • lcut() 切割并列表化
&#x5206;&#x8BCD;&#x540E;&#x76F4;&#x63A5;&#x751F;&#x6210;&#x5217;&#x8868;
c = jieba.lcut(a)
c

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战

2.3 分词后的数据转回文本

3 &#x5206;&#x8BCD;&#x540E;&#x7684;&#x6570;&#x636E;&#x8F6C;&#x56DE;&#x6587;&#x672C;
d = ' '.join(c)
d

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战

2.4 保存分词后的文本为文本文件

 4 &#x4FDD;&#x5B58;&#x5206;&#x8BCD;&#x540E;&#x7684;&#x6587;&#x672C;&#x4E3A;&#x6587;&#x672C;&#x6587;&#x4EF6;
with open(r'temp\20211022cut.txt','w',encoding='utf-8') as f:
    f.write(d)

3 添加自定义词典

a = '&#x674E;&#x5C0F;&#x798F;&#x662F;&#x521B;&#x65B0;&#x529E;&#x4E3B;&#x4EFB;&#x4E5F;&#x662F;&#x4E91;&#x8BA1;&#x7B97;&#x4E13;&#x5BB6;'
a

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
普通分词结果
jieba.lcut(a)

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
注意:自定义词典文本文件,如果使用Windows记事本编辑,读入Python列表时会带有文件头BOM,应该用高级编辑器去除

3.1 方法1:直接定义词典列表

&#x5E94;&#x7528;&#x81EA;&#x5B9A;&#x4E49;&#x8BCD;&#x5178;
&#x6CE8;&#x610F;&#xFF1A;&#x81EA;&#x5B9A;&#x4E49;&#x8BCD;&#x5178;&#x6587;&#x672C;&#x6587;&#x4EF6;&#xFF0C;&#x5982;&#x679C;&#x4F7F;&#x7528;Windows&#x8BB0;&#x4E8B;&#x672C;&#x7F16;&#x8F91;&#xFF0C;&#x8BFB;&#x5165;Python&#x5217;&#x8868;&#x65F6;&#x4F1A;&#x5E26;&#x6709;&#x6587;&#x4EF6;&#x5934;BOM&#xFF0C;&#x5E94;&#x8BE5;&#x7528;&#x9AD8;&#x7EA7;&#x7F16;&#x8F91;&#x5668;&#x53BB;&#x9664;

&#x65B9;&#x6CD5;1&#xFF1A;&#x76F4;&#x63A5;&#x5B9A;&#x4E49;&#x8BCD;&#x5178;&#x5217;&#x8868;
b = ['&#x4E91;&#x8BA1;&#x7B97;', '&#x521B;&#x65B0;&#x529E;']

jieba.load_userdict(b)
jieba.lcut(a)

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战

3.2 方法2:外部载入

3.2 &#x65B9;&#x6CD5;2&#xFF1A;&#x5916;&#x90E8;&#x8F7D;&#x5165;
with open(r'data\custom.txt','r',encoding='utf-8') as f:
    b = f.read()

b = b.split('\n')
b

jieba.load_userdict(b)
jieba.lcut(a)

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 方法2升级:输入路径直接应用自定义词典
&#x65B9;&#x6CD5;2&#x5347;&#x7EA7;
jieba.load_userdict('data\custom.txt')

jieba.lcut(a)

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战

4 动态增加或删除词典的词

&#x52A8;&#x6001;&#x589E;&#x52A0;&#x6216;&#x5220;&#x9664;&#x8BCD;&#x5178;&#x7684;&#x8BCD;
a2 = '&#x6211;&#x4EEC;&#x4E2D;&#x51FA;&#x4E86;&#x4E00;&#x4E2A;&#x53DB;&#x5F92;'
jieba.lcut(a2)

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 两个词错误的分为1个词,删除词实现正确分词

删除jieba自带的词(不同于去停用词,不是删除词,而是重新分词)

&#x4E24;&#x4E2A;&#x8BCD;&#x9519;&#x8BEF;&#x7684;&#x5206;&#x4E3A;1&#x4E2A;&#x8BCD;&#xFF0C;&#x5220;&#x9664;&#x8BCD;&#x5B9E;&#x73B0;&#x6B63;&#x786E;&#x5206;&#x8BCD;
jieba.del_word('&#x4E2D;&#x51FA;') # &#x5220;&#x9664;jieba&#x81EA;&#x5E26;&#x7684;&#x8BCD;&#xFF08;&#x4E0D;&#x540C;&#x4E8E;&#x53BB;&#x505C;&#x7528;&#x8BCD;&#xFF0C;&#x4E0D;&#x662F;&#x5220;&#x9664;&#x8BCD;&#xFF0C;&#x800C;&#x662F;&#x91CD;&#x65B0;&#x5206;&#x8BCD;&#xFF09;
jieba.lcut(a2)

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 增加jieba的词

增加jieba的词,和自定义词典相比它可以动态增加词

&#x589E;&#x52A0;jieba&#x7684;&#x8BCD;
jieba.add_word('&#x51FA;&#x4E86;')
jieba.lcut(a2)

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 恢复原状
&#x6062;&#x590D;&#x539F;&#x72B6;
jieba.add_word('&#x4E2D;&#x51FA;')
jieba.del_word('&#x51FA;&#x4E86;')
jieba.lcut(a2)

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 调节词的词频
&#x8C03;&#x8282;&#x8BCD;&#x7684;&#x8BCD;&#x9891;&#xFF0C;&#x4F7F;&#x5176;&#x80FD;&#xFF08;&#x6216;&#x4E0D;&#x80FD;&#xFF09;&#x88AB;&#x5206;&#x51FA;
tune=True:&#x6267;&#x884C;&#x8BCD;&#x9891;&#x8C03;&#x6574;&#xFF0C;&#x9ED8;&#x8BA4;False&#x4E0D;&#x6267;&#x884C;
jieba.suggest_freq(('&#x4E2D;','&#x51FA;'),tune=True)
jieba.lcut(a2)

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
调整的词以字符串形式输入
&#x8C03;&#x6574;&#x7684;&#x8BCD;&#x4EE5;&#x5B57;&#x7B26;&#x4E32;&#x5F62;&#x5F0F;&#x8F93;&#x5165;
jieba.suggest_freq('&#x4E00;&#x4E2A;&#x53DB;&#x5F92;',tune=True)
jieba.lcut(a2)

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
恢复jieba到原始状态
&#x6062;&#x590D;jieba&#x5230;&#x539F;&#x59CB;&#x72B6;&#x6001;
jieba.suggest_freq(('&#x4E2D;&#x51FA;'),tune=True)
jieba.suggest_freq(('&#x4E00;&#x4E2A;','&#x53DB;&#x5F92;'),tune=True)
jieba.lcut(a2)

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战

5 去停用词

  • 与上面相反,当一个字符串不是词,jieba误将其分为词,或者我们不想将某些不重要的词分出来(想删掉某些分出的词)可以自定义停用词词典
  • 停用词就是要从分词结果删掉的垃圾无用词
  • 词典中的词不会出现在分词结果中
  • 停用词词典的内容可以根据项目不断增加

原始代码

&#x53BB;&#x505C;&#x7528;&#x8BCD;
a = '&#x54CE;&#xFF0C;&#x9E45;&#xFF0C;&#x542C;&#x8BF4;&#x4F60;&#x8D85;&#x7EA7;&#x559C;&#x6B22;&#x5C0F;&#x6E38;&#x620F;&#x7684;&#xFF01;&#x4F60;&#x662F;&#x5417;&#xFF1F;'
a

普通分词

b = jieba.lcut(a)
b

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 去停用词功能jieba不带,需自行实现。下面是实现

先载入停用词

&#x8F7D;&#x5165;&#x505C;&#x7528;&#x8BCD;
&#x65B9;&#x6CD5;1&#xFF1A;&#x624B;&#x5DE5;&#x6784;&#x9020;&#x505C;&#x7528;&#x8BCD;&#x5217;&#x8868;
stopword = ['&#x54CE;','&#x7684;','&#x662F;','&#x4F60;','&#x5417;','&#xFF01;','&#xFF0C;', '&#xFF1F;']

&#x65B9;&#x5F0F;2&#xFF1A;&#x8F7D;&#x5165;&#x505C;&#x7528;&#x8BCD;&#x6587;&#x4EF6;
with open(r'data\stopword.txt','r',encoding='utf-8') as f:
#     print(f.read())
    s = f.read()

stopword = s.split('\n') # &#x4F1A;&#x7528;&#x8F6C;&#x8BD1;&#x5B57;&#x7B26;'\\u3000','\\n'&#x51FA;&#x73B0;&#xFF0C;&#x9700;&#x8981;&#x5220;&#x9664;

&#x65B9;&#x5F0F;2&#x63D0;&#x5347;&#xFF0C;&#x82E5;&#x505C;&#x7528;&#x8BCD;&#x8868;&#x7684;&#x7279;&#x6B8A;&#x8BCD;&#x8F7D;&#x5165;&#x65F6;&#x88AB;&#x81EA;&#x52A8;&#x8F6C;&#x4E49;&#xFF0C;&#x53EF;&#x4EE5;&#x5224;&#x65AD;&#x5E76;&#x6062;&#x590D;
stopword = []
with open(r'data\stopword.txt','r',encoding='utf-8') as f:
    for line in f.readlines():
        l = line.strip()
        if l == '\\u3000':
            l = '\u3000'
        if l == '\\n':
            l = '\n'

        stopword.append(l)

stopword

特殊字符恢复成功

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 去停用词,第一步,求差集
&#x53BB;&#x505C;&#x7528;&#x8BCD;,&#x7B2C;&#x4E00;&#x6B65;&#xFF0C;&#x6C42;&#x5DEE;&#x96C6;
x = np.array(b)
x

y = np.array(stopword)
y

&#x76EE;&#x7684;&#xFF1A;&#x5C06;&#x5206;&#x8BCD;&#x6570;&#x7EC4;&#x5185;&#x505C;&#x7528;&#x8BCD;&#x6570;&#x7EC4;&#x6709;&#x7684;&#x503C;&#x5220;&#x9664;
np.in1d(x,y)

z = x[~np.in1d(x,y)] #&#x53CD;&#x8FD0;&#x7B97; &#x52A0;&#x201C;~&#x201D;
z

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 第二步:去掉1个字以下的词
&#x7B2C;&#x4E8C;&#x6B65;&#xFF1A;&#x53BB;&#x6389;1&#x4E2A;&#x5B57;&#x4EE5;&#x4E0B;&#x7684;&#x8BCD;
k = []

&#x904D;&#x5386;&#x5199;&#x6CD5;
for i in z:
#     print(len(i))  #&#x67E5;&#x770B;&#x5404;&#x4E2A;&#x8BCD;&#x7EC4;&#x7684;&#x5B57;&#x6570;
    if len(i) > 1:
        k.append(i)

&#x5217;&#x8868;&#x751F;&#x6210;&#x5F0F;&#x5199;&#x6CD5;
k = [i for i in z if len(i) > 1]
k

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战

5.2 精确分词和模糊分词

python使用jieba实现中文分词去停用词方法示例

1 精确模式,试图将句子最精确地切开,适合文本分析;

2 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;

3 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

seg_list1 = jieba.cut("&#x6211;&#x53BB;&#x8FC7;&#x6E05;&#x534E;&#x5927;&#x5B66;&#x548C;&#x5317;&#x4EAC;&#x5927;&#x5B66;&#x3002;")

seg_list2 = jieba.cut("&#x6211;&#x53BB;&#x8FC7;&#x6E05;&#x534E;&#x5927;&#x5B66;&#x548C;&#x5317;&#x4EAC;&#x5927;&#x5B66;&#x3002;", cut_all=True)

seg_list3 = jieba.cut_for_search("&#x6211;&#x53BB;&#x8FC7;&#x6E05;&#x534E;&#x5927;&#x5B66;&#x548C;&#x5317;&#x4EAC;&#x5927;&#x5B66;&#x3002;")

输出的值由于是cut方法,需要列表化输出

list(seg_list1),list(seg_list2),list(seg_list3)

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战

6 抽取文档关键词

抽取文档关键词用于在一篇文章中获取其核心内容(描述了什么?),又叫 生成摘要、打标签、关键词提取等

6.1 词频统计(词频分析)

  • 词在文本中出现的次数(频次),某种程度上能当做文本的标签,表示文本内容
  • 不是很精准
  • 统计前最好先去完成自定义词典和去停用词的前期操作

源数据

&#x8BCD;&#x9891;&#x7EDF;&#x8BA1;&#xFF08;&#x8BCD;&#x9891;&#x5206;&#x6790;&#xFF09;
a = '&#x54CE;&#xFF0C;&#x9E45;&#xFF0C;&#x542C;&#x8BF4;&#x4F60;&#x8D85;&#x7EA7;&#x559C;&#x6B22;&#x5C0F;&#x6E38;&#x620F;&#x7684;&#xFF01;&#x4F60;&#x662F;&#x5417;&#xFF1F;&#x54CE;&#xFF0C;&#x9E45;'

&#x7565;&#x8FC7;&#x81EA;&#x5B9A;&#x4E49;&#x8BCD;&#x5178;&#x3001;&#x53BB;&#x505C;&#x7528;&#x8BCD;
x = jieba.lcut(a)
x

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 方法1 : 转换为Series结构
#&#x65B9;&#x6CD5;1

pd.Series(x).value_counts()

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 方法2:转换成DataFrame结构
#&#x65B9;&#x6CD5;2

pd.DataFrame(x)
pd.DataFrame(x).value_counts() # &#x65B9;&#x6CD5;2.1
pd.DataFrame(x).groupby(0).size().sort_values(ascending=False)

6.2 案例:分析Python互联网招聘信息中的需求关键字

载入文本数据

&#x6848;&#x4F8B;&#xFF1A;&#x5206;&#x6790;Python&#x4E92;&#x8054;&#x7F51;&#x62DB;&#x8058;&#x4FE1;&#x606F;&#x4E2D;&#x7684;&#x9700;&#x6C42;&#x5173;&#x952E;&#x5B57;

&#x8F7D;&#x5165;&#x6587;&#x672C;&#x6570;&#x636E;
with open(r'data\work.txt','r',encoding='utf-8') as f:
    txt = f.read()

print(txt)

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战

6.2.1 方式1:使用词频方式提取关键词

  • 按3,4,5步骤走一遍
&#x65B9;&#x5F0F;1&#xFF1A;&#x4F7F;&#x7528;&#x8BCD;&#x9891;&#x65B9;&#x5F0F;&#x63D0;&#x53D6;&#x5173;&#x952E;&#x8BCD;

1 &#x81EA;&#x5B9A;&#x4E49;&#x8BCD;&#x5178;
jieba.load_userdict(r'data\custom.txt')

2 &#x5206;&#x8BCD;
w = jieba.lcut(txt)
w

3 &#x53BB;&#x505C;&#x7528;&#x8BCD;
&#x8F7D;&#x5165;&#x505C;&#x7528;&#x8BCD;&#x8868;
stopword = []
with open(r'data\stopword.txt','r',encoding='utf-8') as f:
    for line in f.readlines():
        l = line.strip()
        if l == '\\u3000':
            l = '\u3000'
        if l == '\\n':
            l = '\n'

        stopword.append(l)

4 &#x53BB;&#x505C;&#x7528;&#x8BCD;
&#x7B2C;&#x4E00;&#x6B65;&#xFF0C;&#x6C42;&#x5DEE;&#x96C6;
x = np.array(w)
y = np.array(stopword)
z = x[~np.in1d(x,y)] # &#x53CD;&#x5411;&#x6C42;&#x5DEE;

&#x7B2C;&#x4E8C;&#x6B65;&#xFF0C;&#x53BB;&#x6389;1&#x4E2A;&#x5B57;&#x4EE5;&#x4E0B;&#x7684;&#x8BCD;
k = [i for i in z if len(i) > 1]

k

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 统计词频
&#x8BA1;&#x7B97;&#x8BCD;&#x9891;&#x5E76;&#x6392;&#x5E8F;

result = pd.Series(k).value_counts()[:20]
result

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 保存结果
&#x4FDD;&#x5B58;&#x7ED3;&#x679C;
result.to_csv(r'temp\20211022keyword.csv',header=0)

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 局限性:统计词频作为文档关键字的准确性不高,还可使用下面的方式

TF-IDF算法 Text-Rank算法 注:TF-IDF和Text-Rank算法运行都不需要手动去停用词,可以用内置函数自动去停用词

6.2.2 方式2:使用TF-IDF权重算法提取关键词(注重信息量)

TF-IDF权重:

&#x8BCD;&#x9891;&#x548C;&#x91CD;&#x8981;&#x8BCD;&#x7684;&#x7EFC;&#x5408;&#x5206;&#x6570;(&#x6743;&#x91CD;)

&#x91CD;&#x8981;&#x8BCD;&#xFF1A;&#x4FE1;&#x606F;&#x91CF;&#x5927;&#x7684;&#x8BCD;
  • 一个词信息量大小的衡量

在本文章出现的次数多,在通用文档库出现的次数少,就是重要词

&#x5982;&#xFF1A;&#x4F60;&#x6211;&#x4ED6;&#xFF0C;&#x4F60;&#x597D;&#x518D;&#x89C1; &#x8FD9;&#x4E9B;&#x8BCD;&#x4FE1;&#x606F;&#x91CF;&#x5F88;&#x5C0F;
&#x884C;&#x4E1A;&#x4E13;&#x6709;&#x540D;&#x8BCD;&#xFF0C;&#x5982;Python/MySQL&#xFF0C;&#x4FE1;&#x606F;&#x91CF;&#x5C31;&#x5F88;&#x5927;
  • 首先,应用自定义词典
  • 然后,去除停用词,系统自带,给抽取关键字用
&#x4F7F;&#x7528;TF-IDF&#x6743;&#x91CD;&#x7B97;&#x6CD5;&#x63D0;&#x53D6;&#x5173;&#x952E;&#x8BCD;

jieba.load_userdict('data\custom.txt')  # &#x5E94;&#x7528;&#x81EA;&#x5B9A;&#x4E49;&#x8BCD;&#x5178;
jieba.analyse.set_stop_words('data\stopword.txt')  # &#x62BD;&#x53D6;&#x5173;&#x952E;&#x8BCD;&#x524D;&#x53BB;&#x6389;&#x81EA;&#x5B9A;&#x4E49;&#x505C;&#x7528;&#x8BCD;

txt

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
-不需要手动分词,方法会自动分词后抽取关键字
&#x4E0D;&#x9700;&#x8981;&#x624B;&#x52A8;&#x5206;&#x8BCD;&#xFF0C;&#x65B9;&#x6CD5;&#x4F1A;&#x81EA;&#x52A8;&#x5206;&#x8BCD;&#x540E;&#x62BD;&#x53D6;&#x5173;&#x952E;&#x5B57;
jieba.analyse.extract_tags(txt)

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 查看详细参数
&#x8BE6;&#x7EC6;&#x53C2;&#x6570;&#xFF1A;

&#x5B57;&#x7B26;&#x4E32;
&#x8FD4;&#x56DE;&#x591A;&#x5C11;&#x5173;&#x952E;&#x8BCD;&#xFF0C;&#x9ED8;&#x8BA4;20&#x4E2A;
&#x662F;&#x5426;&#x8FD4;&#x56DE;TF-IDF&#x6743;&#x91CD;
allowPOS=(),&#x4EC0;&#x4E48;&#x8BCD;&#x6027;&#x53EF;&#x4EE5;&#x505A;&#x62BD;&#x53D6;&#xFF0C;&#x9ED8;&#x8BA4;&#x6240;&#x6709;&#x8BCD;
k = jieba.analyse.extract_tags(txt,topK=30,withWeight=True)
k

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战

6.2.3 方式3:Text-Rank算法(注重文本)

  • 词性标注
&#x9644;&#xFF1A;&#x8BCD;&#x6027;&#x6807;&#x6CE8;

a
list(jieba.posseg.cut(a))

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
&#x65B9;&#x5F0F;3&#xFF1A;Text-Rank&#x7B97;&#x6CD5;&#xFF08;&#x6CE8;&#x91CD;&#x6587;&#x672C;&#xFF09;

&#x6587;&#x672C;
&#x663E;&#x793A;&#x591A;&#x5C11;&#x8BCD;
&#x662F;&#x5426;&#x8FD4;&#x56DE;&#x5173;&#x952E;&#x5B57;&#x6743;&#x91CD;
allowPOS=(),&#x4EC0;&#x4E48;&#x8BCD;&#x6027;&#x53EF;&#x4EE5;&#x505A;&#x62BD;&#x53D6;&#xFF0C;&#x9ED8;&#x8BA4;&#x6240;&#x6709;&#x8BCD;

t = jieba.analyse.textrank(txt,topK=20,withWeight=True,allowPOS=('ns', 'n', 'vn', 'v'))
t

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战

7 词云-WordCloud

安装 WordCloud库

如系统未安装C++编译库,WordCloud库需要下载whl再使用pip安装
http://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud
命令行本地安装:pip install e:/wordcloud‑1.8.0‑cp37‑cp37m‑win_amd64.whl

7.1 案例:为《大话西游》台词节选绘制词云

需要用的库

import numpy as np
import matplotlib.pyplot as plt

import jieba
from wordcloud import WordCloud
from PIL import Image
  • 数据载入、分词并转化成文本
  • 注意:不用print输出会看见换行符”\n”,例如这样
with open(r'data\&#x5927;&#x8BDD;&#x897F;&#x6E38;.txt','r',encoding='utf-8') as f:
    txt = f.read()

print(txt)  # &#x4E0D;&#x7528;print&#x8F93;&#x51FA;&#x4F1A;&#x770B;&#x89C1;&#x6362;&#x884C;&#x7B26;&#x201C;\n&#x201D;
txt

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
比较稳妥的写法:
 &#x6848;&#x4F8B;&#xFF1A;&#x4E3A;&#x300A;&#x5927;&#x8BDD;&#x897F;&#x6E38;&#x300B;&#x53F0;&#x8BCD;&#x8282;&#x9009;&#x7ED8;&#x5236;&#x8BCD;&#x4E91;

&#x6570;&#x636E;&#x8F7D;&#x5165;
with open(r'data\&#x5927;&#x8BDD;&#x897F;&#x6E38;.txt','r',encoding='utf-8') as f:
    txt = f.read()

print(txt)  # &#x4E0D;&#x7528;print&#x8F93;&#x51FA;&#x4F1A;&#x770B;&#x89C1;&#x6362;&#x884C;&#x7B26;&#x201C;\n&#x201D;
txt2 = ' '.join(jieba.cut(txt))
print(txt2)

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 载入停用词
&#x505C;&#x7528;&#x8BCD;

&#x65B9;&#x5F0F;2&#xFF1A;&#x8F7D;&#x5165;&#x505C;&#x7528;&#x8BCD;&#x6587;&#x4EF6;
with open(r'data\stopword.txt','r',encoding='utf-8') as f:
    print(f.read())
    s = f.read()

stopword = s.split('\n') # &#x4F1A;&#x7528;&#x8F6C;&#x8BD1;&#x5B57;&#x7B26;'\\u3000','\\n'&#x51FA;&#x73B0;&#xFF0C;&#x9700;&#x8981;&#x5220;&#x9664;

stopword

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 基本版词云
wordcloud = WordCloud(font_path=r'data\font\arial unicode ms.ttf').generate(txt2)
wordcloud

&#x663E;&#x793A;
plt.figure(figsize=(18,10))
plt.imshow(wordcloud)

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 词云优化
&#x8BCD;&#x4E91;&#x4F18;&#x5316;

wordcloud = WordCloud(
    font_path="data/font/xjlFont.fon",  # &#x5B57;&#x4F53;&#xFF0C;&#x4E0D;&#x8BBE;&#x7F6E;&#x5219;&#x6C49;&#x5B57;&#x4E71;&#x7801;
    background_color='white',# &#x8BBE;&#x7F6E;&#x80CC;&#x666F;&#x989C;&#x8272;
    max_words=80, # &#x8BBE;&#x7F6E;&#x6700;&#x5927;&#x73B0;&#x663E;&#x793A;&#x8BCD;&#x6570;
    max_font_size=80, # font_size&#x53EF;&#x9009;
    stopwords=stopword,  # &#x53BB;&#x505C;&#x7528;&#x8BCD;
).generate(txt2)
wordcloud

plt.figure(figsize=(18,10),dpi=72)
plt.imshow(wordcloud) # &#x7ED8;&#x5236;&#x6570;&#x636E;&#x5185;&#x7684;&#x56FE;&#x7247;,&#x53CC;&#x7EBF;&#x6027;&#x63D2;&#x503C;&#x7ED8;&#x56FE; interpolation='bilinear'
plt.axis("off") # &#x53BB;&#x6389;&#x5750;&#x6807;&#x8F74;

plt.savefig(r'temp\20211022test3.png',dpi=300,bbox_inches='tight')

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战

7.2 自定义背景的词云图

使用的背景

&#x81EA;&#x5B9A;&#x4E49;&#x80CC;&#x666F;&#x7684;&#x8BCD;&#x4E91;&#x56FE;
alice_mask = np.array(Image.open('data/timg.jpg'))
plt.imshow(alice_mask)

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 插入背景
&#x8BCD;&#x4E91;&#x4F18;&#x5316;

wordcloud = WordCloud(
    font_path="data/font/xjlFont.fon",  # &#x5B57;&#x4F53;&#xFF0C;&#x4E0D;&#x8BBE;&#x7F6E;&#x5219;&#x6C49;&#x5B57;&#x4E71;&#x7801;
    background_color='white',# &#x8BBE;&#x7F6E;&#x80CC;&#x666F;&#x989C;&#x8272;
    max_words=80, # &#x8BBE;&#x7F6E;&#x6700;&#x5927;&#x73B0;&#x663E;&#x793A;&#x8BCD;&#x6570;
    max_font_size=80, # font_size&#x53EF;&#x9009;
    stopwords=stopword,  # &#x53BB;&#x505C;&#x7528;&#x8BCD;
    mask=alice_mask #&#x8BBE;&#x7F6E;&#x80CC;&#x666F;&#x56FE;&#x7247;
).generate(txt2)
wordcloud

plt.figure(figsize=(18,10),dpi=72)
plt.imshow(wordcloud) # &#x7ED8;&#x5236;&#x6570;&#x636E;&#x5185;&#x7684;&#x56FE;&#x7247;,&#x53CC;&#x7EBF;&#x6027;&#x63D2;&#x503C;&#x7ED8;&#x56FE; interpolation='bilinear'
plt.axis("off") # &#x53BB;&#x6389;&#x5750;&#x6807;&#x8F74;

plt.savefig(r'temp\20211022test3.png',dpi=300,bbox_inches='tight') # &#x4FDD;&#x5B58;&#x4E3A;&#xFF1A;&#x5E26;&#x6709;&#x6700;&#x5C0F;&#x767D;&#x8FB9;&#x4E14;&#x5206;&#x8FA8;&#x7387;&#x4E3A;300DPI&#x7684;PNG&#x56FE;&#x7247;

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战

8 实战之分析产品:手游《旅行青蛙》的网络推广策略

8.1 思路

  • 根据百度指数热门程度判断游戏流行时间和流行度
  • 数据获取:抓取百度新闻 旅行青蛙 (按标题或内容查询)关键字的文字标题和相关信息

8.2 资源

  • 百度指数:http://index.baidu.com/
  • 百度新闻:http://news.baidu.com/

8.3 推荐使用技术

  • 数据获取
  • 爬虫:抓取内容,百度新闻
    • 标题
    • 来源
    • 时间,精确到日
  • 数据清洗:先抓取数据保存,然后再进行清洗
    • 字符串清理规整建议使用Python原生字符串处理函数实现
    • 例如:join(),replace(),split(),remove(),append()等等
  • 非结构化数据分析
  • 分词
  • 词云
  • 结构化数据分析
  • Pandas数据预处理和数据分析
    • 分组聚合
    • 可视化

8.4 实操之数据预处理

导入可能需要的库

import time
import json

import requests
from lxml import etree

import numpy as np
import pandas as pd

from bs4 import BeautifulSoup

8.4.1 百度指数 数据手动录入后生成表格

  • 在百度指数中输入关键词,卡特定的时间,手动输入数据
  • 生产dataframe结构
&#x767E;&#x5EA6;&#x6307;&#x6570; &#x6570;&#x636E;&#x624B;&#x52A8;&#x5F55;&#x5165;&#x540E;&#x751F;&#x6210;&#x8868;&#x683C;

baidu = [5408,10007,17817,39514,82117,140768,298637,406072,677541,858690,839792,744390,653541,496701,390412,322492,256334,212914,180933,157411,140104,120038,125914,105679,88426,75185,66567,61036,54812,49241,42768,35784,33774,33621,34388]
len(baidu) # 35

date = pd.date_range('2018-1-15','2018-2-18')
date.shape # 35

baidu2 = pd.DataFrame(baidu,index=date,columns=['baidu_index'])
baidu2.head()

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 保存数据
&#x4FDD;&#x5B58;&#x6570;&#x636E;

baidu2.to_csv(r'data2/baidu_index.csv')

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 读取数据
&#x8BFB;&#x53D6;&#x6570;&#x636E;

parse_dates&#x53C2;&#x6570;&#x4F5C;&#x7528;:&#x5C06;csv&#x4E2D;&#x7684;&#x65F6;&#x95F4;&#x5B57;&#x7B26;&#x4E32;&#x8F6C;&#x6362;&#x6210;&#x65E5;&#x671F;&#x683C;&#x5F0F;
baidu = pd.read_csv(r'data2/baidu_index.csv',parse_dates=['Unnamed: 0']).set_index('Unnamed: 0')
baidu

&#x5C06;&#x539F;&#x6709;&#x7684;&#x7D22;&#x5F15;&#x540D;&#x201C;Unnamed: 0&#x201D;&#x6362;&#x503C;
baidu.index.name = 'date'

&#x67E5;&#x770B;&#x524D;5&#x884C;&#x548C;&#x540E;5&#x884C;&#x6570;&#x636E;
baidu.head().append(baidu.tail())

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 检查数据类型
&#x68C0;&#x67E5;&#x6570;&#x636E;&#x7C7B;&#x578B;

&#x539F;&#x6765;&#x7B2C;&#x4E00;&#x5217;&#x65E5;&#x671F;&#x53D8;&#x6210;&#x4E86;&#x7D22;&#x5F15;&#x5217;&#xFF0C;&#x53EA;&#x5269;&#x4E00;&#x884C;
baidu.info()

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
baidu.describe()

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战

8.4.2 百度新闻 内容数据抓取

  • 具体实施:
  • 根据百度指数热门程度直观分析,抓取百度新闻 旅行青蛙 (按时间排序,媒体网站)关键字的文字标题和相关信息,
    时间从 2018-1-15到2018-2-18日
  • 目前是(临时使用):新闻页码1-11,每页10条,一共11页(页码pn参数值为0-100)
  • 随着时间变化,新闻增加,抓取页码也应该跟着变化
&#x8D77;&#x59CB;&#x9875;&#xFF1A;https://www.baidu.com/s?wd=%E6%97%85%E8%A1%8C%E9%9D%92%E8%9B%99&pn=0&oq=%E6%97%85%E8%A1%8C%E9%9D%92%E8%9B%99&tn=baiduhome_pg&ie=utf-8&rsv_idx=2&rsv_pq=97f74ecb000e439a&rsv_t=203awND%2FceKGrqADsjLbpJsi0pW3tFrpcVUE23%2FtFWcPLT5Vnz80grVRZHTmbfvED9KL&gpc=stf%3D1515945600%2C1518883200%7Cstftype%3D2&tfflag=1

&#x7EC8;&#x6B62;&#x9875;&#xFF1A;https://www.baidu.com/s?wd=%E6%97%85%E8%A1%8C%E9%9D%92%E8%9B%99&pn=100&oq=%E6%97%85%E8%A1%8C%E9%9D%92%E8%9B%99&tn=baiduhome_pg&ie=utf-8&rsv_idx=2&rsv_pq=be7a7ece000eb2a4&rsv_t=cd1cpTDUXK0oMiSFOSxFIcW08CH2acCb6aTII9RykE452zK8WubRYR059Czcuc1Zulyw&gpc=stf%3D1515945600%2C1518883200%7Cstftype%3D2&tfflag=1

测试一下目标网址页数和pn值的关系是否对应

%%time
&#x6D4B;&#x8BD5;

page = 1
url_page = (page-1) * 10
while page <= 11: print('url参数:',url_page,'页数:',page) url_page +="10" page time.sleep(0.2) < code></=>

是有一定数量关系的

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 锁定目标抓取数据

需要注意的小问题

  1. 抓取的数据本身如果有空格,在编译的时候会输出字符\xa0 ,使用join和split的组合方法去掉
''.join(i.get_text().split())
split&#x65B9;&#x6CD5;&#x8F93;&#x51FA;&#x7684;&#x662F;&#x5217;&#x8868;
join&#x65B9;&#x6CD5;&#x8F93;&#x51FA;&#x7684;&#x662F;&#x5B57;&#x7B26;&#x4E32;&#xFF0C;&#x521A;&#x597D;&#x914D;&#x5408;&#x8D77;&#x6765;

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
想要的输出的结果:
python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  1. 使用过beautifulsoup模块下的select方法会输出特定标签下的所用文本

例如该标签下的所有文本中,仍然有标签,而且标签内还有文本,也会一个输出

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
输出的效果:时间和摘要连在了一起
python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  1. select方法会输出特定标签下的所用文本,而且输出的是 列表值,如果要对select后找到的标签继续查找,可以将”这个列表”的元素抽出来继续查找

例如:
在列表后面命令输出第0个值

source = i.select('div[class="f13 c-gap-top-xsmall se_st_footer user-avatar"]')[0].select('a')[0].get_text()

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  1. 有时候匹配找到的标签下面没有值,但代码依然是命令赋值给对象,但原本就已经找不到,还赋值的话就会报错,如:
IndexError: list index out of range

解决方法是增加try except语句,如果报错就添加特定字符,如:

        try:
            date = i.select('.c-abstract')
            dict['date'].append(''.join(date[0].get_text().split()))
        except:

            print('空值')
            dict['date'].append(''.join('青蛙'))
  • 抓取数据写法1(不建议):将所有特定标签找出来,放在对应的列表,但可能会出现标签与标签之间数据量不一样的情况,如:
    python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
    *由于方法存在缺陷,有些值并没有抓取。。。。。 这里仅展示部分完成的代码
%%time
&#x6570;&#x636E;&#x6293;&#x53D6;

data_list = [] # &#x521B;&#x5EFA;&#x7A7A;&#x5217;&#x8868;&#x50A8;&#x5B58;&#x6570;&#x636E;

&#x8BF7;&#x6C42;&#x5934;
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
}

&#x6309;&#x65F6;&#x95F4;&#x987A;&#x5E8F;&#x6293;&#x53D6;&#xFF0C;&#x9875;&#x7801;1-11&#x7684;pn&#x503C;&#x4E3A;0-100
page = 1
url_page = (page-1) * 10
while page <= 1 2 3 1: print('url参数:',url_page,'页数:',page) # 创建空字典存储得到的数据,并将该列表添加进空列表c dict="{'page':page,'title':None,'source':None,'date':None,'url':None}" print(dict) 写法1 网址 url="https://www.baidu.com/s?wd=%E6%97%85%E8%A1%8C%E9%9D%92%E8%9B%99&pn={}&oq=%E6%97%85%E8%A1%8C%E9%9D%92%E8%9B%99&tn=baiduhome_pg&ie=utf-8&rsv_idx=2&rsv_pq=97f74ecb000e439a&rsv_t=203awND%2FceKGrqADsjLbpJsi0pW3tFrpcVUE23%2FtFWcPLT5Vnz80grVRZHTmbfvED9KL&gpc=stf%3D1515945600%2C1518883200%7Cstftype%3D2&tfflag=1" .format(url_page) 得到响应并解码 res="requests.get(url,headers=headers).content.decode()" print(res) 转类型 soup="BeautifulSoup(res,'lxml')" print(soup) 匹配 匹配标题 title="soup.select('.t')" print(len(title)) dict['title']="[i.get_text()" for i in title] 添加进字典 print('标题个数:',len(dict['title'])) 匹配摘要 date="soup.select('.c-abstract')" print(len(date)) print(date) 摘要部分包含了时间,但时间后面带了一个空格, 在编译的时候会输出字符\xa0 ,使用join和split的组合方法去掉 dict['date']="[''.join(i.get_text().split())" date] print(dict['date']) print('摘要个数:',len(dict['date'])) 匹配时间 t="soup.select('span[class="newTimeFactor_before_abs" c-color-gray2 m"]') print(t) dict['time']="[''.join(i.get_text().split())" t] print(dict['time']) print('时间个数:',len(dict['time'])) print('第{}页'.format(str(page))) print('="==========================')" url_page +="10" page time.sleep(0.2) 由于方法存在缺陷,有些值并没有抓取。。。。。 < code></=>

得到的数据其实并不相等,而且随着页数的增加,更难去手动添加,对于这个问题,推荐使用 方法2

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 爬取方法2(推荐):匹配每一个文章块标签(包含了每个部分想找的东西的标签),同时创建的空字典中, 如果键值为空,先赋值一个空列表,如:
dict = {'page':page,'title':[],'source':[],'date':[],'time':[]}

完整代码为:

%%time
数据抓取

data_list = [] # 创建空列表储存数据

请求头
headers = {
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.81 Safari/537.36'
}

按时间顺序抓取,页码1-11的pn值为0-100
page = 1
url_page = (page-1) * 10
while page  11:
    print('url参数:',url_page,'页数:',page)
    创建空字典存储得到的数据,并将该列表添加进空列表c
    dict = {'page':page,'title':[],'source':[],'date':[],'time':[]}
    print(dict)

    写法2
============================================
    网址
    url = 'https://www.baidu.com/s?wd=%E6%97%85%E8%A1%8C%E9%9D%92%E8%9B%99&pn={}&oq=%E6%97%85%E8%A1%8C%E9%9D%92%E8%9B%99&tn=baiduhome_pg&ie=utf-8&rsv_idx=2&rsv_pq=97f74ecb000e439a&rsv_t=203awND%2FceKGrqADsjLbpJsi0pW3tFrpcVUE23%2FtFWcPLT5Vnz80grVRZHTmbfvED9KL&gpc=stf%3D1515945600%2C1518883200%7Cstftype%3D2&tfflag=1'.format(url_page)
    得到响应并解码
    res = requests.get(url,headers=headers).content.decode()
    print(res)
    转类型
    soup = BeautifulSoup(res,'lxml')
    print(soup)

    匹配
    匹配文章块标签(包含了每个部分想找的东西的标签)
    news = soup.select('div[class="result c-container new-pmd"]')
    print(news)
    遍历匹配所需内容
    count = 0
    for i in news:

    #     1 匹配标题
    使用select方法得到的数据是列表,必须将其中的值提出来才可以使用get_text()方法提取文本
        title = i.select('.t')[0]
        print(title)
        print(title.get_text())
    #     添加进字典

    #     如果字典的对应键设定是空值(none值),没有设定是空列表,
    直接使用append方法添加元素对会报错
    因为append方法无法对none值进行增添
    可以用if判断,判断是否是none值,如果是就加上一个空列表,也可以直接将原字典中的键值改成是空列表
        dict['title'].append(title.get_text())
        print(len(dict['title']))

    #     2 匹配摘要
        摘要值因为同一标签值的原因没有找到,直接赋值会报错,因为代码根本没有找到标签,并不用说提取得到数据的列表元素
        需要增加try except语句,如果报错就添加特定字符
        try:
            date = i.select('.c-abstract')
            dict['date'].append(''.join(date[0].get_text().split()))
        except:

            print('空值')
            dict['date'].append(''.join('青蛙'))
        print(date)
        print(dict['date'])
        print(len(dict['date']))

    #     3 匹配时间
        try:
            t = i.select('span[class="newTimeFactor_before_abs c-color-gray2 m"]')
            dict['time'].append(''.join(t[0].get_text().split()))
        except:
            print('时间空值')
            dict['time'].append(''.join('时间'))
        print(dict['time'])

        4 匹配出处
        try:
            source = i.select('div[class="f13 c-gap-top-xsmall se_st_footer user-avatar"]')[0].select('a')[0].get_text()
            dict['source'].append(''.join(source.split()))
        except:
            print('来源空值')
            dict['source'].append(''.join('其他网站'))
        print(len(source))
        print(dict['source'])

    查看每一列的长度
    print(len(dict['title']),len(dict['date']),len(dict['time']),len(dict['source']))
    print('第{}页'.format(str(page)))
    print(dict)

    print('===========================')
    print('===========================')

    url_page += 10
    page += 1
    time.sleep(0.2)

    把字典加入列表中
    data_list.append(dict)

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
爬取成功,而且没有遗漏的值,查看一下此时的列表
data_list,len(data_list)

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
列表或字典转为字符串并保存为json文本

json.dumps(data_list)

with open(r'data2\baidu_news.csv','w',encoding='utf-8') as f:
    f.write(json.dumps(data_list))

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 读取JSON数据并转为列表或字典
读取JSON数据并转为列表或字典

with open(r'data2\baidu_news.csv','r',encoding='utf-8') as f:
    j = json.load(f)

j

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 数据抓取完成

8.4.3 数据规整(基本规整)

将获取数据清理干净

  • 基本规整:字符串类数据清洗,操作繁杂,建议使用原生Python来处理
  • 详细规整:DataFrame数据集中重构使其适合分析
此处为旧版网站的数据规整方式,由于网站改版已经失效,留作备份
'''
1: 标题字符串规整

j
j[0]
j[0]['title']
j[0]['title'][0], j[0]['title'][1], j[0]['title'][2]

_ = []

for i in j:
    print(i)
    print(i['title'])
    # 将10个1组的列表转为一个大标题列表
    _ += ','.join(i['title']).replace(',', '').split('\n')  # 列表合为字符串,去除逗号,换行符重新切为列表

print(_)

type(_), len(_)

进一步清理
title = []

for i in _:
    i2 = i.strip()  # 删除字符串前后空值
    if i2 != '':  # 去除空列表值
        title.append(i2)

title

len(title)

2:来源和时间字符串规整

j[0]
j[0]['content']
j[0]['content'][1]

来源和时间字符串规整,放入列表content
content = []

for i in j:
    for i2 in i['content']:
        # 过滤和替换掉相应字符,字符串转列表,二维
        i3 = i2.replace('\xa0', ' ').replace('\t', '').replace('\n', '').replace('年', '-').replace('月', '-').replace('日', '').split(' ')  # 去除各种空值,转为列表
        print(i3)

        # 删除列表空值
        while '' in i3:
            i3.remove('')

        if len(i3):  # 判断列表值是否整体为空
            content.append(i3)

        # 去掉 两种 列表,只存储 来源、日期、时间三种数据
        # 数据变化,没用了
        if i3 != ['查看更多相关新闻>>'] and i3 != []:
            content.append(i3)

content

len(content)

3:将将标题和内容列表值合并入列表c,内层字典存储相关数据
c = []

if len(title) == len(content):  # 俩列表长度相同否则退出
    for i in range(len(title)):  # 遍历值
        # 合并两个列表
        print(title[i], content[i])
        if len(content[i]) == 3:  # 判断content内是否有缺失值
            c.append({
                    'id': i + 1,
                    'title': title[i],  # 标题
                    'source': content[i][0],  # 来源
                    'date': content[i][1],  # 日期
                    'time': content[i][2],  # 时间
            })
        else:
            print(i, '注意:来源列表长度不是3个值,不会写入数据中!')

else:  # 长度不一致,错误
    print('标题和来源列表长度不一致,错误!')
    # 如出现错误可能是抓取问题,可以重新抓取数据后再测试

c
len(c)
'''

将一部分数据拿出来查看

8.4.3 数据规整(基本规整)

j[1]['title']

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
j[1]['title'][0],j[1]['source'][0],j[1]['time'][0],j[1]['date'][0]

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 将标题和内容列表值合并入列表c2,内层字典存储相关数据

一共有11页数据(第一层循环),每页有10个数据,数量和标题数据刚好齐平(第二层数据)
对于时间time,可以使用split方法将字符串整理干净,再用replace方法将一开始判断为空值的时间值替换成统一的时间

将标题和内容列表值合并入列表c2,内层字典存储相关数据

c2 = []

第一层循环:一共有11页数据
for i in range(len(j)):
    输出每页的页数和该页的所有标题
    print(i,j[i]['title'])
    第二层数据:每页有10个数据,数量和标题数据齐平
    for i2 in range(len(j[i]['title'])):
        输出每页页数和该页每个标题的位置下标,每个标题、时间、摘要、网站的位置下标一一对应相同
        print(i,i2)
        c2.append({
            'title':j[i]['title'][i2],
            'source':j[i]['source'][i2],
            'date':j[i]['date'][i2],
            'time':j[i]['time'][i2].split()[0].replace('时间','2018-2-17').replace('年','-').replace('月','-').replace('日','')
        }) #对于时间time,可以使用split方法将字符串整理干净,再用replace方法将一开始判断==为空值==的时间值替换成统一的时间

c2

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 列表转为DataFrame
data = pd.DataFrame(c2)
data

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 检查数据类型
data.info()

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
data.shape

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 保存数据
保存数据

data.to_csv(r'data2\content.csv',index=False)

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战

8.4.4 数据规整(进阶)

使用Pandas,根据分析思路对数据详细规整

  • 读取数据
数据规整(进阶)

读取数据
data = pd.read_csv(r'data2\content.csv',
                  parse_dates=['time'] # 字符串列转时间类型
                  ).set_index('time').sort_index() # 时间列转行索引,排序

data.head().append(data.tail())

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 检查数据
检查数据

data.info()

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
data.index

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
data.describe() #计数,去重后计数, 出现次数最多的值,出现次数

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 新闻数据正常

8.4.5 合并百度指数和百度新闻两表

目前有的两份表

合并百度指数和百度新闻两表

baidu.head()

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
data.head()

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 查看两个组数据的维度数量差别
baidu.shape,data.shape

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 按索引合并两表
按索引合并两表

data.join(baidu)

合并后数据可能有缺失值,将缺失值行删除
data2 = data.join(baidu).dropna()
data2

数据类型如果异常,修改
data2.info()
data2['baidu_index'] = data2['baidu_index'].astype(np.int)
重新设置索引列的名字
data2.index.name = 'time'
data2.head()
data2.info()

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 检查数据类型
data2.info()

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 保存数据

之前保存的2个原始数据,数据分析时使用这个清洗后的数据,记得这里要 保留索引列(时间),不用更改方法里面的index参数状态

保存数据
data2.to_csv(r'data2\content2.csv')

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 读取数据
读取数据
data3 = pd.read_csv(r'data2\content2.csv',
                  ).set_index('time').sort_index() # 时间列转行索引,排序

data3.head().append(data3.tail())

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
  • 检查读取出来的数据
data3.shape,data3.info()

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战
data3.describe()

python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战

8.5 实操之数据处理

8.5.1 基于搜索引擎的产品推广策略的背景介绍

  • SEO:搜索引擎优化
  • 内容
  • 外链
  • SEM:搜索引擎营销
  • 搜索引擎优化的意义
    搜索引擎作为传统互联网的主要数据源,在信息传播过程中占有重要地位
    个人发布信息被搜索引擎收录、展示,可以引来流量,以较低成本实现产品推广
  • 搜索引擎优化途径:
    在搜索引擎可以检索到的各种公开社区发布文章,为自己的产品引流。
    如:论坛社区、问答、贴吧、博客、视频、自媒体等等

8.5.2 游戏产品的搜索引擎推广策略

  • 排名分析
  • 选择什么渠道?(在哪儿发软文)
  • 选择相关内容搜索排名靠前的网站发布信息
  • 流量监测
  • 发布信息时间?
  • 监测不同网站流量效果,调整推广渠道
  • 内容设计(标题)
  • 发布信息标题和内容的设计
  • 精心设计标题,吸引用户点击

8.5.3 2018年1-2月最火的游戏:旅行青蛙 的游戏介绍和数据分析境界

游戏介绍

  • 游戏情况
  • 《旅行青蛙》是由游戏公司HIT-POINT开发的休闲小游戏,一款放置类型手游
  • 游戏内容
  • 玩家通过收集三叶草去商城买东西,青蛙带着这些东西出门旅行,旅行途中拍照片邮寄回来
  • 社会反响
  • 这款游戏顺应了广大青年的佛系情感述求。成为社交圈刷屏的现象级游戏,产生了巨大的社会影响

境界浅析

做翻译的两种境界:

是忠于原著严格将译文翻译为原著一样好
还是自我发挥,将原著本地化好?

做记者的两种境界:

是忠于事实只报道现实好
还是对事情有个人判断,偏向性的报道好?(有态度的报道)

写数据分析报告的两种境界

是忠于数据,严格按数据表现的事实写报告好
还是分析前已经对事物有自己的判断,分析只是证明或证伪自己的判断好?

8.5.4 推广策略研究

&#x6D41;&#x884C;&#x7684;&#x5F15;&#x7206;&#x53D6;&#x51B3;&#x4E8E;&#x4E09;&#x7C7B;&#x4EBA;&#x7684;&#x5148;&#x540E;&#x8D21;&#x732E; --- &#x300A;&#x5F15;&#x7206;&#x70B9;&#x300B;

任何一场潮流到来时,总有几个关键的人物,他们独有的社会关系和其他特点,如激情和个人魅力,能够快速将信息在一定范围散布开来。

具体来说。流行的引爆取决于 三类人的先后贡献,如果在引爆潮流的不同时期,找准人群中的个别关键人物,利用他们来传播信息,就能点燃潮流

流行引爆的三个不同时期:

前期:内行(专业人士,产生信息)

  • 某一领域有丰富知识的权威人士
  • 在前期实现原始信息的产生
  • 内行专业且乐于讨论分享,但没有很好的说服力

后期:推销员(口耳相传,扩散,引爆)

  • 对信息领域未必了解,但具有说服力
  • 决定了信息传播的”最后一公里”
  • 推销员使信息病毒式扩散,实现最终引爆

Original: https://blog.csdn.net/weixin_55579895/article/details/120906545
Author: 十三先生po
Title: python使用jieba模块进行文本分析和搜索引擎推广“旅行青蛙”数据分析实战

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/600946/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球