কেউ কি খুব সহজে, গ্রাফিকাল উপায়ে কোসাইন মিলের উদাহরণ দিতে পারেন?


201

উইকিপিডিয়ায় কোসিন সাদৃশ্য নিবন্ধ

আপনি কি এখানে ভেক্টরগুলি (একটি তালিকায় বা কোনও কিছুতে) প্রদর্শন করতে পারেন এবং তার পরে গণিতটি করতে পারেন এবং আমাদের দেখতে দিন এটি কীভাবে কাজ করে?

আমি শিক্ষানবিশ.


1
উইডোজের দ্বারা জ্যামিতি ও অর্থের একটি অনুলিপি বাছাই করার চেষ্টা করুন (টিপস.উইচিকাগো.ইডু / প্রসেসিট/… ), আমি এটি বেশ কিছুক্ষণ আগে পড়েছি এবং শুভেচ্ছামত আমি এটি বহু বছর আগে পেয়েছি, দুর্দান্ত পরিচিতি পাঠ্য।
নাথান হাওল

উত্তর:


463

তুলনা করার জন্য এখানে দুটি খুব সংক্ষিপ্ত পাঠ্য রয়েছে:

  1. Julie loves me more than Linda loves me

  2. Jane likes me more than Julie loves me

খাঁটি শব্দের পরিপ্রেক্ষিতে (এবং শব্দের ক্রম উপেক্ষা করে) এই পাঠ্যগুলি কতটা সমান তা আমরা জানতে চাই। আমরা উভয় গ্রন্থের শব্দের একটি তালিকা তৈরি করে শুরু করি:

me Julie loves Linda than more likes Jane

এখন আমরা প্রতিটি পাঠ্যে এই শব্দগুলির প্রতিটি প্রদর্শিত হওয়ার সংখ্যা গণনা করি:

   me   2   2
 Jane   0   1
Julie   1   1
Linda   1   0
likes   0   1
loves   2   1
 more   1   1
 than   1   1

যদিও আমরা নিজেরাই এই কথায় আগ্রহী নই। আমরা কেবল এই দুটি উল্লম্ব ভেক্টর গণিতে আগ্রহী। উদাহরণস্বরূপ, প্রতিটি লেখায় 'আমি' এর দুটি উদাহরণ রয়েছে। আমরা সিদ্ধান্ত নিতে যাচ্ছি যে এই দুটি পাঠ্য একে অপরের সাথে কতগুলি কাছাকাছি রয়েছে those দুটি ভেক্টরের একটি ফাংশন, যার মধ্যে কোণের কোষাইন তাদের মধ্যে গণনা করে।

দুটি ভেক্টর আবার:

a: [2, 0, 1, 1, 0, 2, 1, 1]

b: [2, 1, 1, 0, 1, 1, 1, 1]

তাদের মধ্যে কোণটির কোসাইন প্রায় 0.822 is

এই ভেক্টরগুলি 8-মাত্রিক। কোসাইন সাদৃশ্য ব্যবহার করার একটি গুণ এটি স্পষ্টভাবে বোঝায় যে এটি এমন একটি প্রশ্নকে রূপান্তরিত করে যা মানুষের ধারণার বাইরে যা হতে পারে তা রূপান্তরিত করতে পারে। এই ক্ষেত্রে আপনি প্রায় 35 ডিগ্রির কোণ হিসাবে এটি ভাবতে পারেন যা শূন্য বা নিখুঁত চুক্তি থেকে কিছুটা 'দূরত্ব'।


12
আমি ঠিক এটিই খুঁজছিলাম। যথাযথভাবে। এটিকে কি "ভেক্টর স্পেস মডেল" এর সহজতম রূপ হিসাবে বিবেচনা করা হয়?
টিমেক্স

2
অ্যালেক্স, আপনার পক্ষে এটি কার্যকর হয়েছিল বলে আমি সত্যিই আনন্দিত। দেরিতে জবাব দেবার জন্য দুঃখিত। আমি কিছুক্ষণের মধ্যে স্ট্যাকওভারফ্লো পরিদর্শন করি নি। আসলে এটি একটি "অভ্যন্তরীণ পণ্য স্থান" এর উদাহরণ। উইকিপিডিয়ায় একটি প্রাথমিক আলোচনা আছে।
বিল বেল

