Có mô hình ngôn ngữ ngoài luồng nào tốt cho python không?


11

Tôi đang tạo mẫu cho một ứng dụng và tôi cần một mô hình ngôn ngữ để tính toán sự bối rối trên một số câu được tạo.

Có mô hình ngôn ngữ được đào tạo nào trong python tôi có thể dễ dàng sử dụng không? Một cái gì đó đơn giản như

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

Tôi đã xem xét một số khung nhưng không thể tìm thấy những gì tôi muốn. Tôi biết tôi có thể sử dụng một cái gì đó như:

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

Điều này sử dụng phân phối xác suất bảo mật tốt trên Brown Corpus, nhưng tôi đã tìm kiếm một số mô hình được chế tạo tốt trên một số tập dữ liệu lớn, như tập dữ liệu 1b words. Một cái gì đó mà tôi thực sự có thể tin tưởng vào kết quả cho một tên miền chung (không chỉ tin tức)

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 


Vâng, điều này không phải là có thể sử dụng được nhưng nó là một cái gì đó. Cảm ơn :)
Fred

Đó là một mô hình được đào tạo trước mà bạn có thể tải xuống và chạy một cách đơn giản và bạn nghĩ rằng "hoàn toàn không thể sử dụng được" ...
user12075

Tôi nghĩ rằng bạn và tôi có những định nghĩa rất khác nhau về ý nghĩa của "có thể sử dụng được" nghĩa là gì ... Tôi sẽ cần phải tìm ra cách để có được các dòng chảy căng thẳng mà tôi muốn (đầu vào và đầu ra) và cách chúng hoạt động, tìm hiểu xem có bất kỳ quá trình tiền xử lý nào không này và sau đó bọc mọi thứ trong một số chức năng bối rối. Tôi không nói rằng tôi không thể làm điều đó, tôi chỉ nói rằng nó hoàn toàn không phải là chức năng "có thể sử dụng được" mà tôi đã thể hiện. Nhưng một lần nữa, cảm ơn con trỏ
Fred

Bạn đã thử google chưa? Tôi nghe nói họ nhận được một lượng dữ liệu hợp lý :) Không chắc họ có số liệu chính xác mà bạn theo dõi không. cloud.google.com/natural-lingu/docs
Flyingmeatball

Câu trả lời:


6

Các Spacy gói có nhiều mô hình ngôn ngữ , bao gồm cả những người được đào tạo về Common thu thập thông tin .

Mô hình ngôn ngữ có một ý nghĩa cụ thể trong Xử lý ngôn ngữ tự nhiên (NlP). Mô hình ngôn ngữ là phân phối xác suất theo chuỗi các mã thông báo. Đưa ra một chuỗi các mã thông báo cụ thể, mô hình có thể chỉ định xác suất của chuỗi đó xuất hiện. Các mô hình ngôn ngữ của SpaCy không chỉ bao gồm phân phối xác suất.

Gói spaCy cần được cài đặt và các mô hình ngôn ngữ cần được tải xuống:

$ pip install spacy 
$ python -m spacy download en

Sau đó, các mô hình ngôn ngữ có thể được sử dụng với một vài dòng Python:

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

Đối với một mô hình và mã thông báo nhất định, có thể tìm thấy ước tính xác suất nhật ký được làm mịn của loại từ của mã thông báo với: token.probthuộc tính.


Đã xóa các nhận xét trước đây của tôi ... Rõ ràng spacy không bao gồm một mô hình ngôn ngữ phù hợp (sử dụng token.probthuộc tính), nhưng nó chỉ được xây dựng trong phiên bản mô hình lớn. Nếu bạn chỉnh sửa câu trả lời của mình để bao gồm thông tin đó, tôi có thể cung cấp cho bạn tiền thưởng. Hài hước lắm, tôi đã sử dụng spacy trong nhiều tháng nay và không nơi nào tôi thấy rằng nó có tính năng này
Fred

Vui mừng bạn đã tìm thấy một cái gì đó phù hợp với bạn.
Brian Spiering

Một lần nữa .. Điều này chỉ hoạt động nếu bạn tải xuống mô hình tiếng Anh lớn
Fred

4

Tôi nghĩ rằng câu trả lời được chấp nhận là không chính xác.

token.prob là log-prob của mã thông báo là một loại cụ thể. Tôi đoán 'loại' đề cập đến một cái gì đó như thẻ POS hoặc loại thực thể được đặt tên (không rõ ràng từ tài liệu của spacy) và điểm số là thước đo độ tin cậy đối với không gian của tất cả các loại.

Điều này không giống với xác suất được chỉ định bởi một mô hình ngôn ngữ. Một mô hình ngôn ngữ cung cấp cho bạn phân phối xác suất trên tất cả các mã thông báo có thể (không phải loại) cho biết loại nào có khả năng xảy ra tiếp theo.

Repo này có tài liệu khá hay về việc sử dụng BERT (một mô hình hiện đại) với các trọng số được đào tạo trước cho mạng lưới thần kinh,

Tôi nghĩ rằng API không cung cấp cho bạn sự bối rối trực tiếp nhưng bạn sẽ có thể nhận được điểm xác suất cho mỗi mã thông báo khá dễ dàng ( https://github.com/huggingface/pytorch-pretrained-BERT#usage ).


2

Tôi cũng nghĩ rằng câu trả lời đầu tiên là không chính xác vì những lý do mà @ noob333 giải thích.

Nhưng cũng không thể sử dụng Bert ngoài hộp như một mô hình ngôn ngữ. Bert cung cấp cho bạn p(word|context(both left and right) )và những gì bạn muốn là tính toán p(word|previous tokens(only left contex)). Tác giả giải thích ở đây: https://github.com/google-research/bert/issues353 tại sao bạn không thể sử dụng nó như một lm.

Tuy nhiên, bạn có thể điều chỉnh Bert và sử dụng nó làm mô hình ngôn ngữ, như được giải thích tại đây: https://arxiv.org/pdf/1902.04094.pdf

Nhưng bạn có thể sử dụng các mô hình mở sẵn ai gpt hoặc gpt-2 từ cùng một repo ( https://github.com/huggingface/pytorch-pretrained-BERT )

Đây là cách bạn có thể tính toán sự bối rối bằng mô hình 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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.