0 Daumen
480 Aufrufe

Ich habe versucht, die Ähnlichkeit des Kosinus zwischen zwei Spalten eines Datenrahmens 'Zug' nach [diesem Tutorial] [1] zu berechnen:
    train["diff"] = (train["quest_emb"] - train["sent_emb"])**2

Bei der Berechnung scheint es jedoch einen Dimensionsfehler mit dem von GloVe stammenden Einbettungsvektor zu geben.


    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    ~/Documents/programming/mybot/mybotenv/lib/python3.5/site-packages/pandas/core/ops.py in safe_na_op(lvalues, rvalues)
      1032            with np.errstate(all='ignore'):
    -> 1033                return na_op(lvalues, rvalues)
      1034        except Exception:
   
    ~/Documents/programming/mybot/mybotenv/lib/python3.5/site-packages/pandas/core/ops.py in na_op(x, y)
      1011        try:
    -> 1012            result = expressions.evaluate(op, str_rep, x, y, **eval_kwargs)
      1013        except TypeError:
   
    ~/Documents/programming/mybot/mybotenv/lib/python3.5/site-packages/pandas/core/computation/expressions.py in evaluate(op, op_str, a, b, use_numexpr, **eval_kwargs)
        204    if use_numexpr:
    --> 205        return _evaluate(op, op_str, a, b, **eval_kwargs)
        206    return _evaluate_standard(op, op_str, a, b)
   
    ~/Documents/programming/mybot/mybotenv/lib/python3.5/site-packages/pandas/core/computation/expressions.py in _evaluate_standard(op, op_str, a, b, **eval_kwargs)
        64    with np.errstate(all='ignore'):
    ---> 65        return op(a, b)
        66
   
    ValueError: operands could not be broadcast together with shapes (1,4096) (7,)
   
    During handling of the above exception, another exception occurred:
   
    ValueError                                Traceback (most recent call last)
    <ipython-input-81-af28fc11a9d3> in <module>()
    ----> 1 predicted = predictions(train)
   
    <ipython-input-80-1699cf33d87c> in predictions(train)
          2
          3    train["cosine_sim"] = train.apply(cosine_sim, axis = 1)
    ----> 4    train["diff"] = (train["quest_emb"] - train["sent_emb"])**2
          5    train["euclidean_dis"] = train["diff"].apply(lambda x: list(np.sum(x, axis = 1)))
          6    del train["diff"]
   
    ~/Documents/programming/mybot/mybotenv/lib/python3.5/site-packages/pandas/core/ops.py in wrapper(left, right)
      1067            rvalues = rvalues.values
      1068
    -> 1069        result = safe_na_op(lvalues, rvalues)
      1070        return construct_result(left, result,
      1071                                index=left.index, name=res_name, dtype=None)
   
    ~/Documents/programming/mybot/mybotenv/lib/python3.5/site-packages/pandas/core/ops.py in safe_na_op(lvalues, rvalues)
      1035            if is_object_dtype(lvalues):
      1036                return libalgos.arrmap_object(lvalues,
    -> 1037                                              lambda x: op(x, rvalues))
      1038            raise
      1039
   
    pandas/_libs/algos_common_helper.pxi in pandas._libs.algos.arrmap_object()
   
    ~/Documents/programming/mybot/mybotenv/lib/python3.5/site-packages/pandas/core/ops.py in <lambda>(x)
      1035            if is_object_dtype(lvalues):
      1036                return libalgos.arrmap_object(lvalues,
    -> 1037                                              lambda x: op(x, rvalues))
      1038            raise
      1039
   
        ValueError: operands could not be broadcast together with shapes (1,4096) (130318,)



4096 entspricht den durch die Funktion des Codierers konstruierten Vektoren und 130318 entspricht der Anzahl der Zeilen des Datenrahmens.

Es scheint nicht so zu sein, dass die beiden Säulen sich in ihrer Größe unterscheiden

    print("len(train[\"quest_emb\"])",len(train["quest_emb"]))
    print("len(train[\"sent_emb\"])",len(train["sent_emb"]))
   
    len(train["quest_emb"]) 130318
    len(train["sent_emb"]) 130318


