<p id="m2nkj"><option id="m2nkj"><big id="m2nkj"></big></option></p>
    <strong id="m2nkj"></strong>
    <ruby id="m2nkj"></ruby>

    <var id="m2nkj"></var>
  • NLP賽事數(shù)據(jù)分析和提分總結(jié)!

    共 13185字,需瀏覽 27分鐘

     ·

    2021-05-10 19:24

    賽題名稱:互聯(lián)網(wǎng)輿情企業(yè)風(fēng)險(xiǎn)事件的識(shí)別和預(yù)警

    賽題鏈接:http://ailab.aiwin.org.cn/competitions/48

    1

    賽題背景

    近些年來(lái),資本市場(chǎng)違約事件頻發(fā),財(cái)務(wù)造假、董事長(zhǎng)被抓、股權(quán)質(zhì)押爆倉(cāng)、城投非標(biāo)違約等負(fù)面事件屢屢出現(xiàn)。而在大數(shù)據(jù)和人工智能技術(shù)加持下,各種新興的金融風(fēng)險(xiǎn)控制手段也正在高速發(fā)展,其中通過(guò)采集互聯(lián)網(wǎng)上的企業(yè)輿情信息來(lái)挖掘潛在風(fēng)險(xiǎn)事件是一種較為有效的方式。但這些風(fēng)險(xiǎn)信息散落在互聯(lián)網(wǎng)上的海量資訊中,若能從中及時(shí)識(shí)別出涉及企業(yè)的風(fēng)險(xiǎn)事件,并挖掘出潛在的風(fēng)險(xiǎn)特征,將使得銀行、證券等金融機(jī)構(gòu)在風(fēng)險(xiǎn)監(jiān)控領(lǐng)域中更及時(shí)、全面和直觀地掌握客戶風(fēng)險(xiǎn)情況,大幅提升識(shí)別和揭示風(fēng)險(xiǎn)的能力。而風(fēng)險(xiǎn)事件以文本的形式存在,需要采用人工智能方法進(jìn)行自然語(yǔ)言理解,實(shí)現(xiàn)風(fēng)險(xiǎn)事件的高精度智能識(shí)別。

    2

    賽題任務(wù)

    從給定的互聯(lián)網(wǎng)信息中提取、識(shí)別出企業(yè)主體名稱,以及標(biāo)記風(fēng)險(xiǎn)標(biāo)簽。選手預(yù)測(cè)標(biāo)簽對(duì)應(yīng)格式為(新聞ID,主體全稱,對(duì)應(yīng)風(fēng)險(xiǎn)標(biāo)簽)。

    注:

    1)每篇互聯(lián)網(wǎng)信息可能會(huì)涉及零到多個(gè)主體(公司),每篇互聯(lián)網(wǎng)信息中對(duì)每個(gè)主體只預(yù)測(cè)一個(gè)風(fēng)險(xiǎn)標(biāo)簽;

    2)賽事會(huì)提供一份主體(公司)的全稱清單(其范圍大于待預(yù)測(cè)名單),新聞中提及的主體可能為其簡(jiǎn)稱或別名或主體相關(guān)的自然人(如其董事長(zhǎng)、總經(jīng)理等),選手提交答案時(shí)需要統(tǒng)一識(shí)別并將他們映射至主體全稱輸出在最終的結(jié)果文件中。主體全稱的映射關(guān)系需選手自行處理。

    3)請(qǐng)注意在訓(xùn)練集中存在一類「無(wú)」標(biāo)簽,其指的是對(duì)應(yīng)的新聞內(nèi)容中不包含需識(shí)別的金融風(fēng)險(xiǎn)事件。對(duì)于測(cè)試集中此類情況,選手模型在輸出時(shí)只需準(zhǔn)確打上「無(wú)」的標(biāo)簽,對(duì)應(yīng)主體標(biāo)記為「/」即可。即輸出的為:"新聞 ID,/ ,無(wú)"。

    4)測(cè)試集(需選手利用模型進(jìn)行預(yù)測(cè))的數(shù)據(jù)中會(huì)包含一些噪音數(shù)據(jù),比如在主體(公司)的全稱清單之外的輿情等,選手同樣需要對(duì)其預(yù)測(cè),不計(jì)入自動(dòng)評(píng)分。

    3

    評(píng)價(jià)方式

    統(tǒng)一評(píng)審階段 將選手預(yù)測(cè)結(jié)果和答案進(jìn)行對(duì)比計(jì)算出F1值,F(xiàn)1越大約好

    F1計(jì)算公式為:

    P = 預(yù)測(cè)對(duì)的標(biāo)簽總數(shù) / 預(yù)測(cè)出的標(biāo)簽數(shù)
    R = 預(yù)測(cè)對(duì)的標(biāo)簽總數(shù) / 需要預(yù)測(cè)的總標(biāo)簽數(shù)
    F1 = 2 * P * R /(P+R)
    4

    數(shù)據(jù)描述

    數(shù)據(jù)集文件如下:

    ├── data
    │   ├── RISKLABEL_Training
    │   │   ├── 1_元數(shù)據(jù)格式.docx
    │   │   ├── 2_公司實(shí)體匯總_20210414_A1.xlsx
    │   │   ├── 3_訓(xùn)練集匯總_20210414_A1.xlsx
    │   │   ├── readme.txt
    │   │   ├── result.csv
    │   │   └── ~$_元數(shù)據(jù)格式.docx
    │   └── T1_ID
    │       ├── readme.txt
    │       └── result.csv

    列名數(shù)據(jù)類型能否為空備注
    NEWS_BASICINFO_SIDNUMBER(22)NOT NULL新聞ID
    NEWS_TITLEVARCHAR2(3000)新聞標(biāo)題
    ABSTRACTVARCHAR2(4000)摘要
    CONTENTCLOB正文
    AUTHORVARCHAR2(1000)作者
    SRC_URLVARCHAR2(1000)下載源地址
    SOURCE_TYPEVARCHAR2(100)文章類型01-新聞;02-論壇;03-博客;04-微博;05-平媒;06-微信;07-視頻;08-長(zhǎng)微博;09-APP;10-評(píng)論;99-其他
    PUBLISH_SITEVARCHAR2(100)來(lái)源
    FIRST_WEBVARCHAR2(100)首發(fā)網(wǎng)站名稱
    CHANNELVARCHAR2(100)網(wǎng)站頻道
    NOTICE_DTDATE發(fā)布時(shí)間
    COMPANY_NMVARCHAR2(300)企業(yè)名稱
    LABELVARCHAR2(60)業(yè)務(wù)標(biāo)簽主板/創(chuàng)業(yè)板/中小板/債券退市
    債務(wù)逾期
    實(shí)控人變更
    破產(chǎn)重整
    股票質(zhì)押率過(guò)高
    被政府職能部
    處罰
    被監(jiān)管機(jī)構(gòu)罰款或查處
    被采取監(jiān)管措施
    重大訴訟仲裁
    信息披露違規(guī)等
    5

    數(shù)據(jù)統(tǒng)計(jì)分析

    公眾號(hào)ChallengeHub后臺(tái),回復(fù)”互聯(lián)網(wǎng)輿情“可獲取完整baseline代碼

    首先加載看下數(shù)據(jù)內(nèi)容:


    接下來(lái)我們對(duì)數(shù)據(jù)集中出現(xiàn)的實(shí)體與文本進(jìn)行分析,著重思考比賽思路以及賽題提分點(diǎn)。

    def statics(data):
        stats = []
        for col in data.columns:
            stats.append((col, data[col].nunique(), data[col].isnull().sum() * 100 / data.shape[0],
                          data[col].value_counts(normalize=True, dropna=False).values[0] * 100, data[col].dtype))

        stats_df = pd.DataFrame(stats, columns=['Feature''Unique_values''Percentage_of_missing_values',
                                                'Percentage_of_values_in_the_biggest category''type'])
        stats_df.sort_values('Percentage_of_missing_values', ascending=False, inplace=True)
        return stats_df

    實(shí)體長(zhǎng)度分布

    統(tǒng)計(jì)每個(gè)實(shí)體的長(zhǎng)度

    stats = entities_df['entity_len'].value_counts().rename_axis('unique_entity_len').reset_index(name='counts')
    fig = px.bar(stats, x='unique_entity_len', y='counts')
    fig.show()

    可以看出,實(shí)體最小長(zhǎng)度為4,平均長(zhǎng)度為13,最大長(zhǎng)度為35,過(guò)長(zhǎng)實(shí)體是我們需要解決的難點(diǎn)之一,我們可以通過(guò)將過(guò)長(zhǎng)實(shí)體進(jìn)行拆分標(biāo)注,然后預(yù)測(cè)的時(shí)候根據(jù)是否相鄰進(jìn)行組合,也可以通過(guò)指針網(wǎng)絡(luò)解決crf在過(guò)長(zhǎng)實(shí)體識(shí)別時(shí)出現(xiàn)span斷裂的問(wèn)題。

    企業(yè)實(shí)體名稱多樣性

    大部分企業(yè)實(shí)體都是以“公司”,“有些股份公司”,“集團(tuán)"結(jié)尾的,另外也存在一些含有括號(hào)的實(shí)體:

    entities_df[
        (entities_df['公司名'].str.contains('('))|
        (entities_df['公司名'].str.contains(')'))|
        (entities_df['公司名'].str.contains('\('))|
        (entities_df['公司名'].str.contains('\)'))
     ]
    # 英文括號(hào)為0

    例如:


    除此之外還有一些其他名稱比較靈活組合的實(shí)體

    文本長(zhǎng)度分析

    新聞標(biāo)題的長(zhǎng)度分布

    新聞標(biāo)題最小長(zhǎng)度為6,最大長(zhǎng)度為120,平均長(zhǎng)度為28。

    新聞內(nèi)容的長(zhǎng)度分布

    train_df['content_len']=train_df['CONTENT'].apply(lambda x:len(x))
    train_df['content_len'].describe()

    可以看到的是新聞內(nèi)容存在過(guò)長(zhǎng)文本,并且嚴(yán)重超過(guò)了現(xiàn)有模型的輸入長(zhǎng)度

    count    11685.000000
    mean      3324.683098
    std       6741.110801
    min          4.000000
    25%         31.000000
    50%        979.000000
    75%       2807.000000
    max      32767.000000
    Name: content_len, dtype: float64

    通過(guò)查看文本,我們可以看到,新聞內(nèi)容中存在大量html代碼標(biāo)簽,我們可以通過(guò)正則表達(dá)式reBeautifulSoup進(jìn)行去除無(wú)關(guān)標(biāo)簽

    # 方式1
    import re
    pattern = re.compile(r'<[^>]+>',re.S)
    result = pattern.sub('', train_df['CONTENT'][11683])
    print("".join(result.split()))
    # 方式2
    from bs4 import BeautifulSoup
    cleantext = BeautifulSoup(train_df['CONTENT'][11683], "lxml").text
    cleantext

    處理前后的文本對(duì)比


    清洗文本之后,文本長(zhǎng)度縮減一半:

    train_df['content_len'].describe()

    count    11685.000000
    mean      3324.683098
    std       6741.110801
    min          4.000000
    25%         31.000000
    50%        979.000000
    75%       2807.000000
    max      32767.000000
    Name: content_len, dtype: float64
    train_df['new_content_len'].describe()

    count    11685.000000
    mean       890.949679
    std       1328.754384
    min          0.000000
    25%         31.000000
    50%        424.000000
    75%       1298.000000
    max      31840.000000
    Name: new_content_len, dtype: float64

    業(yè)務(wù)標(biāo)簽數(shù)量分布

    train_df['LABEL'].value_counts()
    無(wú)                  3042
    實(shí)控人變更               811
    信息披露違規(guī)              800
    重大訴訟仲裁              800
    股票質(zhì)押率過(guò)高             799
    主板/創(chuàng)業(yè)板/中小板/債券退市     799
    被政府職能部門處罰           799
    債務(wù)逾期                798
    被監(jiān)管機(jī)構(gòu)罰款或查處          796
    被采取監(jiān)管措施             796
    破產(chǎn)重整                796
    安全事故                326
    環(huán)境污染                323
    Name: LABEL, dtype: int64

    從上面可以看出,不存在金融事件樣本“無(wú)”所占比列最多,有3042個(gè)樣本;其次是“信息披露違規(guī) ”和“重大訴訟仲裁”,都是800個(gè)樣本,出現(xiàn)次數(shù)最少的兩個(gè)類別是“安全事故”和“環(huán)境污染 ”。


    另外我們從業(yè)務(wù)標(biāo)簽字面我們可以看到的是大部分業(yè)務(wù)標(biāo)簽界限還是比較清晰的,但是“被監(jiān)管機(jī)構(gòu)罰款或查處 ”和“被采取監(jiān)管措施”這兩個(gè)類別的界限還是比較模糊的,這個(gè)也是我們提分的一個(gè)地方:


    6

    基于預(yù)訓(xùn)練模型的多任務(wù)學(xué)習(xí)


    基于bert_multitask_learning進(jìn)行標(biāo)簽分類和實(shí)體識(shí)別的聯(lián)合任務(wù)訓(xùn)練,首先構(gòu)建輸入,

    import bert_multitask_learning
    from bert_multitask_learning.preproc_decorator import preprocessing_fn
    from bert_multitask_learning.params import BaseParams
    @preprocessing_fn
    def toy_cls(params: BaseParams, mode: str):
        "Simple example to demonstrate singe modal tuple of list return"
        if mode == bert_multitask_learning.TRAIN:
            toy_input = ['this is a test' for _ in range(10)]
            toy_target = ['a' if i <=5 else 'b' for i in range(10)]
        else:
            toy_input = ['this is a test' for _ in range(10)]
            toy_target = ['a' if i <=5 else 'b' for i in range(10)]
        return toy_input, toy_target

    @preprocessing_fn
    def toy_seq_tag(params: BaseParams, mode: str):
        "Simple example to demonstrate singe modal tuple of list return"
        if mode == bert_multitask_learning.TRAIN:
            toy_input = ['this is a test'.split(' 'for _ in range(10)]
            toy_target = [['a''b''c''d'for _ in range(10)]
        else:
            toy_input = ['this is a test'.split(' 'for _ in range(10)]
            toy_target = [['a''b''c''d'for _ in range(10)]
        return toy_input, toy_target

    processing_fn_dict = {'toy_cls': toy_cls, 'toy_seq_tag': toy_seq_tag}

    創(chuàng)建多任務(wù)實(shí)例并進(jìn)行實(shí)例

    from bert_multitask_learning import train_bert_multitask, eval_bert_multitask, predict_bert_multitask
    problem_type_dict = {'toy_cls''cls''toy_seq_tag''seq_tag'}

    problem = 'toy_cls&toy_seq_tag'
    # train
    model = train_bert_multitask(
        problem=problem,
        num_epochs=1,
        problem_type_dict=problem_type_dict,
        processing_fn_dict=processing_fn_dict,
        continue_training=True
    )

    模型驗(yàn)證與預(yù)測(cè)

    eval_dict = eval_bert_multitask(problem=problem,
                        problem_type_dict=problem_type_dict, processing_fn_dict=processing_fn_dict,
                        model_dir=model.params.ckpt_dir)
    print(eval_dict)
    # predict
    fake_inputs = ['this is a test'.split(' 'for _ in range(10)]
    pred, model = predict_bert_multitask(
        problem=problem,
        inputs=fake_inputs, model_dir=model.params.ckpt_dir,
        problem_type_dict=problem_type_dict,
        processing_fn_dict=processing_fn_dict, return_model=True)
    for problem_name, prob_array in pred.items():
        print(f'{problem_name} - {prob_array.shape}')

    完整教程可以查看官網(wǎng):https://jayyip.github.io/bert-multitask-learning/tutorial.html

    7

    提分點(diǎn)

    企業(yè)實(shí)體提?。?span style="display: none;">

    • 實(shí)體出現(xiàn)位置
    • 實(shí)體存在不是公司 集團(tuán)結(jié)尾
    • 實(shí)體中存在括號(hào)
    • 實(shí)體可能為空 與 業(yè)務(wù)標(biāo)簽有關(guān)系 LABEL
    • 過(guò)長(zhǎng)實(shí)體 嵌套連續(xù)實(shí)體解決

    比賽中可能用到的NER Trick

    • Q1、如何快速有效地提升NER性能?

    如果1層lstm+crf,這么直接的打開方式導(dǎo)致NER性能達(dá)不到業(yè)務(wù)目標(biāo),這一點(diǎn)也不意外(這是萬(wàn)里長(zhǎng)征的第一步~)。這時(shí)候除了badcase分析,不要忘記一個(gè)快速提升的重要手段:規(guī)則+領(lǐng)域詞典。

    在垂直領(lǐng)域,一個(gè)不斷積累、不斷完善的實(shí)體詞典對(duì)NER性能的提升是穩(wěn)健的,基于規(guī)則+詞典也可以快速應(yīng)急處理一些badcase;對(duì)于通?領(lǐng)域,可以多種分詞工具和多種句法短語(yǔ)?具進(jìn)行融合來(lái)提取候選實(shí)體,并結(jié)合詞典進(jìn)行NER。

    • Q2、如何構(gòu)建引入詞匯信息(詞向量)的NER?

    將詞向量引入到模型中,一種簡(jiǎn)單粗暴的做法就是將詞向量對(duì)齊到相應(yīng)的字符,然后將字詞向量進(jìn)行混合,但這需要對(duì)原始文本進(jìn)行分詞(存在誤差),性能提升通常是有限的。我們知道中文NER通常是基于字符進(jìn)行標(biāo)注的,這是由于基于詞匯標(biāo)注存在分詞誤差問(wèn)題。但詞匯邊界對(duì)于實(shí)體邊界是很有用的,我們?cè)撛趺窗烟N(yùn)藏詞匯信息的詞向量“恰當(dāng)”地引入到模型中呢?

    • Q3、如何解決NER實(shí)體span過(guò)長(zhǎng)的問(wèn)題?

    如果NER任務(wù)中某一類實(shí)體span比較長(zhǎng)(?如醫(yī)療NER中的?術(shù)名稱是很長(zhǎng)的),直接采取CRF解碼可能會(huì)導(dǎo)致很多連續(xù)的實(shí)體span斷裂。除了加入規(guī)則進(jìn)行修正外,這時(shí)候也可嘗試引入指針網(wǎng)絡(luò)+CRF構(gòu)建多任務(wù)學(xué)習(xí)解決。

    指針網(wǎng)絡(luò)會(huì)更容易捕捉較長(zhǎng)的span,不過(guò)指針網(wǎng)絡(luò)的收斂是較慢的,可以對(duì)CRF和指針網(wǎng)絡(luò)設(shè)置不同學(xué)習(xí)率,或者設(shè)置不同的loss權(quán)重。

    • Q4、如何客觀看待BERT在NER中的作用?

    在競(jìng)賽任務(wù)中,BERT很有用!我們可以選取不同的預(yù)訓(xùn)練語(yǔ)?模型在底層進(jìn)行特征拼接。具體地,可以將char、bigram和BERT、XLNet等一起拼接喂入1層lstm+crf中。語(yǔ)?模型的差異越?,效果越好。如果需要對(duì)語(yǔ)言模型finetune,需要設(shè)置不同的學(xué)習(xí)率。

    業(yè)務(wù)標(biāo)簽識(shí)別:

    • 被采取監(jiān)管措施 vs 被監(jiān)管機(jī)構(gòu)罰款或查處
    • 統(tǒng)計(jì)特征:其他新聞字段統(tǒng)計(jì),html標(biāo)簽分析
    8

    資料推薦


    • 天池中藥說(shuō)明書實(shí)體識(shí)別挑戰(zhàn)冠軍方案開源 https://github.com/z814081807/DeepNER
    • 2020阿里云tianchi零基礎(chǔ)入門NLP比賽: rank4選手總結(jié) https://github.com/MM-IR/rank4_NLP_textclassification
    • 刷爆3路榜單,信息抽取冠軍方案分享:嵌套NER+關(guān)系抽取+實(shí)體標(biāo)準(zhǔn)化 https://zhuanlan.zhihu.com/p/326302618
    • 流水的NLP鐵打的NER:命名實(shí)體識(shí)別實(shí)踐與探索 https://zhuanlan.zhihu.com/p/166496466
    • 工業(yè)界如何解決NER問(wèn)題?12個(gè)trick,與你分享~ https://zhuanlan.zhihu.com/p/152463745
    • 中文NER的正確打開方式: 詞匯增強(qiáng)方法總結(jié) (從Lattice LSTM到FLAT) https://zhuanlan.zhihu.com/p/142615620




    ONE


    關(guān)注公眾號(hào)ChallengeHub,回復(fù)”互聯(lián)網(wǎng)輿情“獲取完整代碼和更多案例分析


    掃碼關(guān)注我們

    一個(gè)致力于分享AI知識(shí)的Hub

    整理不易,點(diǎn)三連
    瀏覽 210
    點(diǎn)贊
    評(píng)論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)
    評(píng)論
    圖片
    表情
    推薦
    點(diǎn)贊
    評(píng)論
    收藏
    分享

    手機(jī)掃一掃分享

    分享
    舉報(bào)
    <p id="m2nkj"><option id="m2nkj"><big id="m2nkj"></big></option></p>
    <strong id="m2nkj"></strong>
    <ruby id="m2nkj"></ruby>

    <var id="m2nkj"></var>
  • 美女喷水网站 | 无码免费婬AV片在线观看 | 特级做a爰片毛片免费69 | 天天做天天干天天爱麻豆 | 国产精品呻吟AV无码 | 亚洲AV成人漫画无码精品网站 | 国内精品久久久久久久 | 欧美日韩黄色 | www超碰| 青青操激情视频 |