1. 程式人生 > >2018年招商銀行FinTech精英訓練營複賽

2018年招商銀行FinTech精英訓練營複賽

過了初賽就可以參加複賽,我初賽200+名(及格上榜的好像就400多人,具體名次我也不記得了),招行5.20給發了99.9的紅包,很大方了~~~

賽題背景    

財經新聞作為重要卻海量的投資資料,無時無刻不在影響著投資者們的投資決策,為了更好地提示客戶當下新聞事件對應的投資機會和投資風險,本課以研發“歷史事件連連看”為目的,旨在根據當前新聞內容從歷史事件中搜索出相似新聞報道,後期可以結合事件與行情,輔助客戶採取相應投資策略。    

該賽題是讓參賽者為每一條測試集資料尋找其最相似的TOP 20條新聞,我們會根據參賽者提交的結果和實際的資料進行對比,採用mAP值作為評價指標。

具體實現

該題是一道文字相似度的題目,(我想也可以理解看成聚類啊,分類,具體如何操作我尚未試驗)

講一個小思路:

獲取資料(讀取中文文字)-->分詞-->資料清洗(去掉停用詞)-->計算tfidf--構建詞袋模型轉換為向量-->計算餘弦相似度-->獲取最相似的20條

額,這是一個baseline 的思路,比賽官方的結果還沒有給出,我就先貼上自己baseline 的程式碼吧,其實還有很多要優化的地方,比如L:tfidf並不適合短文字,這樣關鍵詞提取上會出問題;另外VSM模型並不是計算相似性的最佳模型,個人見解,歡迎討論.

科普一下:

常見的距離度量方法:

(1)歐式距離(2)Pearson相關性(3)cos餘弦距離

注意注意!在推薦系統最常用的其實是第二種。

下面是我的一個計算文字相似性的簡單程式碼啦:

# -*- coding: utf-8 -*-
"""
Created on Fri Apr 27 21:49:31 2018

@author: susuxuer
"""

import jieba
import jieba.posseg as pseg
from gensim import corpora,models,similarities
import pandas as pd
import re
import time

# 載入資料集
'''
載入訓練集方式:
    loadDataSet('train_data.csv', 'UTF-8')
    
載入測試集方式:
    loadDataSet('test_data.csv', 'gbk')
    
'''
def loadDataSet(filename,encode):
    dataSet = pd.read_csv(filename, encoding = encode)
    m,n = dataSet.shape
    data = dataSet.values[:,-1]
    dataId = dataSet.values[:,0]
    return data.reshape((m,1)), dataId.reshape((m,1))

# numpy 陣列轉化為 list
def ndarrayToList(dataArr):
    dataList = []
    m,n = dataArr.shape
    for i in range(m):
        for j in range(n):
            dataList.append(dataArr[i,j])
    return dataList

# 建立停用詞list  
def stopwordslist(filePath):  
    stopwords = [line.strip() for line in open(filePath, 'r', encoding='UTF-8').readlines()]  
    return stopwords  

# 去掉字串特殊符號
def removeStr(listData):
    strData = "".join(listData)  
    r1 = u'[0-9’!"#$%&\'()*+,-./:;<=>
