Python için kullanıma hazır iyi dil modelleri var mı?


11

Ben bir uygulama prototip ve bazı oluşturulan cümleler üzerinde şaşkınlık hesaplamak için bir dil modeline ihtiyacım var.

Python'da kolayca kullanabileceğim eğitimli bir dil modeli var mı? Gibi basit bir şey

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

Bazı çerçevelere baktım ama istediğimi bulamadım. Şunun gibi bir şey kullanabileceğimi biliyorum:

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

Bu Brown Corpus üzerinde iyi bir turing olasılığı dağılımı kullanıyor, ancak 1b kelime veri seti gibi bazı büyük veri kümesinde iyi hazırlanmış bir model arıyordum. Genel bir alanın sonuçlarına güvenebileceğim bir şey (sadece haberler için değil)

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 


Bu hiç de kolay değil ama bir şey. Teşekkürler :)
Fred

Bu, sadece indirip çalıştırabileceğiniz önceden eğitilmiş bir modeldir ve bunun "hiç de kullanışlı değil" olduğunu düşünüyorsunuz ...
user12075

Sanırım ben ve benim "kolayca kullanılabilir" ne anlama geldiğinin çok farklı tanımları var ... İstediğim tensorflow op'larını (giriş ve çıkış) nasıl alacağımı ve nasıl davrandıklarını anlamaya ihtiyacım var. bunu yapın ve ardından her şeyi bazı şaşkınlık işlevine sarın. Bunu yapamayacağımı söylemiyorum, sadece gösterdiğim "kolayca kullanılabilir" bir fonksiyon olmadığını söylüyorum. Ama yine, işaretçi için teşekkürler
Fred

Google'ı denediniz mi? Verileri adil bir miktarda aldıklarını duyuyorum :) Emin olduğunuz tam metriklere sahip olup olmadıklarından emin değilim. cloud.google.com/natural-language/docs
flyingmeatball

Yanıtlar:


5

Clean paketi çok var dil modellerini üzerinde eğitilmiş olanlar dahil, Ortak Tara .

Dil modeli Doğal Dil İşlemede (NlP) özel bir anlamı vardır. Bir dil modeli, belirteç dizileri üzerinde bir olasılık dağılımıdır. Belirli bir belirteç dizisi verildiğinde, model bu dizinin görünme olasılığını atayabilir. SpaCy'nin dil modelleri, bir olasılık dağılımından daha fazlasını içerir.

SpaCy paketinin yüklenmesi ve dil modellerinin indirilmesi gerekiyor:

$ pip install spacy 
$ python -m spacy download en

Daha sonra dil modelleri birkaç satır Python ile kullanılabilir:

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

Belirli bir model ve jeton için, jetonun kelime türünün düzeltilmiş bir günlük olasılık tahmini vardır: token.proböznitelik.


Önceki yorumlarımı sildim ... Görünüşe göre spacy, uygun bir dil modeli ( token.probözniteliği kullanarak ) içeriyor , ancak yalnızca büyük model sürümünde oluşturulmuş. Cevabınızı bu bilgiyi içerecek şekilde düzenlerseniz, size ödül verebilirim. Yeterince komik, aylardır spac kullanıyorum ve hiçbir yerde bu özelliğe sahip olduğunu görmedim
Fred

👍 Size uygun bir şey bulduğunuza sevindim.
Brian Spiering

Yine .. Bu sadece büyük İngiliz modelini indirirseniz çalışır
Fred

6

Bence kabul edilen cevap yanlış.

token.prob, belirli bir tür olan tokenin log-probudur. Tahmin ediyorum 'türü' POS etiketi veya adlandırılmış varlık türü (spacy belgelerinden açık değildir) gibi bir şey anlamına gelir ve puan her türlü alan üzerinde bir güven ölçüsüdür.

Bu, bir dil modeli tarafından atanan olasılıklarla aynı şey değildir . Bir dil modeli, hangisinin daha sonra gerçekleşme olasılığının yüksek olduğunu söyleyerek tüm olası belirteçler (tür değil) üzerinde olasılık dağılımı sağlar.

Bu repo, sinir ağı için önceden eğitilmiş ağırlıklar ile BERT (son teknoloji ürünü bir model) kullanımı hakkında oldukça güzel belgelere sahiptir,

API'lerin size doğrudan şaşkınlık vermediğini düşünüyorum, ancak her jeton için olasılık puanlarını kolayca alabilmelisiniz ( https://github.com/huggingface/pytorch-pretrained-BERT#usage ).


5

Ayrıca ilk cevabın @ noob333 açıklamasının nedenlerinden dolayı yanlış olduğunu düşünüyorum.

Ancak Bert, kutunun dışında bir dil modeli olarak kullanılamaz. Bert size p(word|context(both left and right) )ve istediğiniz şeyi hesaplamaktır p(word|previous tokens(only left contex)). Yazar burada açıklıyor: https://github.com/google-research/bert/issues/35 neden lm olarak kullanamıyorsunuz.

Ancak Bert'i uyarlayabilir ve burada açıklandığı gibi bir dil modeli olarak kullanabilirsiniz: https://arxiv.org/pdf/1902.04094.pdf

Ancak aynı repodaki açık hava gpt veya gpt-2 önceden hazırlanmış modelleri kullanabilirsiniz ( https://github.com/huggingface/pytorch-pretrained-BERT )

İşte gpt modelini kullanarak şaşkınlığı nasıl hesaplayabilirsiniz ( 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.