参考博主:https://github.com/jackliaoall/data_tangyudi
我们需要把文本数据中有潜在价值的数据提取出来
**URL:**Uniform Resource Locator 中文名叫"统一资源定位符"
- 它是WWW页的地址,在Internet的WWW服务程序上用于指定信息的位置和获取方式的一种格式。URL可以由协议、主机、端口和路径组成,常见的协议是http和https。
- URL是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。它最初是由蒂姆·伯纳斯·李发明用来作为万维网的地址的。现在它已经被万维网联盟编制为互联网标准RFC1738了。
URL就是我们在浏览器地址栏中输入的网址,用于定位互联网上的资源。
3.1 相似度计算
搜索时返回的结果之间的相似度怎么对比?
- 数据清洗
- 分词
- 构建语料库
- 统计词频
- 生成词频向量
(1)相似度
(2)余弦
3.2 新闻数据处理
3.2.1 导入数据
import pandas as pd
import jieba
#pip install jieba
数据源:http://www.sogou.com/labs/resource/ca.php
df_news = pd.read_table('./data/val.txt',names=['category','theme','URL','content'],encoding='utf-8')
df_news = df_news.dropna()
df_news.head()
| category | theme | URL | content |
|---|---|---|---|
| 0 | 汽车 | 新辉腾 4.2 V8 4座加长Individual版2011款 最新报价 | http://auto.data.people.com.cn/model_15782/ |
| 1 | 汽车 | 918 Spyder概念车 | http://auto.data.people.com.cn/prdview_165423.... |
| 2 | 汽车 | 日内瓦亮相 MINI性能版/概念车-1.6T引擎 | http://auto.data.people.com.cn/news/story_5249... |
| 3 | 汽车 | 清仓大甩卖一汽夏利N5威志V2低至3.39万 | http://auto.data.people.com.cn/news/story_6144... |
| 4 | 汽车 | 大众敞篷家族新成员 高尔夫敞篷版实拍 | http://auto.data.people.com.cn/news/story_5686... |
查看新闻信息
df_news.shape
结果
(5000, 4)
3.2.2 分词:使用结吧分词器
1)转换成list格式才能分词
content = df_news.content.values.tolist()
print (content[1000])
阿里巴巴集团昨日宣布,将在集团管理层面设立首席数据官岗位(Chief Data Officer),阿里巴巴B2B公司CEO陆兆禧将会出任上述职务,向集团CEO马云直接汇报。>菹ぃ和6月初的首席风险官职务任命相同,首席数据官亦为阿里巴巴集团在完成与雅虎股权谈判,推进"one company"目标后,在集团决策层面新增的管理岗位。0⒗锛团昨日表示,"变成一家真正意义上的数据公司"已是战略共识。记者刘夏
2)分词
content_S = []
for line in content:
current_segment = jieba.lcut(line)
if len(current_segment) > 1 and current_segment != '\\r\\n': #换行符
content_S.append(current_segment)
content_S[1000]
['阿里巴巴','集团','昨日','宣布',',','将','在','集团','管理','层面','设立','首席','数据','官','岗位','(','C','h','i','e','f','\\u3000','D','a','t','a','\\u3000','O','f','f','i','c','e','r',')',',','阿里巴巴','B','2','B','公司','C','E','O','陆兆禧','将','会','出任','上述','职务',',','向','集团','C','E','O','马云','直接','汇报','。','>','菹','ぃ','和','6','月初','的','首席','风险','官','职务','任命','相同',',','首席','数据','官亦为','阿里巴巴','集团','在','完成','与','雅虎','股权','谈判',',','推进','"','o','n','e','\\u3000','c','o','m','p','a','n','y','"','目标','后',',','在','集团','决策','层面','新增','的','管理','岗位','。','0','⒗','锛','团','昨日','表示',',','"','变成','一家','真正','意义','上','的','数据','公司','"','已','是','战略','共识','。','记者','刘夏']
3.2.3 剔除停用词
(1)输出前5个内容
df_content=pd.DataFrame({'content_S':content_S})
df_content.head()
pd.DataFrame({'content_S': content_S})- **
pd**是pandas库的常用缩写。 - **
DataFrame**是pandas的核心数据结构,类似于Excel表格或SQL表。 {'content_S': content_S}是一个字典,键'content_S'是列名,值content_S是该列的数据。- 这行代码的作用是:将
content_S数据转换成一个DataFrame,列名为'content_S'。
- **
df_content.head()head()是DataFrame的方法,默认显示前5行数据(如果数据不足5行,则全部显示)。- 如果想显示指定行数,可以传入参数,比如
head(10)显示前10行。
示例:
假设 content_S 是一个列表:
import pandas as pd
content_S = ["apple", "banana", "cherry", "date", "fig", "grape"]
df_content = pd.DataFrame({'content_S': content_S})
df_content.head()
输出:
content_S
0 apple
1 banana
2 cherry
3 date
4 fig
(2)输出停用词内容
stopwords=pd.read_csv("stopwords.txt",index_col=False,sep="\\t",quoting=3,names=['stopword'], encoding='utf-8')
stopwords.head(20)
| stopword | |
|---|---|
| 0 | ! |
| 1 | " |
| 2 | # |
| 3 | $ |
| 4 | % |
| 5 | & |
| 6 | ' |
| 7 | ( |
| 8 | ) |
| 9 | * |
| 10 | + |
(3)设置清理函数
def drop_stopwords(contents,stopwords):
contents_clean = []
all_words = []
for line in contents:
line_clean = []
for word in line:
if word in stopwords:
continue
line_clean.append(word)
all_words.append(str(word))
contents_clean.append(line_clean)
return contents_clean,all_words
#print (contents_clean)
contents = df_content.content_S.values.tolist()
stopwords = stopwords.stopword.values.tolist()
contents_clean,all_words = drop_stopwords(contents,stopwords)
#df_content.content_S.isin(stopwords.stopword)
#df_content=df_content[~df_content.content_S.isin(stopwords.stopword)]
#df_content.head()
1)功能:
遍历 contents (文本数据),移除其中的停用词(stopwords),并返回:
contents_clean:清理后的文本(二维列表,每行是一个去除了停用词的句子)。
all_words:所有非停用词的列表(一维列表,用于后续分析,如词频统计)。
2)参数说明:
contents :输入的文本数据,是一个二维列表 (例如 [ ["我","爱","Python"], ["深度","学习"] ])。
stopwords :停用词列表(例如 ["的","是","在"])。
3)代码逻辑:
初始化两个空列表:
contents_clean:存储清理后的文本(二维结构)。all_words:存储所有非停用词(一维结构)。
遍历每行文本:
- 对每行
line(例如["我","爱","Python"]),初始化line_clean存储该行清理后的词。 - 遍历每个
word,检查它是否在stopwords中:- 如果是停用词,跳过(
continue)。 - 如果不是停用词,添加到
line_clean和all_words。
- 如果是停用词,跳过(
- 将清理后的
line_clean加入contents_clean。
返回结果:
contents_clean:清理后的二维文本列表。all_words:所有非停用词的一维列表。
(4)输出清理结果
df_content=pd.DataFrame({'contents_clean':contents_clean})
df_content.head()
3.2.4 词云展示单词
(1)输出单词
df_all_words=pd.DataFrame({'all_words':all_words})
df_all_words.head()
| all_words | |
|---|---|
| 0 | 经销商 |
| 1 | 电话 |
| 2 | 试驾 |
| 3 | 订车 |
| 4 | U |
(2)输出出现次数最多的单词
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()
代码逐行解释
1) words_count = df_all_words.groupby(by=['all_words'])['all_words'].agg({"count": numpy.size})
- 作用 :对
df_all_words按all_words列分组,并统计每组的数量(即每个单词的出现次数)。 - 分解 :
-
df_all_words.groupby(by=['all_words'])按
all_words列的值分组,相同的单词会被分到同一组。 -
['all_words'].agg({"count": numpy.size})['all_words']:选择要聚合的列(这里是all_words列本身)。.agg({"count": numpy.size}):对每个分组计算大小(即该单词出现的次数),并将结果列命名为"count"。numpy.size是统计分组大小的函数(也可以用len或"size")。
-
- 示例 :
-
分组后:
Group 1: "苹果" → ["苹果", "苹果", "苹果"] Group 2: "香蕉" → ["香蕉", "香蕉"] Group 3: "葡萄" → ["葡萄"] -
聚合后:
all_words count 苹果 3 香蕉 2 葡萄 1
-
2) words_count = words_count.reset_index().sort_values(by=["count"], ascending=False)
- 作用 :重置索引并按
count列降序排序。 - 分解 :
-
.reset_index()将
groupby后的分组标签(all_words)从索引恢复为一列(否则all_words会是索引而非普通列)。 -
.sort_values(by=["count"], ascending=False)by=["count"]:按count列排序。ascending=False:降序排列(词频从高到低)。
-
- 示例 :
-
reset_index()前:all_words count 苹果 3 香蕉 2 葡萄 1 -
reset_index()后:all_words count 0 苹果 3 1 香蕉 2 2 葡萄 1 -
排序后(
ascending=False):all_words count 0 苹果 3 1 香蕉 2 2 葡萄 1
-
3) words_count.head()
- 作用 :显示
words_count的前 5 行(默认)。 - 用途:快速检查词频统计结果。
(3)生成词云
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)
3.2.5 提取关键词TF-IDF
import jieba.analyse
index = 2400
print (df_news['content'][index])
content_S_str = "".join(content_S[index])
print (" ".join(jieba.analyse.extract_tags(content_S_str, topK=5, withWeight=False)))
法国VS西班牙、里贝里VS哈维,北京时间6月24日凌晨一场的大战举世瞩目,而这场胜利不仅仅关乎两支顶级强队的命运,同时也是他们背后的球衣赞助商耐克和阿迪达斯之间的一次角逐。T谌胙"窘炫分薇的16支球队之中,阿迪达斯和耐克的势力范围也是几乎旗鼓相当:其中有5家球衣由耐克提供,而阿迪达斯则赞助了6家,此外茵宝有3家,而剩下的两家则由彪马赞助。而当比赛进行到现在,率先挺进四强的两支球队分别被耐克支持的葡萄牙和阿迪达斯支持的德国占据,而由于最后一场1/4决赛是茵宝(英格兰)和彪马(意大利)的对决,这也意味着明天凌晨西班牙同法国这场阿迪达斯和耐克在1/4决赛的唯一一次直接交手将直接决定两家体育巨头在此次欧洲杯上的胜负。8据评估,在2012年足球商品的销售额能总共超过40亿欧元,而单单是不足一个月的欧洲杯就有高达5亿的销售额,也就是说在欧洲杯期间将有700万件球衣被抢购一空。根据市场评估,两大巨头阿迪达斯和耐克的市场占有率也是并驾齐驱,其中前者占据38%,而后者占据36%。体育权利顾问奥利弗-米歇尔在接受《队报》采访时说:"欧洲杯是耐克通过法国翻身的一个绝佳机会!"C仔尔接着谈到两大赞助商的经营策略:"竞技体育的成功会燃起球衣购买的热情,不过即便是水平相当,不同国家之间的欧洲杯效应却存在不同。在德国就很出色,大约1/4的德国人通过电视观看了比赛,而在西班牙效果则差很多,由于民族主义高涨的加泰罗尼亚地区只关注巴萨和巴萨的球衣,他们对西班牙国家队根本没什么兴趣。"因此尽管西班牙接连拿下欧洲杯和世界杯,但是阿迪达斯只为西班牙足协支付每年2600万的赞助费#相比之下尽管最近两届大赛表现糟糕法国足协将从耐克手中每年可以得到4000万欧元。米歇尔解释道:"法国创纪录的4000万欧元赞助费得益于阿迪达斯和耐克竞逐未来15年欧洲市场的竞争。耐克需要笼络一个大国来打赢这场欧洲大陆的战争,而尽管德国拿到的赞助费并不太高,但是他们却显然牢牢掌握在民族品牌阿迪达斯手中。从长期投资来看,耐克给法国的赞助并不算过高。"
耐克 阿迪达斯 欧洲杯 球衣 西班牙
3.2.6 主题模型LDA
-
格式要求:list of list形式,分词好的的整个语料
from gensim import corpora, models, similarities
import gensim
#http://radimrehurek.com/gensim/
(1)做映射,相当于词袋
dictionary = corpora.Dictionary(contents_clean)
corpus = [dictionary.doc2bow(sentence) for sentence in contents_clean]
lda = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=20) #类似Kmeans自己指定K值
(2)一号分类结果
print (lda.print_topic(1, topn=5))
0.007*"中" + 0.006*"说" + 0.004*"观众" + 0.002*"赛区" + 0.002*"岁"
for topic in lda.print_topics(num_topics=20, num_words=5):
print (topic[1])
0.007*"女人" + 0.006*"男人" + 0.006*"M" + 0.004*"S" + 0.004*"说"
0.004*"中" + 0.004*"训练" + 0.003*"说" + 0.003*"学校" + 0.002*"研究生"
0.006*"戏" + 0.006*"导演" + 0.005*"该剧" + 0.004*"中" + 0.004*"演员"
0.007*"中" + 0.006*"说" + 0.004*"观众" + 0.002*"赛区" + 0.002*"岁"
0.004*"万" + 0.003*"号" + 0.003*"中" + 0.002*"S" + 0.002*"R"
0.014*"电影" + 0.009*"导演" + 0.007*"影片" + 0.006*"中国" + 0.005*"中"
0.006*"中" + 0.005*"比赛" + 0.004*"说" + 0.003*"撒" + 0.002*"时间"
0.006*"赛季" + 0.005*"中" + 0.003*"联赛" + 0.003*"中国" + 0.002*"航母"
0.005*"李小璐" + 0.004*"中" + 0.002*"贾乃亮" + 0.002*"W" + 0.002*"皮肤"
0.004*"万" + 0.003*"号" + 0.003*"V" + 0.003*"T" + 0.003*"刘涛"
0.021*"男人" + 0.008*"女人" + 0.007*"考生" + 0.004*"说" + 0.003*"中"
0.005*"中" + 0.005*"食物" + 0.004*"i" + 0.004*"a" + 0.004*"吃"
0.006*"中" + 0.004*"电影" + 0.004*"说" + 0.002*"中国" + 0.002*"高考"
0.007*"中" + 0.006*"孩子" + 0.004*"说" + 0.003*"教育" + 0.003*"中国"
0.005*"中" + 0.005*"节目" + 0.004*"说" + 0.004*"表演" + 0.003*"岁"
0.007*"电视剧" + 0.004*"中" + 0.003*"说" + 0.003*"飞行" + 0.002*"飞机"
0.007*"中" + 0.006*"球队" + 0.005*"选手" + 0.004*"观众" + 0.004*"i"
0.005*"中" + 0.005*"天籁" + 0.004*"产品" + 0.004*"肌肤" + 0.003*"职场"
0.008*"中国" + 0.008*"饰演" + 0.007*"中" + 0.004*"说" + 0.004*"节目"
0.021*"e" + 0.021*"a" + 0.016*"o" + 0.013*"i" + 0.013*"n"
(3)打印内容和类型
df_train=pd.DataFrame({'contents_clean':contents_clean,'label':df_news['category']})
df_train.tail()
(4)输出其中唯一的类型
df_train.label.unique()
array(['汽车', '财经', '科技', '健康', '体育', '教育', '文化', '军事', '娱乐', '时尚'], dtype=object)
(5)输出内容和分类
label_mapping = {"汽车": 1, "财经": 2, "科技": 3, "健康": 4, "体育":5, "教育": 6,"文化": 7,"军事": 8,"娱乐": 9,"时尚": 0}
df_train['label'] = df_train['label'].map(label_mapping)
df_train.head()
(6)分割数据
将数据集分割成训练集和测试集,从而可以在训练集上训练模型,并在测试集上评估模型的性能。
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(df_train['contents_clean'].values, df_train['label'].values, random_state=1)
#x_train = x_train.flatten()
x_train[0][1]
'上海'
这样分割数据的主要目的是为了避免模型过拟合。过拟合是指模型在训练数据上表现很好,但在新数据(如测试数据)上表现不佳的情况。通过将数据分为训练集和测试集,我们可以在训练集上训练模型,并使用测试集来评估模型的泛化能力,从而避免过拟合。
(7)转换格式
将 x_train 中的每一行(或称为每一个元素)转换为一个字符串,并将这些字符串添加到 words 列表中。如果在这个过程中遇到任何异常,它会打印出发生异常的行索引和 word_index
words = []
for line_index in range(len(x_train)):
try:
#x_train[line_index][word_index] = str(x_train[line_index][word_index])
words.append(' '.join(x_train[line_index]))
except:
print (line_index,word_index)
words[0]
'中新网 上海 日电 于俊 父亲节 网络 吃 一顿 电影 快餐 微 电影 爸 对不起 我爱你 定于 本月 父亲节 当天 各大 视频 网站 首映 葜 谱 鞣 剑 保慈 障蚣 钦 呓 樯 埽 ⒌ 缬 埃 ǎ 停 椋 悖 颍 铩 妫 椋 恚 称 微型 电影 新 媒体 平台 播放 状态 短时 休闲 状态 观看 完整 策划 系统 制作 体系 支持 显示 较完整 故事情节 电影 微 超短 放映 微 周期 制作 天 数周 微 规模 投资 人民币 几千 数万元 每部 内容 融合 幽默 搞怪 时尚 潮流 人文 言情 公益 教育 商业 定制 主题 单独 成篇 系列 成剧 唇 开播 微 电影 爸 对不起 我爱你 讲述 一对 父子 观念 缺少 沟通 导致 关系 父亲 传统 固执 钟情 传统 生活 方式 儿子 新派 音乐 达 习惯 晚出 早 生活 性格 张扬 叛逆 两种 截然不同 生活 方式 理念 差异 一场 父子 间 拉开序幕 子 失手 打破 父亲 心爱 物品 父亲 赶出 家门 剧情 演绎 父亲节 妹妹 哥哥 化解 父亲 这场 矛盾 映逋坏 嚼 斫 狻 ⒍ 粤 ⒌ 桨容 争执 退让 传统 尴尬 父子 尴尬 情 男人 表达 心中 那份 感恩 一杯 滤挂 咖啡 父亲节 变得 温馨 镁 缬 缮 虾 N 逄 煳 幕 传播 迪欧 咖啡 联合 出品 出品人 希望 观摩 扪心自问 父亲节 父亲 记得 父亲 生日 哪一天 父亲 爱喝 跨出 家门 那一刻 感觉 一颗 颤动 心 操劳 天下 儿女 父亲节 大声 喊出 父亲 家人 爱 完'
print (len(words))
3750
(8)将文本数据转换为词频矩阵1
from sklearn.feature_extraction.text import CountVectorizer
texts=["dog cat fish","dog cat cat","fish bird", 'bird']
cv = CountVectorizer()
cv_fit=cv.fit_transform(texts)
print(cv.get_feature_names())
print(cv_fit.toarray())
print(cv_fit.toarray().sum(axis=0))#统计每个单词的总出现次数
['bird', 'cat', 'dog', 'fish']
[[0 1 1 1] # "dog cat fish" → dog:1, cat:1, fish:1
[0 2 1 0] # "dog cat cat" → cat:2, dog:1
[1 0 0 1] # "fish bird" → bird:1, fish:1
[1 0 0 0]] # "bird" → bird:1
[2 3 2 2]
CountVectorizer()初始化一个词频统计器。fit_transform(texts)做两件事:- 学习词汇表(从所有文本中提取唯一的单词)。
- 生成词频矩阵 (稀疏矩阵格式
cv_fit)。
sum(axis=0)对每列(即每个单词)求和:bird: 0+0+1+1 = 2cat: 1+2+0+0 = 3dog: 1+1+0+0 = 2fish: 1+0+1+0 = 2
关键点总结
- 词汇表生成:自动过滤标点、转换为小写(默认),并按字母顺序排列。
- 稀疏矩阵 :
cv_fit是稀疏矩阵(节省内存),toarray()将其转为稠密数组方便查看。 - 应用场景:词频矩阵是文本分类(如朴素贝叶斯)、主题模型的基础输入。
from sklearn.feature_extraction.text import CountVectorizer
texts=["dog cat fish","dog cat cat","fish bird", 'bird']
cv = CountVectorizer(ngram_range=(1,4))
cv_fit=cv.fit_transform(texts)
print(cv.get_feature_names())
print(cv_fit.toarray())
print(cv_fit.toarray().sum(axis=0))
['bird', 'cat', 'cat cat', 'cat fish', 'dog', 'dog cat', 'dog cat cat', 'dog cat fish', 'fish', 'fish bird']
[[0 1 0 1 1 1 0 1 1 0] # "dog cat fish" → dog, cat, fish, dog cat, cat fish, dog cat fish
[0 2 1 0 1 1 1 0 0 0] # "dog cat cat" → dog, cat (x2), cat cat, dog cat, dog cat cat
[1 0 0 0 0 0 0 0 1 1] # "fish bird" → fish, bird, fish bird
[1 0 0 0 0 0 0 0 0 0]] # "bird" → bird
[2, 3, 1, 1, 2, 2, 1, 1, 2, 1]
-
ngram_range=(1,4):生成从 1 个单词到 4 个单词的所有可能组合(如果存在)。例如:
- 1-gram:
"dog","cat","fish","bird" - 2-gram:
"dog cat","cat fish","cat cat","fish bird" - 3-gram:
"dog cat fish","dog cat cat" - 4-gram: 在
texts中没有 4 单词的组合,因此不会生成。
- 1-gram:
-
按字母顺序排序的 n-gram 列表:
- 1-gram:
'bird','cat','dog','fish' - 2-gram:
'cat cat','cat fish','dog cat','fish bird' - 3-gram:
'dog cat cat','dog cat fish' - 4-gram: 无(因为最长文本只有 3 个单词)。
- 1-gram:
-
对应
get_feature_names()的顺序,统计所有文本中每个 n-gram 的总出现次数:'bird': 2'cat': 3'cat cat': 1'cat fish': 1'dog': 2'dog cat': 2'dog cat cat': 1'dog cat fish': 1'fish': 2'fish bird': 1
关键点
- n-gram 的生成规则 :
- 如果文本长度不足(如
'bird'只有 1 个单词),不会生成超出长度的 n-gram。 - 连续的单词组合才会生成(如
"dog cat fish"生成"dog cat"和"cat fish",但不会生成"dog fish")。
- 如果文本长度不足(如
- 稀疏性问题 :
- 高阶 n-gram(如 3-gram、4-gram)会大幅增加特征维度,但实际有效的组合可能很少(如
'dog cat fish'只出现 1 次)。
- 高阶 n-gram(如 3-gram、4-gram)会大幅增加特征维度,但实际有效的组合可能很少(如
- 应用场景 :
- 高阶 n-gram 可以捕捉短语信息(如
"cat cat"可能表示重复强调),但需权衡计算成本。
- 高阶 n-gram 可以捕捉短语信息(如
可视化示例
| 文本 | 激活的 n-gram(部分) |
|---|---|
| "dog cat fish" | 'dog' , 'cat' , 'fish' , 'dog cat' , 'cat fish' , 'dog cat fish' |
| "dog cat cat" | 'dog' , 'cat' (x2), 'cat cat' , 'dog cat' , 'dog cat cat' |
| "fish bird" | 'fish' , 'bird' , 'fish bird' |
| "bird" | 'bird' |
高阶 n-gram 能更细致地捕捉上下文,但可能引发维度灾难!
(9)将文本数据转换为词频矩阵2
from sklearn.feature_extraction.text import CountVectorizer
vec = CountVectorizer(analyzer='word', max_features=4000, lowercase = False)
vec.fit(words)
#使用朴素贝叶斯分类器对转换后的数据进行分类训练
from sklearn.naive_bayes import MultinomialNB
classifier = MultinomialNB()
classifier.fit(vec.transform(words), y_train)
MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)
test_words = []
for line_index in range(len(x_test)):
try:
#x_train[line_index][word_index] = str(x_train[line_index][word_index])
test_words.append(' '.join(x_test[line_index]))
except:
print (line_index,word_index)
test_words[0]
'国家 公务员 考试 申论 应用文 类 试题 实质 一道 集 概括 分析 提出 解决问题 一体 综合性 试题 说 一道 客观 凝练 申发 论述 文章 题目 分析 历年 国考 申论 真题 公文 类 试题 类型 多样 包括 公文 类 事务性 文书 类 题材 从题 干 作答 材料 内容 整合 分析 无需 太 创造性 发挥 纵观 历年 申论 真题 作答 应用文 类 试题 文种 格式 作出 特别 重在 内容 考查 行文 格式 考生 平常心 面对 应用文 类 试题 准确 把握 作答 领会 内在 含义 把握 题材 主旨 材料 结构 轻松 应对 应用文 类 试题 R 弧 ⒆ 钒 盐 展文 写作 原则 T 材料 中来 应用文 类 试题 材料 总体 把握 客观 考生 材料 中来 材料 中 把握 材料 准确 理解 题材 主旨 T 政府 角度 作答 应用文 类 试题 更应 注重 政府 角度 观点 政府 角度 出发 原则 表述 观点 提出 解决 之策 考生 作答 站 政府 人员 角度 看待 提出 解决问题 T 文体 结构 形式 考查 重点 文体 结构 大部分 评分 关键点 解答 方法 薄 ⒆ ス 丶 词 明 方向 作答 题目 题干 作答 作答 方向 作答 角度 关键 向导 考生 仔细阅读 题干 作答 抓住 关键词 作答 方向 相关 要点 整理 作答 思路 年国考 地市级 真 题为 例 潦惺姓 府 宣传 推进 近海 水域 污染 整治 工作 请 给定 资料 市政府 工作人员 身份 草拟 一份 宣传 纲要 R 求 保对 宣传 内容 要点 提纲挈领 陈述 玻 体现 政府 精神 全市 各界 关心 支持 污染 整治 工作 通俗易懂 超过 字 肮 丶 词 近海 水域 污染 整治 工作 市政府 工作人员 身份 宣传 纲要 提纲挈领 陈述 体现 政府 精神 全市 各界 关心 支持 污染 整治 工作 通俗易懂 提示 归结 作答 要点 包括 污染 情况 原因 解决 对策 作答 思路 情况 原因 对策 意义 逻辑 顺序 安排 文章 结构 病 ⒋ 缶殖 龇 ⅲ 明 结构 解答 应用文 类 试题 考生 材料 整体 出发 大局 出发 高屋建瓴 把握 材料 主题 思想 事件 起因 解决 对策 阅读文章 构建 文章 结构 直至 快速 解答 场 ⒗ 硭 乘悸 罚明 逻辑 应用文 类 试题 严密 逻辑思维 情况 原因 对策 意义 考生 作答 先 弄清楚 解答 思路 统筹安排 脉络 清晰 逻辑 表达 内容 表述 础 把握 明 详略 考生 仔细阅读 分析 揣摩 应用文 类 试题 内容 答题 时要 详略 得当 主次 分明 安排 内容 增加 文章 层次感 阅卷 老师 阅卷 时能 明白 清晰 一目了然 玻埃 保蹦旯 考 考试 申论 试卷 分为 省级 地市级 两套 试卷 能力 大有 省级 申论 试题 考生 宏观 角度看 注重 深度 广度 考生 深谋远虑 地市级 试题 考生 微观 视角 观察 侧重 考查 解决 能力 考生 贯彻执行 作答 区别对待'
(10)打印估计方法权重
classifier.score(vec.transform(test_words), y_test)
0.80400000000000005
(11)打印tf-idf方法权重
from sklearn.feature_extraction.text import TfidfVectorizer
vectorizer = TfidfVectorizer(analyzer='word', max_features=4000, lowercase = False)
vectorizer.fit(words)
TfidfVectorizer(analyzer='word', binary=False, decode_error='strict',
dtype=<class 'numpy.int64'>, encoding='utf-8', input='content',
lowercase=False, max_df=1.0, max_features=4000, min_df=1,
ngram_range=(1, 1), norm='l2', preprocessor=None, smooth_idf=True,
stop_words=None, strip_accents=None, sublinear_tf=False,
token_pattern='(?u)\\\\b\\\\w\\\\w+\\\\b', tokenizer=None, use_idf=True,
vocabulary=None)
from sklearn.naive_bayes import MultinomialNB
classifier = MultinomialNB()
classifier.fit(vectorizer.transform(words), y_train)
classifier.score(vectorizer.transform(test_words), y_test)
MultinomialNB(alpha=1.0, class_prior=None, fit_prior=True)
0.81520000000000004