キーワードマッチングの最適化(パート1)-テストと計算プロセス

昨日、キーワードを単語ごとに展開するワンホットな方法を使用して、アイデアを大まかに明確にし、実現可能性を今日試してみました。

現在、主流のテキストのベクトル化手法には、主にワンホットのtf(term-frequency)とtf-idf(term frequency–inverse document frequency)が含まれており、将来的には精度が高くなるはずです。

私のニーズは比較的単純で、比較的短いキーワードは100を超えないため、最初にワンホットベクトル化を使用し、プロセス全体を実行してから、戻って精度の違いをテストします。

単語の分割には、Pythonのjiebaパッケージを使用できます。単語は比較的短いため、分割されず、単語ごとに分割されます。

100を超える単語が削除され、200を超えるキーワードがあり、これも問題ないと思われます。

アイデアの検証はExcelで行われるので、結局のところデータ量が少なく便利に見えます。

プロセスは、最初にvbaを使用して単語を単語に分割し(Excel数式を使用して完成させることもできます)、vba辞書関数を使用して単語を最初の行まで再生し、次にcountif数式を使用してワンホットエンコーディングを取得します。

キーワードコーディング

後で新しい単語が検出された後、新しい単語のエンコーディングが計算され、2つのベクトルを比較することで類似度を計算できます。

ベクトルの類似度はコサイン類似度法を使用していますが、詳細には説明されていませんが、具体的にはBaiduを使用できます。式は次のとおりです。

コサイン類似式

numpyを使用してコサイン類似度を計算するコードを見つけ、テストしました。

import numpy as np

def cos_sim(vector_a, vector_b):
    """
    计算两个向量之间的余弦相似度
    :param vector_a: 向量 a 
    :param vector_b: 向量 b
    :return: sim
    """
    vector_a = np.mat(vector_a)
    vector_b = np.mat(vector_b)
    num = float(vector_a * vector_b.T)
    denom = np.linalg.norm(vector_a) * np.linalg.norm(vector_b)
    sim = num / denom
    return sim

print( cos_sim(np.array([[1, 1, 1,1,1,1,1,1]]),np.array([[1, 2, 1,1,1,1,1,1]])) )

これら2つのテストベクトルの類似性の計算に成功しました

現在、計算プロセス全体が基本的に実行されています。次のステップは、C#を使用して上記の機能を実現することです。

おすすめ

転載: www.cnblogs.com/hewish/p/12684712.html