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)

Fred
źródło
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.

Brian Spiering
źródło
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 ).

noob333
źródło
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
chłopaki
źródło