竞赛圈   > 麻婆豆腐流分享一,简单规则+jieba

麻婆豆腐

吹牛   |   吹牛
  • 关注者 14
  • 关注了

麻婆豆腐

吹牛   |   吹牛

这次题目是识别文章的关键词,关键词也就是能够代表文章,通过关键词我们可以达到区分文章的能力。

这里,我选择jieba和一条规则,写一个简单的baseline,希望可以帮助我最近累计幸运值,拿到offer。

读取数据的操作没有什么特别的,利用python的pandas

import pandas as pd

# ID 标题 文本内容
data = pd.read_csv('../data/all_docs.txt',sep='\001',header=None)
data.columns = ['id','title','doc']

train = pd.read_csv('../data/train_docs_keywords.txt',sep='\t',header=None)
train.columns = ['id','label']
train_id_list = list(train['id'].unique())

train_title_doc = data[data['id'].isin(train_id_list)]

test_title_doc = data[~data['id'].isin(train_id_list)]

train_title_doc = pd.merge(train_title_doc,train,on=['id'],how='inner')

之后,划分出训练数据,并且可以通过训练数据达到对 设定的规则和jieba分词后的效果做一个评价。

import jieba
import re
import jieba.analyse
import numpy as np

# 去除文章的数字,数字没有意义,单纯一个数字,不能达到对文章内容的区分
train_title_doc['title_cut'] = train_title_doc['title'].apply(lambda x:''.join(filter(lambda ch: ch not in ' \t1234567890', x)))

# 策略 extract_tags 直接利用jieba的提取主题词的工具

train_title_doc['title_cut'] = train_title_doc['title_cut'].apply(lambda x:','.join(jieba.analyse.extract_tags(x,topK = 5))) # 第二规则 提取 《》 通过分析发现,凡是书名号的东西都会被用来作为主题词 train_title_doc['title_regex'] = train_title_doc['title'].apply(lambda x:','.join(re.findall(r"《(.+?)》",x))) # 利用策略 + 规则 查看训练集的准确率 train_offline_result = train_title_doc[['id','label','title_cut','title_regex']] # 验证我这个规则能够达到的分数 记得 * 0.5 count = 0 for i in train_offline_result.values: result = str(i[1]).split(',') title_cut = str(i[2]).split(',') title_regex = str(i[3]).split(',') if title_regex[0] == '': tmp_result = title_cut else: tmp_result = title_regex + title_cut count = count + len(set(result[:2])&set(tmp_result[:2])) print(count)

接下来,用我们已经设置好的规则,应用到训练数据上面。

# 策略 extract_tags
test_title_doc['title_cut'] = test_title_doc['title'].apply(lambda x:''.join(filter(lambda ch: ch not in ' \t1234567890', str(x))))

test_title_doc['title_cut'] = test_title_doc['title_cut'].apply(lambda x:','.join(jieba.analyse.extract_tags(str(x),topK = 5)))
# 第二规则 提取 《》
test_title_doc['title_regex'] = test_title_doc['title'].apply(lambda x:','.join(re.findall(r"《(.+?)》",str(x))))

# 利用策略 + 规则 查看训练集的准确率
test_offline_result = test_title_doc[['id','id','title_cut','title_regex']]

label1 = []
label2 = []

for i in test_offline_result.values:
    result = str(i[1]).split(',')
    title_cut = str(i[2]).split(',')
    title_regex = str(i[3]).split(',')
    if title_regex[0] == '':
        tmp_result = title_cut
    else:
        tmp_result = title_regex + title_cut

    if len(tmp_result) > 1:
        label1.append(tmp_result[0])
        label2.append(tmp_result[1])
    elif len(tmp_result) == 1:
        label1.append(tmp_result[0])
        label2.append(tmp_result[0])
    else:
        label1.append('')
        label2.append('')

result = pd.DataFrame()

id = test_title_doc['id'].unique()

result['id'] = list(id)
result['label1'] = label1
result['label1'] = result['label1'].replace('','nan')
result['label2'] = label2
result['label2'] = result['label2'].replace('','nan')

result.to_csv('../result/jieb_ruler_result_3.csv',index=None)

# 596//2 431

# 730//2 459

# 742//2 467

这个大概是线下和线上分数的对比和比较。

3条评论

分享

3条评论
意见反馈
关注微信公众号 关注微信公众号

扫一扫分享给周围朋友