Transformer 是當代自然語言處理最重要的技術了,如果您對於 Word2vec、RNN、seq2seq 等等之類的技術不太熟悉,那麼就先放著沒關係,之後有時間再去補上這方面的知識即可。
我們今天就來用 transformer 做一個最基本的文本分類。
from transformers import AutoTokenizer
tokenizer_name = "distilbert-base-uncased-finetuned-sst-2-english"
tokenizer = AutoTokenizer.from_pretrained(tokenizer_name)
string_arr = [
"Only those who will risk going too far can possibly find out how far one can go.",
"Baby shark, doo doo doo doo doo doo, Baby shark!"
]
inputs = tokenizer(string_arr, padding=True, truncation=True, return_tensors="pt")
print(inputs)
會得到:
{'input_ids': tensor([[ 101, 2069, 2216, 2040, 2097, 3891, 2183, 2205, 2521, 2064,
4298, 2424, 2041, 2129, 2521, 2028, 2064, 2175, 1012, 102],
[ 101, 3336, 11420, 1010, 20160, 20160, 20160, 20160, 20160, 20160,
1010, 3336, 11420, 999, 102, 0, 0, 0, 0, 0]]), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0]])}
from transformers import AutoModelForSequenceClassification
model_name = "distilbert-base-uncased-finetuned-sst-2-english"
model = AutoModelForSequenceClassification.from_pretrained(model_name)
outputs = model(**inputs)
print(outputs.logits)
,會得到下面的結果。tensor([[ 0.9738, -0.8098],
[-1.1881, 1.2323]], grad_fn=<AddmmBackward0>)
import torch
predictions = torch.nn.functional.softmax(outputs.logits, dim=-1)
print(predictions)
會得到下面的結果:
tensor([[0.8561, 0.1439],
[0.0816, 0.9184]], grad_fn=<SoftmaxBackward0>)
這裡我們就可以看出,第一句話的結果是 [0.8561, 0.1439]
,也是說第0個結果的機率是0.8561,第1個結果的機率是0.1439。
而第二句話的結果是[0.0816, 0.9184]
。依此類推,第0個結果的機率是0.0816,第1個結果的機率是0.9184。
model.config.id2label
{0: 'NEGATIVE', 1: 'POSITIVE'}
你都願意向遠方出發冒險前進了,但是你還是不一定能知道自己能走多遠,只是有機會能夠知道而已。這句話雖然有其正面性,鼓勵你冒險遠方,但是 possibly 那個詞,就讓它添上了負面與消極感的色彩了。這個 distilbert 模型挺準確的,NEGATIVE 的機率是 0.8561,讀出這麼幽微且細緻的意涵。
如果你把那個 possibly,改成 definitely,就會得到完全相反的結果了哦!真的很有趣!