熟語のスコア化による論文の採択予想
はじめに
国際学会に出される論文の内容は全て素晴らしい完成度であろう。その中で採択されるかされないかの一要因に「文章が魅力的なのか」が関係していると考え、それを定量評価する手法について検討した。
また、魅力的な文章を書く人は「論文の要約」でも魅力的な文章を書いているだろうと考え、今回は「論文の要約」のみで実装する。
提案手法
文章の分割
採用されている論文には特有の言い回し等があると考え、全ての文章を分割し、辞書化した。
df = pd.read_csv('train_data.csv')
word_3_note = []
for i in range(len(df['id'])):
text = df['abstract'][i].lower()
text = text.replace('.',' .')
text = text.replace(',','')
text = text.split(' ')
word3 = []
for j in range(len(text)):
if len(text[j:j+3]) == 3:
word3.append(text[j:j+3])
for words in word3:
if words not in word_3_note:
word_3_note.append(words)
これは3単語区切りのみだが、これを4単語verと5単語verを作成する。
出現回数を記録
採択された論文とされなかった論文に分け、上記で作成した辞書内の熟語が出現した回数を記録する。
df0 = df.query("y == 0").reset_index()
df0 = df0.drop('index',axis=1)
word_3_c_0 = [0 for x in word_3_note]
for i in range(len(df0['id'])):
text = df0['abstract'][i].lower()
text = text.replace('.',' .')
text = text.replace(',','')
text = text.split(' ')
word3 = []
for j in range(len(text)):
if len(text[j:j+3]) == 3:
word3.append(text[j:j+3])
for word in word3:
sw = str(word) # 途中でファイル保存して、それを呼び出す場合はstr化
wi = word_3_note.index(sw)
word_3_c_0[wi] += 1
上記コードは3単語verでの採択されなかった論文の熟語の出現回数だが、これを全てのパターンで実行する。
スコア化
ノイズを除去する。今回は熟語内に改行コードや空白が多く含まれていたもの、作成した熟語の出現回数が1回以下のものの2点。
改行コードや空白が多く含まれている場合は、熟語ではなく単語となってしまうため、除去を行った。順に単語を区切っているため、出現回数が1回のものは熟語でないため、除去を行った。
採択された論文の数は採択されなかった論文の数のおよそ1/3であるため、採択されなかった論文内の熟語の出現回数を1/3にする。
出現回数に着目すると、一般的によく使う熟語のスコアが大きくなってしまうため、採択された論文での熟語の出現回数 / 採択されなかった論文での熟語の出現回数(1/3したもの)で算出する。
その後、採択されなかった論文での出現回数が多ければ負、採択された論文での出現回数が多ければ正の値を取るように、全ての算出結果に-1を行う。
論文の要約の評価
上記までで作成した熟語のスコアを元に論文の要約の評価を行う。今回は単純な総和で行う。
''' 3単語版の辞書と出現回数とスコアについて記録したファイルを読み込む
df3 = (略)
'''
df['3score'] = 0
for i in range(len(df['id'])):
text = df['abstract'][i].lower()
text = text.replace('.',' .')
text = text.replace(',','')
text = text.split(' ')
word3 = []
for j in range(len(text)):
if len(text[j:j+3]) == 3:
word3.append(text[j:j+3])
s3 = 0
for words in word3:
sw = str(words) # 途中でファイル保存して、それを呼び出す場合はstr化
if sw in list(df3['word_3_note']):
wi = list(df3['word_3_note']).index(sw)
s3 += df3['score'][wi]
df['3score'][i] = s3
上記は3単語verだが、これを4単語verと5単語verで作成する。
lgbmへ
今回はここを余り重視していなかったため、割愛。
最後に
publicスコアが0.7016となった。
自然言語処理であるにも関わらず、こういった作業をすることにより、良いスコアが出せることが分かった。