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'))

これはブラウンコーパスの優れたチューリング確率分布を使用していますが、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

あなたと私には、「すぐに使える」という意味について非常に異なる定義があると思います...必要なテンソルフロー演算(入力と出力)を取得する方法と、それらがどのように動作するか、前処理があるかどうかを知る必要があります。これを次に、すべてをいくつかの混乱関数にラップします。私がそれを行うことができないと言っているのではなく、私が示した「すぐに使える」機能がまったくないと言っているだけです。しかし、もう一度、ポインタに感謝します
フレッド

グーグルを試しましたか?彼らはかなりの量のデータを取得すると聞いています:)彼らがあなたが求めている正確なメトリックスを持っているかどうかはわかりません cloud.google.com/natural-language/docs
flyingmeatball

回答:


5

スペイシーのパッケージには、多くの持っている言語モデルに訓練されたものも含め、一般的なクロールを

言語モデルは、自然言語処理(NLP)で特定の意味を持っています。言語モデルは、一連のトークンにわたる確率分布です。トークンの特定のシーケンスが与えられると、モデルはそのシーケンスが現れる確率を割り当てることができます。SpaCyの言語モデルには、確率分布だけではありません。

spaCyパッケージをインストールし、言語モデルをダウンロードする必要があります。

$ pip install spacy 
$ python -m spacy download en

次に、言語モデルを数行のPythonで使用できます。

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

特定のモデルとトークンについて、トークンの単語タイプの平滑化された対数確率推定があり、token.prob属性を使用して見つけることができます。


以前のコメントを削除しました...どうやらspacyには適切な言語モデル(token.prob属性を使用)が含まれているようですが、それは大規模モデルバージョンにのみ組み込まれています。回答を編集してその情報を含めると、賞金を差し上げます。面白いことに、私は数か月間スペイシーを使用してきましたが、この機能が
Fred

youあなたのために働く何かを見つけてうれしいです。
ブライアンスピアリング2018

繰り返しますが、これは大きな英語モデルをダウンロードした場合にのみ機能します
Fred

6

受け入れられた答えは正しくないと思います。

token.probは、特定のタイプであるトークンのlog-probです。「タイプ」はPOSタグや名前付きエンティティのタイプ(スペイシーのドキュメントからは明らかではありません)のようなものを指し、スコアはすべてのタイプのスペースに対する信頼度の尺度であると思います。

これは、いない言語モデルによって割り当てられた確率と同じ。言語モデルは、可能なすべてのトークン(タイプではない)の確率分布を提供し、次に出現する可能性が最も高いトークンを示します。

このリポジトリには、ニューラルネットワーク用の事前トレーニング済みの重みを持つBERT(最先端のモデル)の使用に関するかなり優れたドキュメントがあります。

私はAPIが混乱を直接与えることはないと思いますが、各トークンの確率スコアを非常に簡単に取得できるはずです(https://github.com/huggingface/pytorch-pretrained-BERT#usage)。


4

また、@ noob333が説明した理由により、最初の答えは正しくないと思います。

しかし、Bertをそのまま言語モデルとして使用することはできません。バートはあなたにあなたに与え、あなたp(word|context(both left and right) )が望むのは計算することですp(word|previous tokens(only left contex))。著者はここで説明します:https : //github.com/google-research/bert/issues/35なぜそれをlmとして使用できないのですか?

ただし、https//arxiv.org/pdf/1902.04094.pdfで説明されているように、Bertを適応させて言語モデルとして使用できます。

ただし、同じリポジトリのオープンAI GPTまたはGPT-2事前保持モデルを使用できます(https://github.com/huggingface/pytorch-pretrained-BERT

これは、gptモデルを使用してperplexityを計算する方法です(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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.