1
নথির দৈর্ঘ্যের জন্য স্বাভাবিক করার কোনও উপায় আছে কি?
sinθ

1
আপনাকে দৈর্ঘ্যের স্বাভাবিকতা ব্যবহার করতে হবে এবং তার আগে, সমস্ত টার্ম ভেক্টরগুলিতে লগ ফ্রিকোয়েন্সি ওজন ব্যবহার করার চেষ্টা করুন। যদি আপনি ইতিমধ্যে সাধারণ ভেক্টরগুলির সাথে লেনদেন করেন, তবে এটি AB এর ডট পণ্য
আলী গাজানী

4
দৈর্ঘ্য নরমালাইজেশন এবং টিএফ-আইডিএফ ব্যবহারের আরও বিশদ উদাহরণ: সাইট. uottawa.ca/~diana/csi4107/cosine_tf_idf_example.pdf
মাইক বি।

121

আমি অনুমান করছি যে " কীভাবে " এটি গণনা করা হয় না (গণনার জন্য ব্যবহৃত নির্দিষ্ট ক্রিয়াকলাপ ) পরিবর্তে " কেন " কোজিনের মিলের কাজ করে (কেন এটি মিলের ভাল ইঙ্গিত দেয়) তার সম্পর্কে কিছু অন্তর্দৃষ্টি পেতে আপনি আরও আগ্রহী are যদি আপনার আগ্রহ যদি পরে থাকে তবে এই পোস্টে ড্যানিয়েল দ্বারা নির্দেশিত রেফারেন্স, পাশাপাশি সম্পর্কিত এসও প্রশ্ন দেখুন

কীভাবে এবং এর থেকেও আরও বেশি কেন উভয় তা ব্যাখ্যা করার জন্য, প্রথমে সমস্যাটি সহজ করে তোলা এবং কেবল দুটি মাত্রায় কাজ করা কার্যকর it আপনি এটি 2 ডি-তে পেয়ে গেলে, এটি আরও তিনটি মাত্রায় বিবেচনা করা আরও সহজ, এবং আরও অনেকগুলি মাত্রার মধ্যে কল্পনা করা আরও শক্ত, তবে ততক্ষণে আমরা সংখ্যার গণনা করতে লিনিয়ার বীজগণিতটি ব্যবহার করতে পারি এবং শর্তে চিন্তা করতে আমাদের সহায়তা করতে পারি লাইন / ভেক্টর / "প্লেন" / "গোলক" এর n মাত্রায়, যদিও আমরা এগুলি আঁকতে পারি না।

সুতরাং, দুটি মাত্রায় : পাঠ্যের মিলের সাথে এর অর্থ হল যে আমরা দুটি স্বতন্ত্র পদগুলিতে মনোনিবেশ করব, "লন্ডন" এবং "প্যারিস" শব্দটি বলি এবং আমরা প্রতিটি শব্দে প্রতিটি শব্দটি কতবার পাওয়া যায় তা গণনা করব ' আমরা দুটি দস্তাবেজ তুলনা করতে চান। এটি আমাদের প্রতিটি ডকুমেন্টের জন্য, xy বিমানের একটি বিন্দু দেয়। উদাহরণস্বরূপ, যদি ডক 1 এর একবার প্যারিস থাকে এবং লন্ডন চারবার থাকে তবে একটি বিন্দু (1,4) এই দস্তাবেজটি উপস্থাপন করতে পারে (নথিগুলির এই ক্ষুদ্র মূল্যায়নের সাথে)। অথবা, ভেক্টরের ক্ষেত্রে বলতে গেলে এই ডক 1 নথিটি মূল থেকে পয়েন্ট (1,4) এ যাওয়ার একটি তীর হবে। এই চিত্রটি মাথায় রেখে, আসুন দুটি দস্তাবেজের অনুরূপ হওয়ার অর্থ কী এবং এটি কীভাবে ভেক্টরগুলির সাথে সম্পর্কিত তা ভেবে দেখি।

