Существуют ли хорошие готовые языковые модели для Python?

11

Я создаю прототип приложения и мне нужна языковая модель для вычисления недоумения в некоторых сгенерированных предложениях.

Есть ли в Python обученная языковая модель, которую я могу легко использовать? Что-то простое, как

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

Я посмотрел на некоторые рамки, но не смог найти то, что я хочу. Я знаю, что могу использовать что-то вроде:

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

Это использует хорошее распределение вероятности тьюринга в Brown Corpus, но я искал какую-то хорошо продуманную модель для некоторого большого набора данных, такого как набор данных 1b words. То, что я могу доверять результатам для общего домена (не только новости)

Фред
источник
Ну, это совсем не легко использовать, но это что-то. Спасибо :)
Фред
Это предварительно обученная модель, которую вы можете просто загрузить и запустить, и вы думаете, что она «совсем не пригодна для использования» ...
user12075
Я думаю, что у нас с вами совершенно разные определения того, что означает «готовый к использованию» ... Мне нужно выяснить, как получить нужные мне операции с тензорным потоком (ввод и вывод) и как они себя ведут, выяснить, есть ли какая-либо предварительная обработка для это и затем обернуть все в некоторую функцию недоумения. Я не говорю, что не могу этого сделать, я просто говорю, что это вовсе не «легкодоступная» функция, которую я показал. Но опять же, спасибо за указатель
Фред
Вы пробовали Google? Я слышал, что они получают достаточное количество данных :) Не уверен, что у них есть точные метрики, которые вы ищете. cloud.google.com/natural-language/docs
flyingmeatball

Ответы:

5

В пакете spaCy есть много языковых моделей , в том числе обученных на Common Crawl .

Языковая модель имеет особое значение в обработке естественного языка (NlP). Языковая модель - это распределение вероятностей по последовательностям токенов. При заданной последовательности токенов модель может назначить вероятность появления этой последовательности. Языковые модели SpaCy включают в себя больше, чем просто распределение вероятностей.

Необходимо установить пакет spaCy и загрузить языковые модели:

$ pip install spacy 
$ python -m spacy download en

Тогда языковые модели можно использовать с парой строк Python:

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

Для данной модели и токена существует сглаженная логарифмическая оценка вероятности типа слова токена с token.probатрибутом :.

Брайан Спиринг
источник
Удалены мои предыдущие комментарии ... Видимо, spacy включает правильную языковую модель (с использованием token.probатрибута), но она встроена только в версию большой модели. Если вы отредактируете свой ответ, включив эту информацию, я могу дать вам награду. Как ни странно, я уже несколько месяцев пользуюсь spacy, и нигде не видел, чтобы у него была эта функция
Фред,
👍 Рад, что вы нашли то, что работает для вас.
Брайан Спиеринг
Опять же .. Это работает только если вы скачиваете большой английскую модель
Фред
6

Я думаю, что общепринятый ответ неверен.

token.prob является логом-пробами из маркеров являются конкретным типом. Я предполагаю, что «типа» относится к чему-то, как POS-тег или типа имени объекта (это не ясно из документации Spacy), и оценкой является мерой доверия над пространством всех типов.

Это не то же самое , как и вероятности , приписанная модель языка. Языковая модель дает вам распределение вероятностей по всем возможным токенам (не по типу) с указанием того, какой из них наиболее вероятен следующим.

Этот репозиторий имеет довольно хорошую документацию по использованию BERT (современной модели) с предварительно обученными весами для нейронной сети,

Я думаю, что API не дает вам затруднений напрямую, но вы должны быть в состоянии получить оценки вероятности для каждого токена довольно легко ( https://github.com/huggingface/pytorch-pretrained-BERT#usage ).

noob333
источник
4

Я также думаю, что первый ответ неверен по причинам, которые объяснил @ noob333.

Но и Берт не может использоваться из коробки в качестве языковой модели. Берт дает вам то, p(word|context(both left and right) )что вы хотите, чтобы вычислить p(word|previous tokens(only left contex)). Автор объясняет здесь: https://github.com/google-research/bert/issues/35, почему вы не можете использовать его в качестве lm.

Однако вы можете адаптировать Bert и использовать его в качестве языковой модели, как описано здесь: https://arxiv.org/pdf/1902.04094.pdf

Но вы можете использовать готовые модели open ai gpt или gpt-2 из того же репо ( https://github.com/huggingface/pytorch-pretrained-BERT )

Вот как вы можете вычислить недоумение, используя модель 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
братва
источник