[email protected]
,。?★、…【】《》?“”‘’![\\]^_`{|}~]+' removeStrData = re.sub(r1, "",strData) return removeStrData # 對資料集分詞 def wordSplit(data): stopword = stopwordslist('ChineseStopWords.txt') word = ndarrayToList(data) m = len(word) wordList = [] # 儲存分詞結果 for i in range(m): rowListRemoveStr = removeStr(word[i]) rowList = [eachWord for eachWord in jieba.cut(rowListRemoveStr)] # 對每一行分詞 wordRmoveList = [] for oneword in rowList: if oneword not in stopword and word != '\t' and word != ' ': wordRmoveList.append(oneword) wordList.append(wordRmoveList) return wordList if __name__ == "__main__": start = time.clock() with open("result.txt","a") as fr: fr.write('source_id') fr.write('\t') fr.write('target_id') fr.close # 載入訓練集與測試集 trainData,trainDataId = loadDataSet('train_data.csv', 'UTF-8') testData,testDataId = loadDataSet('test_data.csv', 'gbk') print('訓練集、測試集載入完成') # 對訓練集與測試集分詞 trainDataSplit = wordSplit(trainData) print('訓練集分詞完成') testDataSplit = wordSplit(testData) print('測試集分詞完成') # 製作語料庫 dictionary = corpora.Dictionary(trainDataSplit) # 獲取詞袋 corpus = [dictionary.doc2bow(doc) for doc in trainDataSplit] # 製作語料庫 print('語料庫製作完成') # 使用 TF-IDF 模型對語料庫建模 tfidf = models.TfidfModel(corpus) m = len(testDataSplit) for i in range(m): print('測試第%d條資料' %i) testVec = dictionary.doc2bow(testDataSplit[i]) index = similarities.SparseMatrixSimilarity(tfidf[corpus], num_features=len(dictionary.keys())) sim = index[tfidf[testVec]] simNumList = sorted(enumerate(sim), key=lambda item: -item[1]) with open("result.txt","a") as fr: for j in range(21): if str(int(testDataId[i])) == str(int(simNumList[j][0]+1)): continue fr.write('\n') fr.write(str(int(testDataId[i]))) fr.write('\t') fr.write(str(int(simNumList[j][0]+1))) elapsed = (time.clock() - start) print('Time use', elapsed)

還望大神們勿噴,這是第一版本,後面版本尚不能公開,此版本Python 3.6可以執行,python2.7可能會出現編碼錯誤。

我之前用的python 2.7 ,Unicode ,GBK,UTF-8,ASCII把我搞得很懵逼,總是出錯,給大家科普一下編碼:

ASCII:最開始只在美國使用,是一個位元組,前128個為標準ASCII碼,後128個稱為擴充套件ASCII碼。許多基於x86的系統都支援使用擴充套件(或“高”)ASCII。擴充套件ASCII 碼允許將每個字元的第8 位用於確定附加的128 個特殊符號字元、外來語字母和圖形符號。

Unicode 是國際組織制定的可以容納世界上所有文字和符號的字元編碼方案,又稱統一碼。

GBK編碼:是指中國的中文字元,其它它包含了簡體中文與繁體中文字元,另外還有一種字元“gb2312”,這種字元僅能儲存簡體中文字元。

UTF-8:是萬國碼,UTF8編碼格式很強大,支援所有國家的語言,正是因為它的強大,才會導致它佔用的空間大小要比GBK大,對於網站開啟速度而言,也是有一定影響的。

相關推薦

2018招商銀行FinTech精英訓練營複賽

過了初賽就可以參加複賽,我初賽200+名(及格上榜的好像就400多人,具體名次我也不記得了),招行5.20給發了99.9的紅包,很大方了~~~ 賽題背景     財經新聞作為重要卻海量的投資資料,無時無刻不在影響著投資者們的投資決策,為了更好地提示客戶當下新聞事件對應的投

2018工商銀行軟體開發中心面試總結

本著水一水提前感受一下面試套路的原則,講一下我的面試經歷(還談不上經驗~): 我去工行的時候差點遲到,第一次去,又有點路痴,看不懂地圖=_=,所以各位小夥伴要是去自己不熟悉的地方面試的話,一定儘量給自己留有時間餘地,我基本一到坐下沒兩分鐘就被叫去面試了。 中國工商銀行軟體

2018工商銀行軟體開發中心面試經歷

轉載一篇萌妹子的工商銀行面經,原博地址戳這裡 下面是部落格內容: 本著水一水提前感受一下面試套路的原則,講一下我的面試經歷(還談不上經驗~): 我去工行的時候差點遲到,第一次去,又有點路痴,看不懂地圖=_=,所以各位小夥伴要是去自己不熟悉的地方面試的話,一

招商銀行2018秋招演算法工程師崗位筆試題及AC答案

給定一個整數n,請找出階乘末尾有n個0的所有正整數: 我的解法: def num_of_zero(N): b = N numZero = 0 while True: if b > 0:

2018全國多校算法寒假訓練營練習比賽(第一場)C 六子沖

pac -- color blog set push its amp return 思路: 模擬。 代碼: #include<bits/stdc++.h> using namespace std; #define ll long long #de

2018全國多校算法寒假訓練營練習比賽(第一場)G 圓圈

push def namespace 中間 mes har color clu oid 思路: 分形。 記錄中間左邊點的坐標,然後推出另外3個點的坐標,遞歸到最簡單的情況。 代碼: #include<bits/stdc++.h> using nam

2018全國多校算法寒假訓練營練習比賽(第一場)D N階漢諾塔變形

img 算法 cout ear www. sync 練習 style http https://www.nowcoder.com/acm/contest/67/D 思路: 先手動模擬一下過程,以下是模擬過程,按順序表示第幾步需要移動的盤標號 1 1 2 1 1 2

2018全國多校算法寒假訓練營練習比賽(第二場)

組成 滿足 targe ring1 例如 爐石傳說 oooo 曲線 更多 A題: 鏈接:https://www.nowcoder.com/acm/contest/74/A來源:牛客網 小魚兒吐泡泡,嘟嘟嘟冒出來。小魚兒會吐出兩種泡泡:大泡泡"O",小泡泡"o"。 兩個相鄰

2018全國多校算法寒假訓練營練習比賽(第二場)F - 德瑪西亞萬歲

code 訓練營 比賽 最優 weight -o com 英雄 tin 鏈接:https://www.nowcoder.com/acm/contest/74/F來源:牛客網 題目描述 德瑪西亞是一個實力雄厚、奉公守法的國家,有著功勛卓著的光榮軍史。

2018全國多校算法寒假訓練營練習比賽(第二場)B - TaoTao要吃雞

esc spa scanf namespace scribe sin bold ans 最大 鏈接:https://www.nowcoder.com/acm/contest/74/B來源:牛客網 題目描述 Taotao的電腦帶不動絕地求生,所以tao

2018全國多校算法寒假訓練營練習比賽(第二場)A.吐泡泡

兩種 mark 例如 mes names urn mar code else 原題鏈接 描述 小魚兒吐泡泡,嘟嘟嘟冒出來。小魚兒會吐出兩種泡泡:大泡泡"O",小泡泡"o"。 兩個相鄰的小泡泡會融成一個大泡泡,兩個相鄰的大泡泡會爆掉。 (是的你沒看錯,小氣泡和大氣泡不會產生任

2018全國多校算法寒假訓練營練習比賽(第三場)題解

排序 esp 註意 test sca big %d question long long 【題目連接】 由於在比賽期間發現了很多是原題,所以直接抄了原題代碼,稍後準備重寫。 A - 不凡的夫夫 答案為$\left\lfloor {\sum\limits_

2018全國多校算法寒假訓練營練習比賽(第三場)】

upload 線段 fall 警鐘 預處理 數學 tex sqrt -- 之前題目比較水,今天的還可以。 【A 不凡的大夫】 方法一:答案是log8(n!),解決方案是預處理,將需要的答案記錄下來以免超內存; 方法二:用公式,斯特林公式: 【B 一個小問

斯特林公式-Stirling公式(取N階乘近似值)-HDU1018-Big Number 牛客網NowCoder 2018全國多校算法寒假訓練營練習比賽(第三場)A.不凡的夫夫

subject color content coder -m ria 一點 練習 java 最近一堆題目要補,一直鹹魚,補了一堆水題都沒必要寫題解。備忘一下這個公式。 Stirling公式的意義在於:當n足夠大時,n!計算起來十分困難,雖然有很多關於n!的等式,但並不能很

2018全國多校算法寒假訓練營練習比賽(第四場)題解

ret ref amp 排列 break call eof while push_back 【題目鏈接】 A - 石油采集 題意:有一個$01$矩陣,每次可以拿走兩個相鄰的$1$,問最多能操作幾次。 這題和HDU 1507一樣。二維矩陣四連通圖是一個二分圖

牛客網NowCoder 2018全國多校算法寒假訓練營練習比賽(第四場)A.石油采集(dfs) B.道路建設(最小生成樹prim) C.求交集(暴力) F.Call to your teacher(迪傑斯特拉亂用) H.老子的全排列呢(dfs)

初始 -o 地圖 意義 技術 tle bject ios urn 菜哭了。。。 A.石油采集 時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 32768K,其他語言65536K 64bit IO Format: %lld 鏈

2018全國多校算法寒假訓練營練習比賽(第四場)-A】石油采集(匈牙利算法)

sca scanf tor 代碼 contest bit span 比賽 targe 試題鏈接:https://www.nowcoder.com/acm/contest/76/A 【思路】 每個‘#’的右邊和下邊如果也是‘#&r

牛客網 2018全國多校算法寒假訓練營練習比賽(第四場)

ios ext ++i onclick 比賽 dag 練習 empty 分享圖片 T1 石油采集 這題可以建一張二分圖跑最大匹配,也可以直接染色然後數數 #include<bits/stdc++.h> using namespace std;

2018全國多校算法寒假訓練營練習比賽(第四場)-D】小明的挖礦之旅

scanf n) name targe () 鏈接 算法 || 挖礦 題目鏈接:https://www.nowcoder.com/acm/contest/76/D做題時沒註意到“無論出現在哪個格子”。。題中也沒說明一個格子只能經過一次,其實沒有想象的

2018全國多校算法寒假訓練營練習比賽(第五場)題解

樹狀數組 訓練營 lan 排序 for string ios 字符 fail 【題目鏈接】 A - 逆序數 經典問題,有很多方法,例如樹狀數組,線段樹,歸並排序等。代碼不貼了。 B - Big Water Problem 單點修改求區間和,樹狀數組