অনেক অনুরূপ নথিতে (আবার মাত্রাগুলির এই সীমিত সংস্থার সাথে আবারও) প্যারিসের খুব একই সংখ্যার উল্লেখ থাকবে এবং লন্ডনের খুব একই সংখ্যার উল্লেখ থাকতে পারে, বা হতে পারে তাদের এই রেফারেন্সগুলির একই অনুপাত থাকতে পারে। প্যারিসে 2 টি রেফারেন্স এবং লন্ডনে 8 রেফ সহ একটি ডকুমেন্ট, খুব একই রকম হবে, কেবল দীর্ঘতর পাঠ্য বা কোনওভাবে এই শহরের নামগুলির পুনরাবৃত্তি হতে পারে তবে একই অনুপাতে। সম্ভবত উভয় দলিলই লন্ডন সম্পর্কে গাইড রয়েছে, কেবল প্যারিসের উত্তরণ রেফারেন্স দেয় (এবং সেই শহরটি কী শান্ত! ;) কেবল মজা করছে !!!)।

এখন, কম অনুরূপ নথিতে উভয় শহরগুলির রেফারেন্স অন্তর্ভুক্ত থাকতে পারে তবে বিভিন্ন অনুপাতে। হতে পারে ডক 2 কেবল প্যারিসের একবার এবং লন্ডনকে সাতবার উদ্ধৃত করবে।

আমাদের xy প্লেনে ফিরে যদি আমরা এই হাইপোথিটিকাল ডকুমেন্টগুলি আঁকি, আমরা দেখতে পাই যে সেগুলি যখন খুব একই রকম হয়, তখন তাদের ভেক্টরগুলি ওভারল্যাপ হয় (যদিও কিছু ভেক্টর লম্বা হতে পারে), এবং তাদের কম মিল থাকতে শুরু করার সাথে, এই ভেক্টরগুলি বিভক্ত হওয়া শুরু করে, তাদের মধ্যে একটি বৃহত্তর কোণ আছে।

ভেক্টরগুলির মধ্যবর্তী কোণটি পরিমাপ করে আমরা তাদের মিলের ভাল ধারণা পেতে পারি এবং জিনিসগুলিকে আরও সহজ করে তুলতে এই কোণটির কোসিন গ্রহণ করে আমাদের কাছে একটি সুন্দর 0 থেকে 1 বা -1 থেকে 1 মান রয়েছে যা নির্দেশক আমরা কীভাবে এবং কীভাবে অ্যাকাউন্ট করছি তার উপর নির্ভর করে এই মিল। কোণ যত কম, বৃহত্তর (1 টির নিকটে) কোসাইন মান এবং তত বেশি মিল।

চূড়ান্তভাবে, যদি ডোক 1 কেবল প্যারিসকে উদ্ধৃত করে এবং ডক 2 কেবল লন্ডনকে উদ্ধৃত করে, নথিগুলিতে একেবারেই মিল নেই in ডক 1 এর এক্স-অক্ষে ভেক্টর, ডাই 2, এক্স-এক্সে থাকবে, কোণ 90 ডিগ্রি, কোসিন 0 থাকবে। এক্ষেত্রে আমরা বলব যে এই নথিগুলি একে অপরের সাথে অরথোগোনাল।

মাত্রা যুক্ত করা :
একটি ছোট কোণ (বা বৃহত কোসাইন) হিসাবে প্রকাশিত মিলের জন্য এই স্বজ্ঞাত অনুভূতির সাথে আমরা এখন 3 টি মাত্রায় জিনিসগুলি কল্পনা করতে পারি, "আমস্টারডাম" শব্দটি মিশ্রণে বলতে পারি, এবং ঠিক কীভাবে দুটি দস্তাবেজ দিয়ে একটি দস্তাবেজ কল্পনা করতে পারি প্রত্যেকের রেফারেন্সে কোনও ভেক্টর একটি নির্দিষ্ট দিক দিয়ে যাবে এবং আমরা দেখতে পাচ্ছি যে এই দিকটি প্যারিস এবং লন্ডনকে প্রত্যেকে তিনবার উদ্ধৃত করে, তবে আমস্টারডামের মতো নয় এমন একটি দলিলের সাথে কীভাবে তুলনা করা যায়, যেমন বলা হয়েছে, আমরা চেষ্টা করতে পারি এবং এই অভিনব কল্পনা করতে পারি 10 বা 100 টি শহরের জন্য স্থান। এটি আঁকানো শক্ত, তবে ধারণার পক্ষে সহজ।

