Apakah ada model bahasa out-of-the-box yang bagus untuk python?

11

Saya membuat prototipe aplikasi dan saya membutuhkan model bahasa untuk menghitung kebingungan pada beberapa kalimat yang dihasilkan.

Apakah ada model bahasa terlatih dalam python yang bisa saya gunakan? Sesuatu yang sederhana seperti

model = LanguageModel('en')
p1 = model.perplexity('This is a well constructed sentence')
p2 = model.perplexity('Bunny lamp robert junior pancake')
assert p1 < p2

Saya telah melihat beberapa kerangka kerja tetapi tidak dapat menemukan apa yang saya inginkan. Saya tahu saya bisa menggunakan sesuatu seperti:

from nltk.model.ngram import NgramModel
lm = NgramModel(3, brown.words(categories='news'))

Ini menggunakan distribusi probabilitas turing yang baik pada Brown Corpus, tetapi saya sedang mencari beberapa model yang dibuat dengan baik pada beberapa dataset besar, seperti dataset kata 1b. Sesuatu yang benar-benar dapat saya percayai hasil untuk domain umum (bukan hanya berita)

Fred
sumber
2
Tensorflow 1b kata LM
user12075
Yah ini sama sekali tidak dapat digunakan tetapi itu adalah sesuatu. Terima kasih :)
Fred
Itu adalah model yang sudah dilatih sebelumnya yang bisa Anda unduh dan jalankan, dan Anda pikir itu "sama sekali tidak mudah digunakan" ...
user12075
Saya pikir Anda dan saya memiliki definisi yang sangat berbeda tentang apa yang "dapat digunakan" berarti ... Saya perlu mencari cara untuk mendapatkan operasi tensorflow yang saya inginkan (input dan output) dan bagaimana mereka berperilaku, mencari tahu apakah ada preprocessing untuk ini dan kemudian bungkus semuanya dalam beberapa fungsi kebingungan. Saya tidak mengatakan saya tidak bisa melakukannya, saya hanya mengatakan itu sama sekali bukan fungsi "siap digunakan" yang saya tunjukkan. Tapi sekali lagi, terima kasih untuk penunjuknya
Fred
Sudahkah Anda mencoba google? Saya dengar mereka mendapatkan cukup banyak data :) Tidak yakin apakah mereka memiliki metrik yang Anda cari. cloud.google.com/natural-language/docs
flyingmeatball

Jawaban:

5

The spacy paket memiliki banyak model bahasa , termasuk yang dilatih umum Crawl .

Model bahasa memiliki arti khusus dalam Natural Language Processing (NlP). Model bahasa adalah distribusi probabilitas melalui urutan token. Diberikan urutan token tertentu, model dapat menetapkan probabilitas munculnya urutan itu. Model bahasa SpaCy mencakup lebih dari sekedar distribusi probabilitas.

Paket spaCy perlu diinstal dan model bahasa perlu diunduh:

$ pip install spacy 
$ python -m spacy download en

Kemudian model bahasa dapat digunakan dengan beberapa baris Python:

>>> import spacy
>>> nlp = spacy.load('en')

Untuk model dan token yang diberikan, ada estimasi probabilitas log yang dihaluskan dari jenis kata token yang dapat ditemukan dengan: token.probatribut.

Brian Spiering
sumber
Menghapus komentar saya sebelumnya ... Rupanya spacy memasukkan model bahasa yang tepat (menggunakan token.probatribut), tetapi itu hanya dibangun dalam versi model besar. Jika Anda mengedit jawaban Anda untuk memasukkan info itu, saya bisa memberi Anda hadiah. Cukup lucu, saya telah menggunakan spacy selama berbulan-bulan sekarang dan di mana pun saya melihat bahwa ia memiliki fitur ini
Fred
👍 Senang Anda menemukan sesuatu yang bekerja untuk Anda.
Brian Spiering
Lagi .. Ini hanya berfungsi jika Anda mengunduh model bahasa Inggris yang besar
Fred
6

Saya pikir jawaban yang diterima salah.

token.prob adalah log-prob dari token yang menjadi tipe tertentu. Saya menebak 'tipe' mengacu pada sesuatu seperti POS-tag atau tipe entitas yang dinamai (tidak jelas dari dokumentasi spacy) dan skornya adalah ukuran kepercayaan atas ruang semua jenis.

Ini tidak sama dengan probabilitas yang diberikan oleh model bahasa. Model bahasa memberi Anda distribusi probabilitas atas semua token yang mungkin (bukan tipe) yang mengatakan dari mereka yang paling mungkin terjadi selanjutnya.

Repo ini memiliki dokumentasi yang cukup bagus tentang penggunaan BERT (model mutakhir) dengan bobot pra-terlatih untuk jaringan saraf,

Saya pikir API tidak memberikan Anda kebingungan secara langsung tetapi Anda harus bisa mendapatkan skor probabilitas untuk setiap token dengan mudah ( https://github.com/huggingface/pytorch-pretrained-BERT#usage ).

noob333
sumber
4

Saya juga berpikir bahwa jawaban pertama salah karena alasan yang dijelaskan @ noob333.

Tetapi juga Bert tidak dapat digunakan di luar kotak sebagai model bahasa. Bert memberi Anda p(word|context(both left and right) )dan apa yang Anda inginkan adalah menghitung p(word|previous tokens(only left contex)). Penulis menjelaskan di sini: https://github.com/google-research/bert/issues/35 mengapa Anda tidak dapat menggunakannya sebagai lm.

Namun Anda dapat mengadaptasi Bert dan menggunakannya sebagai model bahasa, seperti yang dijelaskan di sini: https://arxiv.org/pdf/1902.04094.pdf

Tetapi Anda dapat menggunakan model open ai gpt atau gpt-2 dari repo yang sama ( https://github.com/huggingface/pytorch-pretrained-BERT )

Inilah cara Anda dapat menghitung kebingungan dengan menggunakan model gpt ( https://github.com/huggingface/pytorch-pretrained-BERT/issues/473 )

import math
from pytorch_pretrained_bert import OpenAIGPTTokenizer, OpenAIGPTModel, OpenAIGPTLMHeadModel
# Load pre-trained model (weights)
model = OpenAIGPTLMHeadModel.from_pretrained('openai-gpt')
model.eval()
# Load pre-trained model tokenizer (vocabulary)
tokenizer = OpenAIGPTTokenizer.from_pretrained('openai-gpt')

def score(sentence):
    tokenize_input = tokenizer.tokenize(sentence)
    tensor_input = torch.tensor([tokenizer.convert_tokens_to_ids(tokenize_input)])
    loss=model(tensor_input, lm_labels=tensor_input)
    return math.exp(loss)


a=['there is a book on the desk',
                'there is a plane on the desk',
                        'there is a book in the desk']
print([score(i) for i in a])
21.31652459381952, 61.45907380241148, 26.24923942649312
pemuda
sumber