Czy są jakieś dobre gotowe modele językowe dla Pythona?


11

Prototypuję aplikację i potrzebuję modelu językowego, aby obliczyć zakłopotanie w przypadku niektórych wygenerowanych zdań.

Czy istnieje jakiś wyuczony model języka w Pythonie, którego można łatwo używać? Coś prostego jak

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

Patrzyłem na niektóre frameworki, ale nie mogłem znaleźć tego, czego chcę. Wiem, że mogę użyć czegoś takiego:

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

Wykorzystuje to dobry rozkład prawdopodobieństwa Turinga na Korpusie Browna, ale szukałem dobrze spreparowanego modelu na dużym zestawie danych, takim jak zestaw danych 1b słów. Coś, czemu mogę zaufać wynikom dla domeny ogólnej (nie tylko wiadomości)

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 


Cóż, to wcale nie jest łatwe do użycia, ale jest coś. Dzięki :)
Fred

To wstępnie wyszkolony model, który można po prostu pobrać i uruchomić, a uważasz, że „wcale nie jest łatwo dostępny” ...
user12075

Wydaje mi się, że ty i ja mamy bardzo różne definicje tego, co oznacza „gotowy do użycia”… Musiałbym dowiedzieć się, jak uzyskać pożądane operacje przepływu tensorflow (wejściowe i wyjściowe) i jak się zachowują, dowiedzieć się, czy jest jakieś wstępne przetwarzanie i następnie zawiń wszystko w jakąś funkcję zakłopotania. Nie mówię, że nie mogę tego zrobić, po prostu mówię, że wcale nie jest to funkcja „łatwo użyteczna”, którą pokazałem. Ale znowu dzięki za wskazówkę
Fred

Czy próbowałeś google? Słyszałem, że dostają sporo danych :) Nie jestem pewien, czy mają dokładnie te dane, których szukasz. cloud.google.com/natural-language/docs
flyingmeatball

Odpowiedzi:


5

Spacy pakiet ma wiele modeli językowych , w tym te, które przeszkolone na wspólnej Crawl .

Model językowy ma określone znaczenie w przetwarzaniu języka naturalnego (NlP). Model językowy to rozkład prawdopodobieństwa między sekwencjami tokenów. Biorąc pod uwagę określoną sekwencję tokenów, model może przypisać prawdopodobieństwo wystąpienia tej sekwencji. Modele językowe SpaCy obejmują coś więcej niż rozkład prawdopodobieństwa.

Pakiet spaCy musi zostać zainstalowany, a modele językowe należy pobrać:

$ pip install spacy 
$ python -m spacy download en

Następnie modele językowe mogą być używane z kilkoma liniami Pythona:

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

Dla danego modelu i tokena istnieje wygładzone oszacowanie prawdopodobieństwa logarytmu typu słowa tokena, które można znaleźć za pomocą: token.probatrybutu.


Usunąłem moje poprzednie komentarze ... Najwyraźniej spacy zawiera odpowiedni model językowy (używając token.probatrybutu), ale jest wbudowany tylko w wersję dużego modelu. Jeśli zmodyfikujesz swoją odpowiedź, aby uwzględnić te informacje, mogę dać ci nagrodę. Zabawne, używam spacy od miesięcy i nigdzie nie widziałem, żeby miał tę funkcję
Fred

👍 Cieszę się, że znalazłeś coś, co Ci odpowiada.
Brian Spiering

Znowu .. Działa to tylko, jeśli pobierzesz duży angielski model
Fred

6

Myślę, że zaakceptowana odpowiedź jest nieprawidłowa.

token.prob jest log-prob z tokena będącego określonego typu. Zgaduję, że „typ” odnosi się do czegoś takiego jak POS-tag lub typ nazwanego bytu (nie wynika to z dokumentacji spacy), a wynik jest miarą pewności względem przestrzeni wszystkich typów.

To nie to samo, co prawdopodobieństwa przypisane przez model językowy. Model językowy daje rozkład prawdopodobieństwa na wszystkie możliwe tokeny (nie typ), mówiąc, który z nich najprawdopodobniej wystąpi w następnej kolejności.

To repozytorium ma całkiem niezłą dokumentację na temat używania BERT (najnowocześniejszego modelu) z wstępnie wyszkolonymi obciążnikami dla sieci neuronowej,

Myślę, że interfejsy API nie dają bezpośredniej dezorientacji, ale powinieneś być w stanie dość łatwo uzyskać wyniki prawdopodobieństwa dla każdego tokena ( https://github.com/huggingface/pytorch-pretrained-BERT#usage ).


4

Myślę też, że pierwsza odpowiedź jest niepoprawna z powodów wyjaśnionych przez @ noob333.

Ale również Bert nie może być używany od razu jako model językowy. Bert daje ci p(word|context(both left and right) )to, czego chcesz, to obliczenia p(word|previous tokens(only left contex)). Autor wyjaśnia tutaj: https://github.com/google-research/bert/issues/35 dlaczego nie można użyć go jako lm.

Możesz jednak dostosować Bert i używać go jako modelu językowego, jak wyjaśniono tutaj: https://arxiv.org/pdf/1902.04094.pdf

Ale możesz użyć otwartych wstępnie zabezpieczonych modeli AIpt lub GPT-2 z tego samego repozytorium ( https://github.com/huggingface/pytorch-pretrained-BERT )

Oto, jak możesz obliczyć problem za pomocą modelu 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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.