আমি সূত্রটি সম্পর্কে নিজেই কিছু কথা বলে গুটিয়ে দেব । আমি যেমন বলেছি, অন্যান্য উল্লেখগুলি গণনা সম্পর্কে ভাল তথ্য সরবরাহ করে।

প্রথম দুটি মাত্রায়। দুটি ভেক্টরের মধ্যবর্তী কোণের কোসিনের সূত্রটি ত্রিকোণমিত্রিক পার্থক্য (কোণ এবং কোণ খ এর মধ্যে) থেকে প্রাপ্ত:

cos(a - b) = (cos(a) * cos(b)) + (sin (a) * sin(b))

এই সূত্রটি ডট পণ্য সূত্রের সাথে খুব মিল দেখাচ্ছে:

Vect1 . Vect2 =  (x1 * x2) + (y1 * y2)

যেখানে cos(a)সাথে সঙ্গতিপূর্ণ xমান এবং মান, প্রথম ভেক্টর জন্য, ইত্যাদি একমাত্র সমস্যা, যে হয় , ইত্যাদি না ঠিক হয় এবং মূল্যবোধ, এই মান জন্য ইউনিট বৃত্ত পড়তে করা প্রয়োজন। সূত্রের ডিনোমিনেটরটি এখানে লাথি মেরেছে: এই ভেক্টরগুলির দৈর্ঘ্যের পণ্য দ্বারা ভাগ করে, এবং স্থানাঙ্কগুলি স্বাভাবিক করা হয়।sin(a)yxycossinxy


25

এখানে আমার # সি বাস্তবায়ন।

using System;

namespace CosineSimilarity
{
    class Program
    {
        static void Main()
        {
            int[] vecA = {1, 2, 3, 4, 5};
            int[] vecB = {6, 7, 7, 9, 10};

            var cosSimilarity = CalculateCosineSimilarity(vecA, vecB);

            Console.WriteLine(cosSimilarity);
            Console.Read();
        }

        private static double CalculateCosineSimilarity(int[] vecA, int[] vecB)
        {
            var dotProduct = DotProduct(vecA, vecB);
            var magnitudeOfA = Magnitude(vecA);
            var magnitudeOfB = Magnitude(vecB);

            return dotProduct/(magnitudeOfA*magnitudeOfB);
        }

        private static double DotProduct(int[] vecA, int[] vecB)
        {
            // I'm not validating inputs here for simplicity.            
            double dotProduct = 0;
            for (var i = 0; i < vecA.Length; i++)
            {
                dotProduct += (vecA[i] * vecB[i]);
            }

            return dotProduct;
        }

        // Magnitude of the vector is the square root of the dot product of the vector with itself.
        private static double Magnitude(int[] vector)
        {
            return Math.Sqrt(DotProduct(vector, vector));
        }
    }
}

এটি দুর্দান্ত thank ধন্যবাদ আপনাকে আমি পছন্দ করলাম কীভাবে আপনি ম্যাগনিটিউড =) ব্যাখ্যা করেছেন
লিমিনাল 18

এটি দুর্দান্ত তবে যদি আমরা ফাইল বা স্ট্রিং নিয়ে কাজ করি।
তালহা

21

সরলতার জন্য আমি ভেক্টর এ এবং বি হ্রাস করছি:

Let :
    a : [1, 1, 0]
    b : [1, 0, 1]

তারপরে কোসাইন মিল (থেটা):

 (Theta) = (1*1 + 1*0 + 0*1)/sqrt((1^2 + 1^2))* sqrt((1^2 + 1^2)) = 1/2 = 0.5

তারপরে কোস 0.5 এর বিপরীতে 60 ডিগ্রি হয়।


18

