ホームページ >バックエンド開発 >Python チュートリアル >ワードベクトル埋め込みの詳細な例

ワードベクトル埋め込みの詳細な例

PHP中文网
PHP中文网オリジナル
2017-06-21 16:11:303126ブラウズ

Word ベクトルの埋め込みには、大規模なテキスト コーパスの効率的な処理が必要です。 word2vec。簡単に説明すると、単語はワンホット エンコーディング学習システムに送信され、長さは語彙の長さのベクトル、単語の対応する位置要素は 1、その他の要素は 0 になります。ベクトルの次元は非常に高く、異なる単語の意味上の関連性を説明できません。共起は単語を表し、意味上の関連を解決し、大規模なテキスト コーパスを横断し、各単語から一定の距離内にある周囲の単語をカウントし、正規化された近くの単語の数で各単語を表します。似た文脈の単語は似た意味を持ちます。 PCA または同様の方法を使用して出現ベクトルの次元を削減し、より高密度の表現を取得します。優れたパフォーマンスを備え、すべての語彙の共起行列を追跡します。幅と高さが語彙の長さになります。 2013年にMikolov、Tomasらが文脈計算単語表現法「ベクトル空間における単語表現の効率的な推定」を提案した(arXivプレプリントarXiv:1301.3781(2013))。スキップグラム モデルはランダムな表現から開始され、現在の単語に基づいてコンテキスト ワードの単純な分類子を予測します。誤差は分類子の重みと単語の表現を通じて伝播され、予測誤差を減らすために 2 つが調整されます。大規模コーパス学習モデル表現ベクトルは圧縮共起ベクトルを近似します。

データセット、英語版 Wikipedia ダンプ ファイルには、すべてのページの完全な改訂履歴が含まれており、現在のページのバージョンは 100 GB です。

ダンプファイルをダウンロードし、ページの単語を抽出します。単語の出現数を数えて、共通の語彙リストを作成します。抽出されたページをボキャブラリを使用してエンコードします。ファイルは 1 行ずつ読み取られ、結果はすぐにディスクに書き込まれます。プログラムのクラッシュを避けるために、異なるステップ間のチェックポイントを保存します。

__iter__ は単語索引リストのページを横断します。 encode は文字列単語の語彙インデックスを取得します。 decode は、語彙インデックスに従って文字列単語を返します。 _read_pages は、Wikipedia ダンプ ファイル (圧縮 XML) から単語を抽出し、ページごとに 1 行の単語をスペースで区切ってページ ファイルに保存します。 bz2 モジュールのオープン関数はファイルを読み取ります。中間結果の圧縮処理。正規表現は、連続する文字または個々の特殊文字のシーケンスをキャプチャします。 _build_vocabulary はページ ファイル内の単語数をカウントし、頻度の高い単語がファイルに書き込まれます。ワンホット エンコーディングには語彙が必要です。用語集インデックスのエンコーディング。スペル ミスと非常に一般的ではない単語は削除され、語彙には、最も一般的な単語の 1 つであるvocabulary_size のみが含まれます。語彙にない単語はすべて でマークされ、単語ベクトルには表示されません。

トレーニング サンプルを動的に形成し、大量のデータを整理します。分類器は多くのメモリを占有しません。スキップグラム モデルは、現在の単語の文脈単語を予測します。テキスト、現在の単語データ、周囲の単語ターゲットを調べて、トレーニング サンプルを作成します。コンテキスト サイズ R、各単語は 2R 個のサンプルを生成し、現在の単語の左右に R 個の単語が生成されます。意味コンテキスト、近い距離が重要、遠コンテキストの単語のトレーニング サンプルをできるだけ少なく作成し、[1、D=10] の範囲で単語コンテキスト サイズをランダムに選択します。トレーニング ペアはスキップグラム モデルに基づいて形成されます。 Numpy 配列は数値ストリーム バッチ データを生成します。

最初、単語はランダムなベクトルとして表されます。分類器は、中間レベルの表現に基づいてコンテキスト ワードの現在の表現を予測します。エラーを伝播し、重みを微調整し、入力単語の表現を調整します。 MomentumOptimizer モデルの最適化、インテリジェンスの欠如、高効率。

分類器はモデルの中核です。ノイズ対比推定損失は優れたパフォーマンスを発揮します。ソフトマックス分類器モデリング。 tf.nn.nce_loss 新しいランダム ベクトルの負のサンプル (比較サンプル)、近似ソフトマックス分類器。

トレーニング モデルが終了し、最終的な単語ベクトルがファイルに書き込まれます。 Wikipedia コーパスのサブセットが通常の CPU で 5 時間トレーニングされ、NumPy 配列埋め込み表現が取得されました。完全なコーパス: 。 AttrDict クラスは Python 辞書と同等であり、キーは属性としてアクセスできます。

ImportBZ2

