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)

python  nlp  language-model  r  statistics  linear-regression  machine-learning  classification  random-forest  xgboost  python  sampling  data-mining  orange  predictive-modeling  recommender-system  statistics  dimensionality-reduction  pca  machine-learning  python  deep-learning  keras  reinforcement-learning  neural-network  image-classification  r  dplyr  deep-learning  keras  tensorflow  lstm  dropout  machine-learning  sampling  categorical-data  data-imputation  machine-learning  deep-learning  machine-learning-model  dropout  deep-network  pandas  data-cleaning  data-science-model  aggregation  python  neural-network  reinforcement-learning  policy-gradients  r  dataframe  dataset  statistics  prediction  forecasting  r  k-means  python  scikit-learn  labels  python  orange  cloud-computing  machine-learning  neural-network  deep-learning  rnn  recurrent-neural-net  logistic-regression  missing-data  deep-learning  autoencoder  apache-hadoop  time-series  data  preprocessing  classification  predictive-modeling  time-series  machine-learning  python  feature-selection  autoencoder  deep-learning  keras  tensorflow  lstm  word-embeddings  predictive-modeling  prediction  machine-learning-model  machine-learning  classification  binary  theory  machine-learning  neural-network  time-series  lstm  rnn  neural-network  deep-learning  keras  tensorflow  convnet  computer-vision 


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.


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 ).


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.