এই পাইথন কোডটি অ্যালগরিদম বাস্তবায়নের জন্য আমার দ্রুত এবং নোংরা প্রচেষ্টা:

import math
from collections import Counter

def build_vector(iterable1, iterable2):
    counter1 = Counter(iterable1)
    counter2 = Counter(iterable2)
    all_items = set(counter1.keys()).union(set(counter2.keys()))
    vector1 = [counter1[k] for k in all_items]
    vector2 = [counter2[k] for k in all_items]
    return vector1, vector2

def cosim(v1, v2):
    dot_product = sum(n1 * n2 for n1, n2 in zip(v1, v2) )
    magnitude1 = math.sqrt(sum(n ** 2 for n in v1))
    magnitude2 = math.sqrt(sum(n ** 2 for n in v2))
    return dot_product / (magnitude1 * magnitude2)


l1 = "Julie loves me more than Linda loves me".split()
l2 = "Jane likes me more than Julie loves me or".split()


v1, v2 = build_vector(l1, l2)
print(cosim(v1, v2))

আপনি "all_items = set (counter1.keys ())। ইউনিয়ন (সেট (কাউন্টার 2.কিজ ()))" লাইনে সেটটি কেন ব্যবহার করেছেন তা ব্যাখ্যা করতে পারেন।
ঘোস 3

@ ঘোস 3 টি, এটি উভয় নথির থেকে পৃথক শব্দের তালিকা পেতে
চাকরিগুলি

7

@ বিল বেল উদাহরণ ব্যবহার করে, [আর] এ এটি করার দুটি উপায়

a = c(2,1,0,2,0,1,1,1)

b = c(2,1,1,1,1,0,1,1)

d = (a %*% b) / (sqrt(sum(a^2)) * sqrt(sum(b^2)))

বা ক্রসপড () পদ্ধতির কার্যকারিতাটির সুযোগ নিয়ে ...

e = crossprod(a, b) / (sqrt(crossprod(a, a)) * sqrt(crossprod(b, b)))

5

এটি একটি সাধারণ Pythonকোড যা কোসাইন মিলকে কার্যকর করে।

from scipy import linalg, mat, dot
import numpy as np

In [12]: matrix = mat( [[2, 1, 0, 2, 0, 1, 1, 1],[2, 1, 1, 1, 1, 0, 1, 1]] )

In [13]: matrix
Out[13]: 
matrix([[2, 1, 0, 2, 0, 1, 1, 1],
        [2, 1, 1, 1, 1, 0, 1, 1]])
In [14]: dot(matrix[0],matrix[1].T)/np.linalg.norm(matrix[0])/np.linalg.norm(matrix[1])
Out[14]: matrix([[ 0.82158384]])

