全网新闻数据类别整理与新闻文本分类

本贴最后更新于 2789 天前,其中的信息可能已经渤澥桑田

一、 数据获取与整理

1. 获取

搜狗实验室 http://www.sogou.com/labs/resource/ca.php

我下载的是精简版(一个月数据, 437MB) 与 完整版(711MB)

注意:因为我的机器硬件所限,我把我整理出的类别文件删除一些,防止引起 python 的内存错误。

1

2. 整理

利用 Python 脚本 自动处理文本编码。

import os

file_list = os.listdir('.')
file_prefix = 'dd/'
for file_name in file_list:
    #os.system("cat " + file_name)
    os.system("cat " + file_name + " | " + "iconv -f gbk -t utf-8 -c" + " > " + "1" + file_name)

二、文本内容分类

1. 内容分类

文本格式

<doc>
<url>页面URL</url>
<docno>页面ID</docno>
<contenttitle>页面标题</contenttitle>
<content>页面内容</content>
</doc>

注意:content 字段去除了 HTML 标签,保存的是新闻正文文本

类别标记说明(URL 到类别的映射关系,3KB)

2

思路是利用 URL 到类别的映射提取出对应类别的正文文本内容写入到对应类别的文件夹中,文件标题为新闻标题,内容为正文文本。

3

4

2.代码

#coding:utf-8
import os

# 获取文件类别与URL之间的映射关系
file_content = None

with open('categories_2012.txt') as f:
    file_content = f.readlines()

categories = {}

f_item = None
for item in file_content:
    #print item
    if 'http' not in item[:-4] and ':' in item:
        if item[:-4] not in categories:
            categories[item[:-4]] = []
        f_item = item[:-4]
    elif 'http' in item and '前缀' not in item:
        #print item
        categories[f_item].append(item)

for k, v in categories.items():
    print k, v

#获取文本内容 并存储到相应的类别文件夹中
for label in categories.keys():
    try:
        os.mkdir(label.decode('utf-8'))
    except OSError:
        for list_file in os.listdir(label.decode('utf-8')):
            os.remove(label.decode('utf-8') + '/' + list_file)
        os.rmdir(label.decode('utf-8'))
        os.mkdir(label.decode('utf-8'))


for file_name in os.listdir('Sogou/'):
    with open('Sogou/' + file_name) as file:
        title = None
        for content in file:
            if 'contenttitle' in content:
                title = content[14:-16]
                #print title
            if 'url' in content:
                url_content = content[5:-7]

                #print url_content[: 8 + url_content[7:].find('/') + url_content[8 + url_content[7:].find('/'):].find('/') + 1]
                #print url_content
                flag = False
                label = None
                for k, v in categories.items():
                    for url_list in v:
                        #print url_content, url_list
                        if url_list.strip() in url_content.strip():
                            #print 'ok'
                            #print url_content
                            #print url_content, url_list
                            #print 'ok'
                            flag = True
                            label = k
                            break
                    if flag:
                        break
                #print '---------------------------------------------'
            if '<content>' in content:
                x_content = content[9:-11]
                #print x_content
                #print label
                if not label:
                    continue
                file_path = label + '/' + title + '.txt'
                print file_path.decode('utf-8')
                try:
                    with open(file_path.decode('utf-8'),'w+') as label_f:
                        label_f.write(x_content)
                except Exception:
                    pass

三、分类、聚类算法处理

利用准确率与召回率 计算 F1-SCORE (存疑,这样写正确么? 希望有前辈看到给我发封电子邮件 lichao0x7cc@gmail.com)

结果:

KNN 算法处理

knn
knnf1score

KMeans 算法处理

kmeans
kmenasf1score

代码

#coding:utf-8
from sklearn.cross_validation import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.cluster import KMeans
from sklearn.linear_model import SGDClassifier
from sklearn.datasets import load_files
from sklearn.feature_extraction.text import TfidfVectorizer
import jieba
import os


def jieba_cut(x):
    return jieba.cut(x)

sogou_Data = load_files('data/', encoding='utf-8')
data_train, data_test, label_train, label_test = train_test_split(sogou_Data.data, sogou_Data.target, test_size=0.2)

tfidf_model = TfidfVectorizer(binary=False, tokenizer=jieba_cut)
train_Data = tfidf_model.fit_transform(data_train)

clf = KNeighborsClassifier(n_neighbors=23).fit(train_Data, label_train)

test_Data = tfidf_model.transform(data_test)
pred = clf.predict(test_Data)
label_list_test = list(label_test)
#print label_test
correct = 0
#KNN
R = 0.0
R_score = {}

#print label_test
for label_pred, label_correct in zip(pred, label_list_test):
    print '预测结果: ',sogou_Data.target_names[label_pred]
    print '正确结果: ', sogou_Data.target_names[label_correct]
    print '\n'
    if sogou_Data.target_names[label_pred] == sogou_Data.target_names[label_correct]:
        correct += 1
        if sogou_Data.target_names[label_pred] not in R_score:
            R_score[sogou_Data.target_names[label_pred]] = 1
        else:
            R_score[sogou_Data.target_names[label_pred]] += 1

file_list = os.listdir('data/')
for dir_name in file_list:
    try:
        name_dir = dir_name.decode('gbk').encode('utf-8')
    except BaseException:
        pass
    for name in R_score.keys():
        if name_dir == name:
            R_score[sogou_Data.target_names[label_pred]] = R_score[sogou_Data.target_names[label_pred]] / float(len(os.listdir('data/' + name_dir +'/')))


for v in R_score.values():
    R += v

P = correct / float(len(label_list_test))

F1 = (2*R*P) / (P + R)

print 'F1-Score: ', F1


#KMeans
clf = KMeans(n_clusters=23).fit(train_Data, None)
pred = clf.predict(test_Data)

correct = 0
R = 0.0
R_score = {}

#print label_test
for label_pred, label_correct in zip(pred, label_list_test):
    print '预测结果: ',sogou_Data.target_names[label_pred]
    print '正确结果: ', sogou_Data.target_names[label_correct]
    print '\n'
    if sogou_Data.target_names[label_pred] == sogou_Data.target_names[label_correct]:
        correct += 1
        if sogou_Data.target_names[label_pred] not in R_score:
            R_score[sogou_Data.target_names[label_pred]] = 1
        else:
            R_score[sogou_Data.target_names[label_pred]] += 1

file_list = os.listdir('data/')
for dir_name in file_list:
    try:
        name_dir = dir_name.decode('gbk').encode('utf-8')
    except BaseException:
        pass
    for name in R_score.keys():
        if name_dir == name:
            R_score[sogou_Data.target_names[label_pred]] = R_score[sogou_Data.target_names[label_pred]] / float(len(os.listdir('data/' + name_dir +'/')))


for v in R_score.values():
    R += v

P = correct / float(len(label_list_test))

F1 = (2*R*P) / (P + R)

print 'F1-Score: ', F1

我的博客地址为: http://keysub.me

  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖
  • 文本分类
    1 引用

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...