昨日、キーワードを単語ごとに展開するワンホットな方法を使用して、アイデアを大まかに明確にし、実現可能性を今日試してみました。
現在、主流のテキストのベクトル化手法には、主にワンホットの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#を使用して上記の機能を実現することです。