3
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 * 
* @author Xiao Ma
* mail : 409791952@qq.com
*
*/
  public class SimilarityUtil {

public static double consineTextSimilarity(String[] left, String[] right) {
    Map<String, Integer> leftWordCountMap = new HashMap<String, Integer>();
    Map<String, Integer> rightWordCountMap = new HashMap<String, Integer>();
    Set<String> uniqueSet = new HashSet<String>();
    Integer temp = null;
    for (String leftWord : left) {
        temp = leftWordCountMap.get(leftWord);
        if (temp == null) {
            leftWordCountMap.put(leftWord, 1);
            uniqueSet.add(leftWord);
        } else {
            leftWordCountMap.put(leftWord, temp + 1);
        }
    }
    for (String rightWord : right) {
        temp = rightWordCountMap.get(rightWord);
        if (temp == null) {
            rightWordCountMap.put(rightWord, 1);
            uniqueSet.add(rightWord);
        } else {
            rightWordCountMap.put(rightWord, temp + 1);
        }
    }
    int[] leftVector = new int[uniqueSet.size()];
    int[] rightVector = new int[uniqueSet.size()];
    int index = 0;
    Integer tempCount = 0;
    for (String uniqueWord : uniqueSet) {
        tempCount = leftWordCountMap.get(uniqueWord);
        leftVector[index] = tempCount == null ? 0 : tempCount;
        tempCount = rightWordCountMap.get(uniqueWord);
        rightVector[index] = tempCount == null ? 0 : tempCount;
        index++;
    }
    return consineVectorSimilarity(leftVector, rightVector);
}

/**
 * The resulting similarity ranges from −1 meaning exactly opposite, to 1
 * meaning exactly the same, with 0 usually indicating independence, and
 * in-between values indicating intermediate similarity or dissimilarity.
 * 
 * For text matching, the attribute vectors A and B are usually the term
 * frequency vectors of the documents. The cosine similarity can be seen as
 * a method of normalizing document length during comparison.
 * 
 * In the case of information retrieval, the cosine similarity of two
 * documents will range from 0 to 1, since the term frequencies (tf-idf
 * weights) cannot be negative. The angle between two term frequency vectors
 * cannot be greater than 90°.
 * 
 * @param leftVector
 * @param rightVector
 * @return
 */
private static double consineVectorSimilarity(int[] leftVector,
        int[] rightVector) {
    if (leftVector.length != rightVector.length)
        return 1;
    double dotProduct = 0;
    double leftNorm = 0;
    double rightNorm = 0;
    for (int i = 0; i < leftVector.length; i++) {
        dotProduct += leftVector[i] * rightVector[i];
        leftNorm += leftVector[i] * leftVector[i];
        rightNorm += rightVector[i] * rightVector[i];
    }

    double result = dotProduct
            / (Math.sqrt(leftNorm) * Math.sqrt(rightNorm));
    return result;
}

public static void main(String[] args) {
    String left[] = { "Julie", "loves", "me", "more", "than", "Linda",
            "loves", "me" };
    String right[] = { "Jane", "likes", "me", "more", "than", "Julie",
            "loves", "me" };
    System.out.println(consineTextSimilarity(left,right));
}
}

3

কোসাইন সাদৃশ্য গণনা করার জন্য সরল জাভা কোড

/**
   * Method to calculate cosine similarity of vectors
   * 1 - exactly similar (angle between them is 0)
   * 0 - orthogonal vectors (angle between them is 90)
   * @param vector1 - vector in the form [a1, a2, a3, ..... an]
   * @param vector2 - vector in the form [b1, b2, b3, ..... bn]
   * @return - the cosine similarity of vectors (ranges from 0 to 1)
   */
  private double cosineSimilarity(List<Double> vector1, List<Double> vector2) {

    double dotProduct = 0.0;
    double normA = 0.0;
    double normB = 0.0;
    for (int i = 0; i < vector1.size(); i++) {
      dotProduct += vector1.get(i) * vector2.get(i);
      normA += Math.pow(vector1.get(i), 2);
      normB += Math.pow(vector2.get(i), 2);
    }
    return dotProduct / (Math.sqrt(normA) * Math.sqrt(normB));
  }

1
এটি কোনও "সাধারণ, গ্রাফিকাল উপায়" নয় তবে এখনও কেবল কোড। যদিও অন্যরাও একই ত্রুটি করেছে: /
স্ক্রাইলার

-1

2 ডি স্পেস বা 3 ডি স্পেসে দুটি ভেক্টর এ এবং বি বিদ্যমান রয়েছে, ve ভেক্টরগুলির মধ্যে কোণটি কোসের মিল।

যদি কোণটি বেশি হয় (সর্বোচ্চ 180 ডিগ্রি পৌঁছতে পারে) যা কোস 180 = -1 এবং সর্বনিম্ন কোণ 0 ডিগ্রি হয়। কারণ 0 = 1 বোঝায় ভেক্টরগুলি একে অপরের সাথে সংযুক্ত থাকে এবং তাই ভেক্টরগুলি একই রকম are

কোস 90 = 0 (যা ভেক্টর এ এবং বি একেবারেই সমান নয় এবং যেহেতু দূরত্বের ব্যয়টি নেতিবাচক নয়, তাই কোসাইন মানগুলি 0 থেকে 1 অবধি লভ্য হবে) সুতরাং, আরও কোণটি বোঝায় যে মিলটি হ্রাস করা যায় (এটিকে দৃশ্যমান করাও) জ্ঞান করে)

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.