Die zwei Spalten sehen so aus:


    sent_emb                                         quest_emb
    0 [[0.030376578, 0.044331014, 0.081356354, 0.062... [[0.01491953, 0.021973763, 0.021364095, 0.0393...
    1 [[0.030376578, 0.044331014, 0.081356354, 0.062... [[0.04444952, 0.028005758, 0.030357722, 0.0375...
    2 [[0.030376578, 0.044331014, 0.081356354, 0.062... [[0.03949683, 0.04509903, 0.018089347, 0.07667...
      ...


Nachdem wir die Größe der zwei Spalten überprüft haben, die die gleichen sind und nicht wirklich wissen, woher die anderen Zahlen kommen, ** warum nennen wir die Dimension des Einbettungsvektors, wenn ich Vektoren subtrahiere, die zwei Texte repräsentieren? **

Ziel ist es, unüberwachtes Lernen zu ermöglichen. Der komplette Code, aber nicht aktualisiert [ist über Github] [2].

  [1]: https://towardsdatascience.com/building-a-question-answering-system-…
  [2]: https://github.com/aswalin/SQuAD/blob/master/unsupervised.ipynb
Avatar von

1 Antwort

0 Daumen

Antwort mit KI erzeugt

Operanden konnten nicht zusammen mit Formen übertragen werden, die dennoch gleich zu sein scheinen

Das Problem, mit dem Sie konfrontiert sind, bezieht sich auf die Art und Weise, wie Operationen, insbesondere die Subtraktion und das Quadrieren, auf die Einbettungsvektoren innerhalb Ihres Datenrahmens 'train' ausgeführt werden. Der Fehler, den Sie erhalten haben, zeigt an, dass die Operation nicht durchgeführt werden kann, da die Formen der beiden Operanden nicht kompatibel sind. Dies liegt an der Anwendung der Operation auf Spalten mit Einbettungsvektoren, ohne zuvor sicherzustellen, dass die Operation elementweise für jedes Paar von Vektoren in den Spalten angewendet wird.

Lassen Sie uns das Problem durchgehen und eine potenzielle Lösung vorschlagen, unter Berücksichtigung, dass quest_emb und sent_emb Spalten von Listen oder Arrays von Vektoren sind, die Sie subtrahieren möchten, und danach jedes Element des resultierenden Vektors quadrieren möchten.

Der Fehler deutet darauf hin, dass Pandas versucht, Operationen über die gesamten Spalten auszuführen, anstatt elementweise zwischen den Einträgen der Spalten zu operieren. Das Ziel ist, für jedes Paar von quest_emb und sent_emb auf Zeilenebene die Differenz zu berechnen und dann diese Differenz zu quadrieren.

Lösungsansatz

Um dies zu erreichen, empfiehlt es sich, eine benutzerdefinierte Funktion zu verwenden, die über die Zeilen des Datenrahmens iteriert und die entsprechenden Operationen auf den Vektoren jeder Zeile anwendet. Hier ist ein Beispiel in Python, das die apply Methode von Pandas nutzt.

python
import numpy as np
import pandas as pd

# Angenommen, train ist Ihr pandas DataFrame

def calc_diff(row):
    # Sicherstellen, dass Einbettungsvektoren als np.array behandelt werden
    quest_emb = np.array(row['quest_emb'])
    sent_emb = np.array(row['sent_emb'])
    
    # Berechnen der Differenz und quadrieren der Resultate
    diff = (quest_emb - sent_emb)**2
    return diff

# Anwendung der Funktion auf jede Zeile
# axis=1 bedeutet, dass die Funktion auf Zeilen angewendet wird
train['diff'] = train.apply(calc_diff, axis=1)

# Optional: Berechnen der euklidischen Distanz als Summe der quadrierten Differenzen
train['euclidean_dis'] = train['diff'].apply(lambda x: np.sqrt(np.sum(x)))


Diese Methode behandelt jeden Eintrag in quest_emb und sent_emb korrekt und führt die Vektorsubtraktion und das Quadrieren wie erwartet durch. Es ist wichtig zu beachten, dass bei dieser Methode die Leistung für sehr große Datensätze beeinträchtigt sein könnte, da .apply() Zeile für Zeile durchführt. Für größere Datensätze könnten effizientere Ansätze erforderlich sein, die möglicherweise spezialisiertere Bibliotheken oder parallelisierte Berechnungen nutzen.

Beachten Sie, dass sowohl quest_emb als auch sent_emb als Listen oder Arrays im DataFrame gespeichert sein müssen, damit dieser Ansatz funktioniert. Sollten die Daten in einem anderen Format vorliegen, müssten diese eventuell zuerst in ein passendes Format konvertiert werden.
Avatar von

Ein anderes Problem?

Stell deine Frage