精华内容
下载资源
问答
  • BERT 实战

    2020-09-22 11:56:55
    上一篇我们学习了 BERT 的原理,这里我们将它应用在 NER 实战上,我们在前面课程中也学习过 NER,这里我们用同样的数据集来看如何应用 BERT,大家可以与前面的模型进行比较。 另外推荐大家使用 Google 的云端 ...

    上一篇我们学习了 BERT 的原理,这里我们将它应用在 NER 实战上,我们在前面课程中也学习过 NER,这里我们用同样的数据集来看如何应用 BERT,大家可以与前面的模型进行比较。

    另外推荐大家使用 Google 的云端 Jupyter Notebook 开发环境 Colab,自带 TensorFlow、Matplotlib、NumPy、Pandas 等深度学习基础库,还可以免费使用 GPU、TPU。

    下面进入实战,本文所用的数据仍然是 Kaggle 上的一个 NER 数据集,可以将其中的ner_dataset.csv 下载到本地。

    加载所需的库

    首先我们需要安装 transformers,里面包括 NLP 中比较前沿的模型:BERT、GPT、XLNet 等等,支持 TensorFlow 和 PyTorch。

    !pip install transformers
    !pip install seqeval
    
    import pandas as pd
    import numpy as np
    from tqdm import tqdm, trange
    
    import torch
    from torch.utils.data import TensorDataset, DataLoade
    展开全文
  • Bert实战

    千次阅读 2019-01-21 07:20:11
      ...http://www.52nlp.cn/tag/bert%E5%AE%9E%E6%88%98  

     

    ——————————————————————————————

    ——————————————————————————————

    ——————————————————————————

    ——————————————————————————

     

     

     

     

     

     

    深度学习中的注意力模型https://zhuanlan.zhihu.com/p/37601161

    Transformer的博客文章:

    https://jalammar.github.io/illustrated-transformer/

    http://nlp.seas.harvard.edu/2018/04/03/attention.html

     

     

     

     

     

     

     

     

     

    http://www.52nlp.cn/tag/bert%E5%AE%9E%E6%88%98

     

    展开全文
  • BERT实战(更新中)

    2021-08-30 20:20:19
    BERT实战(更新中) 关于BERT理论和源码分析系列:BERT相关(更新中) 关于Transformer系列:Transformer相关 BERT实战——(1)文本分类 BERT实战——(2)序列标注 BERT实战——(3)问答任务-多选问答 BERT实战——...
    展开全文
  • @[TOC](深入Bert实战(Pytorch)----WordPiece Embeddings) https://www.bilibili.com/video/BV1K5411t7MD?p=5 https://www.youtube.com/channel/UCoRX98PLOsaN8PtekB9kWrw/videos 深入BERT实战(PyTorch) by ...

    https://www.bilibili.com/video/BV1K5411t7MD?p=5
    https://www.youtube.com/channel/UCoRX98PLOsaN8PtekB9kWrw/videos
    深入BERT实战(PyTorch) by ChrisMcCormickAI
    这是ChrisMcCormickAI在油管bert,8集系列第二篇WordPiece Embeddings的pytorch的讲解的代码,在油管视频下有下载地址,如果不能翻墙的可以留下邮箱我全部看完整理后发给你。

    加载模型

    安装huggingface实现

    !pip install pytorch-pretrained-bert
    
    import torch
    from pytorch_pretrained_bert import BertTokenizer
    
    # 加载预训练模型
    tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
    

    查看Bert中的词汇

    检索整个“tokens”列表,并将它们写入文本文件,可以仔细阅读它们。

    with open("vocabulary.txt", 'w', encoding='utf-8') as f:
        
        # For each token... 得到每个单词
        for token in tokenizer.vocab.keys():
            
            # Write it out and escape any unicode characters.   
            # 写并且转义为Unicode字符         
            f.write(token + '\n')
    
    • 打印出来可以得到

    • 前999个词序是保留位置,它们的形式类似于[unused957]

    • 1 - [PAD] 截断
      101 - [UNK] 未知字符
      102 - [CLS] 句首,表示分类任务
      103 - [SEP] BERT中分隔两个输入的句子
      104 - [MASK] MASK机制

    • 第1000-1996行似乎是单个字符的转储。

    • 它们似乎没有按频率排序(例如,字母表中的字母都是按顺序排列的)。

    • 第一个单词是1997位置的The

    • 从这里开始,这些词似乎是按频率排序的。
      前18个单词是完整的单词,第2016位是##s,可能是最常见的子单词。
      最后一个完整单词是29612位的 “necessitated”

    单字符

    下面的代码打印出词汇表中的所有单字符的token,以及前面带’##'的所有单字符的token。

    结果发现这些都是匹配集——每个独立角色都有一个“##”版本。有997个单字符标记。

    下面的单元格遍历词汇表,取出所有单个字符标记。

    one_chars = []
    one_chars_hashes = []
    
    # For each token in the vocabulary... 遍历所有单字符
    for token in tokenizer.vocab.keys():
        
        # Record any single-character tokens.记录下来
        if len(token) == 1:
            one_chars.append(token)
        
        # Record single-character tokens preceded by the two hashes. 
        # 记录##单字符   
        elif len(token) == 3 and token[0:2] == '##':
            one_chars_hashes.append(token)
    

    打印单字符的

    print('Number of single character tokens:', len(one_chars), '\n')
    
    # Print all of the single characters, 40 per row.
    
    # For every batch of 40 tokens...
    for i in range(0, len(one_chars), 40):
        
        # Limit the end index so we don't go past the end of the list.
        end = min(i + 40, len(one_chars) + 1)
        
        # Print out the tokens, separated by a space.
        print(' '.join(one_chars[i:end]))
    

    打印##单字符的

    print('Number of single character tokens with hashes:', len(one_chars_hashes), '\n')
    
    # Print all of the single characters, 40 per row.按每行40打印
    
    # Strip the hash marks, since they just clutter the display.去除##
    tokens = [token.replace('##', '') for token in one_chars_hashes]
    
    # For every batch of 40 tokens...每批40
    for i in range(0, len(tokens), 40):
        
        # Limit the end index so we don't go past the end of the list.限制结束位置
        end = min(i + 40, len(tokens) + 1)
        
        # Print out the tokens, separated by a space.
        print(' '.join(tokens[i:end]))
    
    Number of single character tokens: 997 
    
    ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? @ [ \ ] ^ _ ` a b
    c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ ¡ ¢ £ ¤ ¥ ¦ § ¨ © ª « ¬
    ® ° ± ² ³ ´ µ ¶ · ¹ º » ¼ ½ ¾ ¿ × ß æ ð ÷ ø þ đ ħ ı ł ŋ œ ƒ ɐ ɑ ɒ ɔ ɕ ə ɛ ɡ ɣ ɨ
    ɪ ɫ ɬ ɯ ɲ ɴ ɹ ɾ ʀ ʁ ʂ ʃ ʉ ʊ ʋ ʌ ʎ ʐ ʑ ʒ ʔ ʰ ʲ ʳ ʷ ʸ ʻ ʼ ʾ ʿ ˈ ː ˡ ˢ ˣ ˤ α β γ δ
    ε ζ η θ ι κ λ μ ν ξ ο π ρ ς σ τ υ φ χ ψ ω а б в г д е ж з и к л м н о п р с т у
    ф х ц ч ш щ ъ ы ь э ю я ђ є і ј љ њ ћ ӏ ա բ գ դ ե թ ի լ կ հ մ յ ն ո պ ս վ տ ր ւ
    ք ־ א ב ג ד ה ו ז ח ט י ך כ ל ם מ ן נ ס ע ף פ ץ צ ק ר ש ת ، ء ا ب ة ت ث ج ح خ د
    ذ ر ز س ش ص ض ط ظ ع غ ـ ف ق ك ل م ن ه و ى ي ٹ پ چ ک گ ں ھ ہ ی ے अ आ उ ए क ख ग च
    ज ट ड ण त थ द ध न प ब भ म य र ल व श ष स ह ा ि ी ो । ॥ ং অ আ ই উ এ ও ক খ গ চ ছ জ
    ট ড ণ ত থ দ ধ ন প ব ভ ম য র ল শ ষ স হ া ি ী ে க ச ட த ந ன ப ம ய ர ல ள வ ா ி ு ே
    ை ನ ರ ಾ ක ය ර ල ව ා ก ง ต ท น พ ม ย ร ล ว ส อ า เ ་ ། ག ང ད ན པ བ མ འ ར ལ ས မ ა
    ბ გ დ ე ვ თ ი კ ლ მ ნ ო რ ს ტ უ ᄀ ᄂ ᄃ ᄅ ᄆ ᄇ ᄉ ᄊ ᄋ ᄌ ᄎ ᄏ ᄐ ᄑ ᄒ ᅡ ᅢ ᅥ ᅦ ᅧ ᅩ ᅪ ᅭ ᅮ
    ᅯ ᅲ ᅳ ᅴ ᅵ ᆨ ᆫ ᆯ ᆷ ᆸ ᆼ ᴬ ᴮ ᴰ ᴵ ᴺ ᵀ ᵃ ᵇ ᵈ ᵉ ᵍ ᵏ ᵐ ᵒ ᵖ ᵗ ᵘ ᵢ ᵣ ᵤ ᵥ ᶜ ᶠ ‐ ‑ ‒ – — ―
    ‖ ‘ ’ ‚ “ ” „ † ‡ • … ‰ ′ ″ › ‿ ⁄ ⁰ ⁱ ⁴ ⁵ ⁶ ⁷ ⁸ ⁹ ⁺ ⁻ ⁿ ₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉ ₊ ₍
    ₎ ₐ ₑ ₒ ₓ ₕ ₖ ₗ ₘ ₙ ₚ ₛ ₜ ₤ ₩ € ₱ ₹ ℓ № ℝ ™ ⅓ ⅔ ← ↑ → ↓ ↔ ↦ ⇄ ⇌ ⇒ ∂ ∅ ∆ ∇ ∈ − ∗
    ∘ √ ∞ ∧ ∨ ∩ ∪ ≈ ≡ ≤ ≥ ⊂ ⊆ ⊕ ⊗ ⋅ ─ │ ■ ▪ ● ★ ☆ ☉ ♠ ♣ ♥ ♦ ♭ ♯ ⟨ ⟩ ⱼ ⺩ ⺼ ⽥ 、 。 〈 〉
    《 》 「 」 『 』 〜 あ い う え お か き く け こ さ し す せ そ た ち っ つ て と な に ぬ ね の は ひ ふ へ ほ ま み
    む め も や ゆ よ ら り る れ ろ を ん ァ ア ィ イ ウ ェ エ オ カ キ ク ケ コ サ シ ス セ タ チ ッ ツ テ ト ナ ニ ノ ハ
    ヒ フ ヘ ホ マ ミ ム メ モ ャ ュ ョ ラ リ ル レ ロ ワ ン ・ ー 一 三 上 下 不 世 中 主 久 之 也 事 二 五 井 京 人 亻 仁
    介 代 仮 伊 会 佐 侍 保 信 健 元 光 八 公 内 出 分 前 劉 力 加 勝 北 区 十 千 南 博 原 口 古 史 司 合 吉 同 名 和 囗 四
    国 國 土 地 坂 城 堂 場 士 夏 外 大 天 太 夫 奈 女 子 学 宀 宇 安 宗 定 宣 宮 家 宿 寺 將 小 尚 山 岡 島 崎 川 州 巿 帝
    平 年 幸 广 弘 張 彳 後 御 德 心 忄 志 忠 愛 成 我 戦 戸 手 扌 政 文 新 方 日 明 星 春 昭 智 曲 書 月 有 朝 木 本 李 村
    東 松 林 森 楊 樹 橋 歌 止 正 武 比 氏 民 水 氵 氷 永 江 沢 河 治 法 海 清 漢 瀬 火 版 犬 王 生 田 男 疒 発 白 的 皇 目
    相 省 真 石 示 社 神 福 禾 秀 秋 空 立 章 竹 糹 美 義 耳 良 艹 花 英 華 葉 藤 行 街 西 見 訁 語 谷 貝 貴 車 軍 辶 道 郎
    郡 部 都 里 野 金 鈴 镇 長 門 間 阝 阿 陳 陽 雄 青 面 風 食 香 馬 高 龍 龸 fi fl ! ( ) , - . / : ? ~
    

    上面两段代码及 ##+单字符单字符 结果一样

    # return True
    print('Are the two sets identical?', set(one_chars) == set(tokens))
    

    Subwords vs. Whole-words

    打印一些词汇的统计数据。

    import matplotlib.pyplot as plt
    import seaborn as sns
    import numpy as np
    
    sns.set(style='darkgrid')
    
    # Increase the plot size and font size.
    sns.set(font_scale=1.5)
    plt.rcParams["figure.figsize"] = (10,5)
    
    # Measure the length of every token in the vocab. 加载每个单词
    token_lengths = [len(token) for token in tokenizer.vocab.keys()]
    
    # Plot the number of tokens of each length.
    sns.countplot(token_lengths)
    plt.title('Vocab Token Lengths')
    plt.xlabel('Token Length')
    plt.ylabel('# of Tokens')
    
    print('Maximum token length:', max(token_lengths))
    

    在这里插入图片描述
    统计一下,’##'开头的tokens。

    num_subwords = 0
    
    subword_lengths = []
    
    # For each token in the vocabulary...
    for token in tokenizer.vocab.keys():
        
        # If it's a subword...
        if len(token) >= 2 and token[0:2] == '##':
            
            # Tally all subwords
            num_subwords += 1
    
            # Measure the sub word length (without the hashes)
            length = len(token) - 2
    
            # Record the lengths.        
            subword_lengths.append(length)
    
    

    相对于完整词汇表占据的数量

    vocab_size = len(tokenizer.vocab.keys())
    
    print('Number of subwords: {:,} of {:,}'.format(num_subwords, vocab_size))
    
    # Calculate the percentage of words that are '##' subwords.
    prcnt = float(num_subwords) / vocab_size * 100.0
    
    print('%.1f%%' % prcnt)
    
    Number of subwords: 5,828 of 30,522
    19.1%
    

    作图统计的结果

    sns.countplot(subword_lengths)
    plt.title('Subword Token Lengths (w/o "##")')
    plt.xlabel('Subword Length')
    plt.ylabel('# of ## Subwords')
    

    在这里插入图片描述
    可以自行查看下错误拼写的例子

    'misspelled' in tokenizer.vocab # Right
    'mispelled' in tokenizer.vocab # Wrong
    'government' in tokenizer.vocab # Right
    'goverment' in tokenizer.vocab # Wrong
    'beginning' in tokenizer.vocab # Right
    'begining' in tokenizer.vocab # Wrong
    'separate' in tokenizer.vocab # Right
    'seperate' in tokenizer.vocab # Wrong
    

    对于缩写来说

    "can't" in tokenizer.vocab    # False
    "cant" in tokenizer.vocab    # False
    

    开始子词和中间子词

    对于单个字符,既有单个字符,也有对应每个字符的“##”版本。子词也是如此吗?

    # For each token in the vocabulary...
    for token in tokenizer.vocab.keys():
        
        # If it's a subword...
        if len(token) >= 2 and token[0:2] == '##':
            if not token[2:] in tokenizer.vocab:
                print('Did not find a token for', token[2:])
                break
    

    可以查看到第一个返回的##ly在词表中,但是ly不在词表中

    Did not find a token for ly
    
    '##ly' in tokenizer.vocab    # True
    'ly' in tokenizer.vocab    # False
    

    对于姓名来说

    下载数据

    !pip install wget
    
    import wget
    import random 
    
    print('Beginning file download with wget module')
    
    url = 'http://www.gutenberg.org/files/3201/files/NAMES.TXT'
    wget.download(url, 'first-names.txt')
    

    编码,小写化,输出长度

    # Read them in.
    with open('first-names.txt', 'rb') as f:
        names_encoded = f.readlines()
    
    names = []
    
    # Decode the names, convert to lowercase, and strip newlines.
    for name in names_encoded:
        try:
            names.append(name.rstrip().lower().decode('utf-8'))
        except:
            continue
    
    print('Number of names: {:,}'.format(len(names)))
    print('Example:', random.choice(names))
    

    查看有多少个姓名是在BERT的词表中

    num_names = 0
    
    # For each name in our list...
    for name in names:
    
        # If it's in the vocab...
        if name in tokenizer.vocab:
            # Tally it.
            num_names += 1
    
    print('{:,} names in the vocabulary'.format(num_names))
    

    对于数字来说

    # Count how many numbers are in the vocabulary. 统计词汇表中有多少数字
    count = 0
    
    # For each token in the vocabulary...
    for token in tokenizer.vocab.keys():
    
        # Tally if it's a number.
        if token.isdigit():
            count += 1
            
            # Any numbers >= 10,000?
            if len(token) > 4:
                print(token)
    
    print('Vocab includes {:,} numbers.'.format(count))
    

    计算一下在1600-2021中有几个数字在

    # Count how many dates between 1600 and 2021 are included.
    count = 0 
    for i in range(1600, 2021):
        if str(i) in tokenizer.vocab:
            count += 1
    
    print('Vocab includes {:,} of 421 dates from 1600 - 2021'.format(count))
    
    展开全文
  • 深入Bert实战(Pytorch)----fine-Tuning 1 https://www.bilibili.com/video/BV1K5411t7MD?p=5 https://www.youtube.com/channel/UCoRX98PLOsaN8PtekB9kWrw/videos 深入BERT实战(PyTorch) by ChrisMcCormickAI 这是...
  • 深入Bert实战(Pytorch)----fine-Tuning 2 https://www.bilibili.com/video/BV1K5411t7MD?p=5 https文章目录深入Bert实战(Pytorch)----fine-Tuning 2前言4. Train Our Classification Model4.1. ...
  • c++ tensorflow调用与BERT实战

    千次阅读 2020-04-14 14:34:37
    先贴几个站点,有时间再归纳一下,关于bert实战,后面也会整理出来 reference 使用C++调用TensorFlow模型简单说明 C++运行TensorFlow模型 tensorflow/tensorflow
  • 深入BERT实战(PyTorch) by ChrisMcCormickAI 这是ChrisMcCormickAI在油管BERT的Question Answering with a Fine-Tuned BERT的讲解的代码,在油管视频下有cloab地址,如果不能翻墙的可以留下邮箱我全部.
  • Sentence-BERT实战

    2021-09-24 23:07:39
    本文主要介绍了SBERT作者提供的官方模块的使用实战
  • BERT实战:实现多分类

    2020-11-29 18:59:19
    前面以及介绍过bert的理论知识,以及它相应的实现方法,那么让我们通过实战加深对bert的了解。 我们将通过bert实现一个文本多分类任务,具体是kaggle上的一个真假新闻的任务。具体如下: 文件地址:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,580
精华内容 1,032
关键字:

bert实战