私は現在spaCyを学んでおり、単語と文の埋め込みに関する演習を行っています。文はパンダのDataFrame列に格納されており、これらの文のベクトルに基づいて分類器をトレーニングする必要があります。
次のようなデータフレームがあります。
+---+---------------------------------------------------+
| | sentence |
+---+---------------------------------------------------+
| 0 | "Whitey on the Moon" is a 1970 spoken word poe... |
+---+---------------------------------------------------+
| 1 | St Anselm's Church is a Roman Catholic church ... |
+---+---------------------------------------------------+
| 2 | Nymphargus grandisonae (common name: giant gla... |
+---+---------------------------------------------------+
次に、これらの文にNLP関数を適用します。
import en_core_web_md
nlp = en_core_web_md.load()
df['tokenized'] = df['sentence'].apply(nlp)
さて、私が正しく理解していれば、df ['tokenized']の各項目には、2D配列の文のベクトルを返す属性があります。
print(type(df['tokenized'][0].vector))
print(df['tokenized'][0].vector.shape)
収量
<class 'numpy.ndarray'>
(300,)
この配列(300行)のコンテンツをdf
、ストップワードを無視して、対応する文のデータフレームに列として追加するにはどうすればよいですか?
ありがとう!
実際、すべてのベクトルを平均化する単一の値を使用すると、分類モデルで良好な結果が得られます。実際に必要だったのは、1文あたり300列のデータフレームでした(300はspaCy単語埋め込みの標準の長さであるため:
したがって、@ Sergeyのコードを続行するには:
sents = ["'Whitey on the Moon' is a 1970 spoken word"
, "St Anselm's Church is a Roman Catholic church"
, "Nymphargus grandisonae (common name: giant)"]
df=pd.DataFrame({"sentence":sents})
df['tokenized'] = df['sentence'].apply(nlp)
df['sent_vectors'] = df['tokenized'].apply(lambda x: x.vector)
vectors = 0['sent_vector'].apply(pd.Series)
これによりvectors
、モデルをトレーニングできる機能が含まれます。たとえば、各文に感情が付加されていると仮定します。
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
X = vectors
y = df['sentiment']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
clf = LogisticRegression()
clf.fit(X_train,y_train)
y_pred = clf.predict(X_test)
私ができなかったことは、DataFrameエントリからストップワードを削除することです(つまり、がであるデータフレームに格納されてToken
いるDoc
親オブジェクトから各オブジェクトを削除します。is_stop
False
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加