Чи є якісні нестандартні мовні моделі для 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 слів. Що я можу довіряти результатам для загального домену (не лише новин)

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 


Ну, це зовсім не є зручним для використання, але це щось. Дякую :)
Фред

Це заздалегідь підготовлена ​​модель, яку ви можете просто завантажити та запустити, і ви вважаєте, що це "зовсім не легко використовувати" ...
user12075

Я думаю, що ви і я мають дуже різні визначення того, що означає "легко придатний для використання" ... Мені потрібно було б розібратися, як отримати тензофлор, який я хочу (вхід і вихід), і як вони ведуть себе, з'ясувати, чи є якась попередня обробка це, а потім загортайте все в якусь функцію здивування. Я не кажу, що я не можу це зробити, я просто кажу, що це зовсім не «легкопридатна» функція, яку я показав. Але ще раз спасибі за вказівник
Фред

Ви пробували Google? Я чую, що вони отримують досить багато даних :) Не впевнені, чи мають вони точні показники, які ви хочете. cloud.google.com/natural-language/docs
flyingmeatball

Відповіді:


5

У пакеті spaCy є багато мовних моделей , включаючи такі, які навчаються на загальному скані .

Мовна модель має специфічне значення в природній обробці мови (NlP). Мовна модель - це розподіл ймовірностей щодо послідовностей лексем. Враховуючи певну послідовність лексем, модель може призначити ймовірність появи такої послідовності. Мовні моделі SpaCy включають більше, ніж просто розподіл ймовірностей.

Пакет spaCy потрібно встановити, а мовні моделі потрібно завантажити:

$ pip install spacy 
$ python -m spacy download en

Тоді мовні моделі можна використовувати з декількома рядками Python:

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

Для даної моделі та маркера існує згладжена оцінка ймовірності журналу типу слова лексеми, яку можна знайти за допомогою: token.probattribute.


Видалено мої попередні коментарі ... Мабуть, просторість включає належну мовну модель (за допомогою token.probатрибута), але вона вбудована лише у великій версії моделі. Якщо ви редагуєте свою відповідь, щоб включити цю інформацію, я можу дати вам нагороду. Досить смішно, я вже місяцями користуюсь простором і ніде не бачив, щоб у нього була така особливість
Фред,

👍 Радий, що ти знайшов щось, що працює для тебе.
Брайан Шпірінг

Знову ж таки. Це працює лише в тому випадку, якщо ви завантажите велику англійську модель
Фред

6

Я вважаю, що прийнята відповідь невірна.

token.prob - це протокол журналу токена, який є певним типом. Я здогадуюсь, що "type" позначає щось на кшталт POS-тегу чи типу названого об'єкта (це не зрозуміло з документації про компанію), і оцінка є мірою довіри над простором усіх типів.

Це не те саме, що ймовірності, призначені мовною моделлю. Мовна модель дає вам розподіл ймовірності на всі можливі лексеми (не тип), вказуючи, який із них, найімовірніше, відбудеться далі.

Це репо має досить приємну документацію щодо використання BERT (найсучаснішої моделі) із заздалегідь підготовленими вагами для нейронної мережі,

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


5

Я також вважаю, що перша відповідь неправильна з причин, які @ noob333 пояснив.

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

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

Але ви можете використовувати відкриті програми ai gpt або gpt-2 з тієї ж репо ( https://github.com/huggingface/pytorch-pretrained-BERT )

Ось як можна обчислити здивування за допомогою gpt-моделі ( https://github.com/huggingface/pytorch-pretrained-BERT/isissue/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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.