Question

La société 1 a ce vecteur:

['books','video','photography','food','toothpaste','burgers'] ... ...

La société 2 a ce vecteur:

['video','processor','photography','LCD','power supply', 'books'] ... ...

Supposons qu'il s'agisse d'une distribution de fréquence (je pourrais en faire un tuple mais trop difficile à taper).
Comme vous pouvez le voir ... ces vecteurs ont des choses qui se chevauchent. " vidéo " et " photographie " semblent être " similaires " entre deux vecteurs en raison du fait qu'ils sont dans des positions similaires. Et ... " livres " est évidemment un point fort pour la société 1. La commande et le positionnement importent, car il s’agit d’une distribution de fréquence.

Quels algorithmes pourriez-vous utiliser pour jouer avec cela? Quels algorithmes pourriez-vous utiliser pour fournir des données précieuses à ces entreprises en utilisant ces vecteurs?

Je suis novice dans l'extraction de texte et la récupération d'informations. Quelqu'un pourrait-il me guider sur ces sujets en relation avec cette question?

Était-ce utile?

La solution

Comme la position est très importante, comme vous le soulignez, la mesure cruciale sera basée sur la différence de positions entre les mêmes éléments dans les différents vecteurs (vous pouvez, par exemple, additionner les valeurs absolues des différences, ou leur valeur). carrés). Le gros problème à résoudre est le suivant: combien peser un élément présent (disons le n-ième) dans un vecteur et complètement absent dans un autre. Est-ce un problème relativement mineur - comme si l'élément manquant était réellement présent juste après les éléments réels, par exemple - ou un très gros problème? C'est impossible à dire sans plus de compréhension du domaine d'application réel. Vous pouvez essayer de différentes manières pour traiter ce problème et voir les résultats qu’elles donnent sur des exemples de cas qui vous intéressent!

Par exemple, supposons qu'un "élément manquant soit à peu près le même que s'il était présent, juste après les éléments réels". Ensuite, vous pouvez prétraiter chaque vecteur d’entrée dans un élément de mappage dict à positionner (optimisation cruciale si vous devez comparer plusieurs paires de vecteurs d’entrée!):

def makedict(avector):
  return dict((item, i) for i, item in enumerate(avector))

et ensuite, pour comparer deux de ces dict:

def comparedicts(d1, d2):
  allitems = set(d1) | set(d2)      
  distances = [d1.get(x, len(d1)) - d2.get(x, len(d2)) for x in allitems]
  return sum(d * d for d in distances)

(ou, abs (d) au lieu de la quadrature dans la dernière déclaration). Pour que les éléments manquants pèsent plus lourd (faites des dessins, c’est-à-dire des vecteurs, soyez considérés plus loin), vous pouvez utiliser deux fois la longueur au lieu de simplement les longueurs, ou une grande constante telle que 100, dans un programme structuré de manière similaire.

Autres conseils

Je vous conseillerais un livre intitulé Programmation de l'intelligence collective .
C'est un très bon livre. comment récupérer des informations à partir de données simples comme celle-ci. Des exemples de code sont inclus (en Python:)

Modifier: Je réponds juste à gbjbaanb: C’est Python!

a = ['books','video','photography','food','toothpaste','burgers']
b = ['video','processor','photography','LCD','power supply', 'books']
a = set(a)
b = set(b)

a.intersection(b)
    set(['photography', 'books', 'video'])

b.intersection(a)
    set(['photography', 'books', 'video'])

b.difference(a)
    set(['LCD', 'power supply', 'processor'])

a.difference(b)
    set(['food', 'toothpaste', 'burgers'])

Jetez un coup d'oeil à la Distance de Hamming

Comme l’a mentionné mbg, la distance de Hamming est un bon début. Il s’agit essentiellement d’assigner un masque de bits pour chaque élément possible, qu’il soit contenu dans la valeur de l’entreprise.

Par exemple. Le dentifrice vaut 1 pour la société A, mais 0 pour la société B. Vous comptez ensuite les bits qui diffèrent entre les sociétés. Le coefficient de Jaccard est lié à cela.

La distance de Hamming ne sera pas en mesure de capturer la similitude entre des éléments tels que "vidéo". et "photographie". De toute évidence, une entreprise qui vend l’un vend bien l’autre avec une probabilité plus élevée que celle qui vend du dentifrice.

Pour cela, vous pouvez utiliser des éléments tels que LSI (il est également utilisé pour la réduction de la dimensionnalité) ou des codes factoriels (par exemple, des éléments de réseau neuronal en tant que Machines Boltzman restreintes, Autoencodeurs ou Minimisation prédictible) pour obtenir des représentations plus compactes que vous pouvez ensuite comparer. distance euclidienne.

choisir le rang de chaque entrée (le rang le plus élevé est le meilleur) et faire la somme des moyennes géométriques entre les matchs

pour deux vecteurs

sum(sqrt(vector_multiply(x,y)))  //multiply matches

La somme des rangs pour chaque valeur sur vecteur doit être identique pour chaque vecteur (de préférence 1) De cette façon, vous pouvez faire des comparaisons entre plus de 2 vecteurs.

Si vous appliquez le métod de ikkebr, vous découvrirez en quoi a est semblable à b

dans ce cas, utilisez simplement

sum( b( b.intersection(a) ))

Vous pouvez utiliser l'algorithme set_intersection . Les 2 vecteurs doivent d'abord être triés (utilisez l'appel de tri), puis passez à 4 itérateurs et vous obtiendrez une collection avec les éléments communs insérés. Il y en a quelques autres qui fonctionnent de la même manière.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top