本文實(shí)例講述了.NET下文本相似度算法余弦定理和SimHash淺析及應(yīng)用。。具體分析如下:
余弦相似性
原理:首先我們先把兩段文本分詞,列出來(lái)所有單詞,其次我們計(jì)算每個(gè)詞語(yǔ)的詞頻,最后把詞語(yǔ)轉(zhuǎn)換為向量,這樣我們就只需要計(jì)算兩個(gè)向量的相似程度.
我們簡(jiǎn)單表述如下
文本1:我/愛(ài)/北京/天安門(mén)/ 經(jīng)過(guò)分詞求詞頻得出向量(偽向量) [1,1,1,1]
文本2:我們/都愛(ài)/北京/天安門(mén)/ 經(jīng)過(guò)分詞求詞頻得出向量(偽向量) [1,0,1,2]
我們可以把它們想象成空間中的兩條線(xiàn)段,都是從原點(diǎn)([0, 0, ...])出發(fā),指向不同的方向。兩條線(xiàn)段之間形成一個(gè)夾角,如果夾角為0度,意味著方向相同、線(xiàn)段重合;如果夾角為90度,意味著形成直角,方向完全不相似;如果夾角為180度,意味著方向正好相反。因此,我們可以通過(guò)夾角的大小,來(lái)判斷向量的相似程度。夾角越小,就代表越相似。
C#核心算法:
代碼如下: public class TFIDFMeasure
{
private string[] _docs;
private string[][] _ngramDoc;
private int _numDocs=0;
private int _numTerms=0;
private ArrayList _terms;
private int[][] _termFreq;
private float[][] _termWeight;
private int[] _maxTermFreq;
private int[] _docFreq;
public class TermVector
{
public static float ComputeCosineSimilarity(float[] vector1, float[] vector2)
{
if (vector1.Length != vector2.Length)
throw new Exception("DIFER LENGTH");
float denom=(VectorLength(vector1) * VectorLength(vector2));
if (denom == 0F)
新聞熱點(diǎn)
疑難解答
圖片精選