Importコレクション
インポートos
インポートreをlxmlからインポートeTreeをインポートインポートダウンロードからインポートclass wikipedia:
token_regex = re.compile(r '[a-za-z]+| [!?。:、 ()]')
def __init__(self, url,cache_dir,vocabulary_size=10000):
self._cache_dir = os.path.expanduser(cache_dir)
self._pages_path (self._cache_dir) , 'ページ.bz2')
self._vocabulary_path = os.path.join(self._cache_dir, 'vocabulary.bz2')
os.path.isfile(self._pages_path):
print('ページを読む')
自分自身。 _read_pages(url)
そうでない場合 os.path.isfile(self._vocabulary_path):
print('語彙の構築')
self._build_vocabulary(vocabulary_size)
b z2.open(self._vocabulary_path, 'rt') を語彙として:
print('語彙を読む')
self._vocabulary = [語彙内の x の x.strip()]
self._indices = {x: i の場合、x は enumerate(self._vocabulary)}
__ iter__(自分自身):
bz2.open(self._pages_path, 'rt') をページとして使用:
ページ内のページ:
word = page.strip().split()
Words = [self.encode(x) for x in Words]
yield Words
@property
defvocabulary_size(self):
return len(self._vocabulary)
def encode(self, word):
return self._indices.get(word, 0)
def decode(self, Index):
return self._vocabulary[index]
def _read_pages(self, url):
wikipedia_path = download(url, self._cache_dir)
ウィキペディアとして bz2.open(wikipedia_path) を使用します。 bz2.open(self._pages_path , 'wt') as pages:
for _, etree.iterparse(wikipedia, tag='{*}page') の要素:
element.find('./{*}redirect') が None でない場合:
続き
page = element.findtext('./{*}revision/{*}text')
words = self._tokenize(page)
pages.write(' '.join(words) + )
要素.clear()
def _build_vocabulary(self,vocabulary_size):
counter = collections.Counter()
bz2.open(self._pages_path, 'rt') をページ:
ページの場合:
word = page.strip ().split()
counter.update(words)
common = [''] + counter.most_common(vocabulary_size - 1)
common = [x[0] for x common]
bz2で。 open(self._vocabulary_path, 'wt') 語彙として:
共通の単語の場合:
vocabulary.write(word + 'n')
@classmethod
        def _tokenize(cls, page):
Words = cls.TOKEN_REGEX.findall(page)
Words = [x. lower() for x in Words]
単語を返す

tensorflow を tf としてインポート
numpy をインポートnp
ヘルパーよりimport late_property
class EmbeddingModel:
def __init__(self, data, target, params):
self.data = data
self.target = target
self.params = params
self.embeddings
self.cost
self.optimize
@lazy_property
defembeddings(self):
initial = tf.random_uniform(
[self.params.vocabulary_size, self.params.embedding_size],
-1.0, 1.0)
return tf.Variable(initial)
@lazy_property
def optimize(self):
optimizer = tf.train.MomentumOptimizer(
self.params.learning_rate, self.params.momentum)
return optimizer.minimize(self.cost)
@lazy_proper ty
defcost(self):
埋め込み = tf.nn.embedding_lookup(self.embeddings, self.data)
weight = tf.Variable(tf.truncated_normal(
[self.params.vocabulary_size, self.params.embedding_size],
dev=1.0 / self.params.embedding_size ** 0.5))
bias = tf.Variable(tf.zeros([self.params.vocabulary_size]))
target = tf.expand_dims(self.target, 1)
return tf.reduce_mean(tf.nn.nce_loss(
重み、バイアス、埋め込み、ターゲット、
self.params.contrastive_examples,
self.params.vocabulary_size))

コレクションをインポートします
tensorflowをtfとしてインポートします
numpyをnpとしてインポートします
バッチからインポートバッチ
EmbeddingModelからインポートEmbeddingModel
skipgramsからインポートskipgrams
WikipediaからインポートWikipedia
ヘルパーからインポート
WIKI_DOWNLOAD_DIR = './wikipedia'
params = AttrDict (
vocabulary_size=10000,
max_context=10,
embedding_size=200,
contrative_examples=100,
learning_rate=0.5,
momentum=0.5,
batch_size=1000,
)
data = tf.placeholder(tf.int32, [ None])
target = tf.placeholder(tf.int32, [None])
model = EmbeddingModel(data, target, params)
コーパス = Wikipedia(
'https://dumps.wikimedia.org/enwiki/20160501/ '
'enwiki-20160501-pages-meta-current1.xml-p000000010p000030303.bz2',
WIKI_DOWNLOAD_DIR,
params.vocabulary_size)
examples =コーパス、params.max_context)
バッチ = バッチ化(例、params.batch_size)
sess = tf.Session()
sess.run(tf.initialize_all_variables())
average = collections.deque(maxlen=100)
インデックスの場合、 enumerate(batches) のバッチ:
feed_dict = {data:batch[0 ]、ターゲット:バッチ[1]}
cost, _ = sess.run([model.cost, model.optimize], feed_dict)
average.append(cost)
print('{}: {:5.1f}' .format(index + 1, sum(average) / len(average)))
if Index > 100000:
Break
embeddings = sess.run(model.embeddings)
np.save(WIKI_DOWNLOAD_DIR + '/embeddings.npy', embeddings)

以上がワードベクトル埋め込みの詳細な例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。