關於中文bert,請問中文ner使用bert時,語料需要先自己分成單個的字再送入模型嗎?

時間 2021-06-03 16:53:15

1樓:洋蔥

肯定是需要的,而且BERT的輸入嚴格來說不是按字,而且按照token,這個token是BERT自帶的tokenization的結果,中文漢字會切分為單個的字元,英文或數字串行會按照一定的規則新增##來降低詞表大小。

2樓:傅聰

需要有個remap的過程、比如訓練時候從BIO標註轉換成模型輸出labels可以這樣做:

import

numpy

asnp

# tokenize後的token與訓練資料的label index不一致

text

='年齡: 18 - 24 歲'

entities=[[

4,11,

'NUM_RANGE'

]]tokens=[

'[CLS]'

,'年'

,'齡'

,':'

,'18'

,'-'

,'24'

,'歲'

,'[SEP]'

]labels=np

.zeros

(len

(tokens

))all_entities=[

'O',

'NUM_RANGE'

]entity2id

=entity_B

=entity_I

=offset=0

fori

,token

inenumerate

(tokens[1

:-1]):

# 不計算 [CLS] [SEP]

stemed_token

=token[2

:]if

token[:2

]=='##'

else

tokenst=

text

[offset:].

find

(stemed_token)if

st<0:

raise

ValueError(f

"token:

不在text: 中")

st+=

offset

offset

+=len

(stemed_token)if

stin

entity_B

:labels[i

+1]=

entity2id

[entity_B[st

]]*2+

1# B-

entity_B

.pop(st

)[entity_I

.pop(st

+idx

)for

idxin

range(1

,len

(stemed_token

))]elif

stin

entity_I

:labels[i

+1]=

entity2id

[entity_I[st

]]*2+

2# I-

[entity_I

.pop(st

+idx

)for

idxin

range

(len

(stemed_token

))]針對tokenize邊界與訓練資料邊界不一致等等的其他問題就根據實際情況取捨了。

3樓:Honda

分詞,分字都可以。一般情況下分字就可以了。如果是中英文混合的,英文按照bert的標準分詞,wordpiece 分詞即可..

關於base64的中文編碼?

basic13 先問是不是,再問為什麼。並非所有的中文的base64編碼都是以5開頭的,比如 耀 以6開頭,還有 以4開頭。不過呢,中文大部分是以5開頭的。要了解為什麼會如此,可以先從base64編碼的原理說起。Base64大致上是在將原始資料按照3位元組的24個bit切分,每6個bit一組,每組前...

請問Phabricator如何支援中文搜尋?

Jimmy 讓Phabricator支援中文的全文搜尋 https huang.sh 2016 11 E8 AE 如果你的MySQL是5.7.6或者更高版本,登入到Phabricator所使用的MySQL資料庫上,執行如下SQL語句。USE phabricator search DROP INDEX...

關於備考CMA,中文,報班還是自學?

金魚不冒泡 我這個人學習的自覺性其實不算低的 自認為 之前自己是有自學過一段時間的,但學習起來動力不足,而且感覺學的內容不系統,最終還是選擇了報班,報班的費用對學生來說確實不低,但我覺得價效比這個事情也是需要考慮到的,我覺得自學除非自己能力,自制力身份強,不然還是老老實實報班吧,錢花的是有一定道理的...