質問があります? TensorFlowフォーラム訪問フォーラムでコミュニティとつながる

ユニバーサルセンテンスエンコーダ

TensorFlow.orgで表示 GoogleColabで実行 GitHubで表示ノートブックをダウンロードするTFハブモデルを参照してください

このノートブックは、Universal Sentence Encoderにアクセスし、文の類似性と文の分類タスクに使用する方法を示しています。

Universal Sentence Encoderを使用すると、これまで個々の単語の埋め込みを検索するのと同じくらい簡単に、文レベルの埋め込みを取得できます。次に、文の埋め込みを簡単に使用して、文レベルの意味の類似性を計算したり、教師なしトレーニングデータを使用してダウンストリーム分類タスクのパフォーマンスを向上させたりできます。

セットアップ

このセクションでは、TFハブ上のUniversal Sentence Encoderにアクセスするための環境を設定し、エンコーダーを単語、文、および段落に適用する例を示します。

%%capture
!pip3 install seaborn

Tensorflowのインストールの詳細については、 https: //www.tensorflow.org/install/をご覧ください

Universal SentenceEncoderのTFハブモジュールをロードします

module https://tfhub.dev/google/universal-sentence-encoder/4 loaded

サポートされているさまざまな長さを示して、各メッセージの表現を計算します。

Message: Elephant
Embedding size: 512
Embedding: [0.008344488218426704, 0.00048081763088703156, 0.06595246493816376, ...]

Message: I am a sentence for which I would like to get its embedding.
Embedding size: 512
Embedding: [0.0508086122572422, -0.01652432046830654, 0.015737777575850487, ...]

Message: Universal Sentence Encoder embeddings also support short paragraphs. There is no hard limit on how long the paragraph is. Roughly, the longer the more 'diluted' the embedding will be.
Embedding size: 512
Embedding: [-0.0283326655626297, -0.05586216226220131, -0.012941461056470871, ...]

セマンティックテキスト類似性タスクの例

Universal Sentence Encoderによって生成された埋め込みは、ほぼ正規化されています。 2つの文の意味的類似性は、エンコーディングの内積として簡単に計算できます。

def plot_similarity(labels, features, rotation):
  corr = np.inner(features, features)
  sns.set(font_scale=1.2)
  g = sns.heatmap(
      corr,
      xticklabels=labels,
      yticklabels=labels,
      vmin=0,
      vmax=1,
      cmap="YlOrRd")
  g.set_xticklabels(labels, rotation=rotation)
  g.set_title("Semantic Textual Similarity")

def run_and_plot(messages_):
  message_embeddings_ = embed(messages_)
  plot_similarity(messages_, message_embeddings_, 90)

視覚化された類似性

ここでは、ヒートマップで類似性を示します。最終的なグラフは9x9の行列で、各エントリ[i, j]は、文ijエンコーディングの内積に基づいて色付けされています。

messages = [
    # Smartphones
    "I like my phone",
    "My phone is not good.",
    "Your cellphone looks great.",

    # Weather
    "Will it snow tomorrow?",
    "Recently a lot of hurricanes have hit the US",
    "Global warming is real",

    # Food and health
    "An apple a day, keeps the doctors away",
    "Eating strawberries is healthy",
    "Is paleo better than keto?",

    # Asking about age
    "How old are you?",
    "what is your age?",
]

run_and_plot(messages)

png

評価:STS(セマンティックテキストの類似性)ベンチマーク

STSベンチマークは、文の埋め込みを使用して計算された類似性スコアが人間の判断と一致する程度の直感的な評価を提供します。ベンチマークでは、システムがさまざまな文のペアの選択に対して類似性スコアを返す必要があります。次に、ピアソン相関を使用して、人間の判断に対するマシンの類似性スコアの品質を評価します。

データのダウンロード

import pandas
import scipy
import math
import csv

sts_dataset = tf.keras.utils.get_file(
    fname="Stsbenchmark.tar.gz",
    origin="http://ixa2.si.ehu.es/stswiki/images/4/48/Stsbenchmark.tar.gz",
    extract=True)
sts_dev = pandas.read_table(
    os.path.join(os.path.dirname(sts_dataset), "stsbenchmark", "sts-dev.csv"),
    error_bad_lines=False,
    skip_blank_lines=True,
    usecols=[4, 5, 6],
    names=["sim", "sent_1", "sent_2"])
sts_test = pandas.read_table(
    os.path.join(
        os.path.dirname(sts_dataset), "stsbenchmark", "sts-test.csv"),
    error_bad_lines=False,
    quoting=csv.QUOTE_NONE,
    skip_blank_lines=True,
    usecols=[4, 5, 6],
    names=["sim", "sent_1", "sent_2"])
# cleanup some NaN values in sts_dev
sts_dev = sts_dev[[isinstance(s, str) for s in sts_dev['sent_2']]]
Downloading data from http://ixa2.si.ehu.es/stswiki/images/4/48/Stsbenchmark.tar.gz
417792/409630 [==============================] - 0s 1us/step

文章の埋め込みを評価する

sts_data = sts_dev

def run_sts_benchmark(batch):
  sts_encode1 = tf.nn.l2_normalize(embed(tf.constant(batch['sent_1'].tolist())), axis=1)
  sts_encode2 = tf.nn.l2_normalize(embed(tf.constant(batch['sent_2'].tolist())), axis=1)
  cosine_similarities = tf.reduce_sum(tf.multiply(sts_encode1, sts_encode2), axis=1)
  clip_cosine_similarities = tf.clip_by_value(cosine_similarities, -1.0, 1.0)
  scores = 1.0 - tf.acos(clip_cosine_similarities) / math.pi
  """Returns the similarity scores"""
  return scores

dev_scores = sts_data['sim'].tolist()
scores = []
for batch in np.array_split(sts_data, 10):
  scores.extend(run_sts_benchmark(batch))

pearson_correlation = scipy.stats.pearsonr(scores, dev_scores)
print('Pearson correlation coefficient = {0}\np-value = {1}'.format(
    pearson_correlation[0], pearson_correlation[1]))
Pearson correlation coefficient = 0.8036396950530414
p-value = 0.0