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 單點修改求區間和,樹狀數組