Python 利用Pandas和spaCy提取句子嵌入特征
我目前正在学习spaCy,我有一个关于单词和句子嵌入的练习。句子存储在数据帧列中,我们需要根据这些句子的向量来训练分类器 我有一个如下所示的数据帧:Python 利用Pandas和spaCy提取句子嵌入特征,python,pandas,dataframe,nlp,spacy,Python,Pandas,Dataframe,Nlp,Spacy,我目前正在学习spaCy,我有一个关于单词和句子嵌入的练习。句子存储在数据帧列中,我们需要根据这些句子的向量来训练分类器 我有一个如下所示的数据帧: +---+---------------------------------------------------+ | | sentence | +---+---------------------------------------------------+ |
+---+---------------------------------------------------+
| | 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函数应用于以下句子:
sents = ["'Whitey on the Moon' is a 1970 spoken word"
, "St Anselm's Church is a Roman Catholic church"
, "Nymphargus grandisonae (common name: giant)"]
import-en\u-core\u-web\u-md
nlp=en_core_web_md.load()
df['tokenized']=df['Session'].应用(nlp)
现在,如果我理解正确的话,df['tokenized']中的每个项都有一个属性,该属性返回2D数组中句子的向量
print(类型(df['tokenized'][0].vector))
打印(df['tokenized'][0].vector.shape)
屈服
<class 'numpy.ndarray'>
(300,)
(300,)
如何将此数组(300行)的内容作为列添加到相应句子的df
dataframe中,而忽略停止词
谢谢 假设你有一个句子列表:
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})
print(df)
sentence
0 'Whitey on the Moon' is a 1970 spoken word
1 St Anselm's Church is a Roman Catholic church
2 Nymphargus grandisonae (common name: giant)
然后,您可以按照以下步骤进行操作:
df['tokenized'] = df['sentence'].apply(nlp)
df['sent_vectors'] = df['tokenized'].apply(
lambda sent: np.mean([token.vector for token in sent if not token.is_stop])
)
生成的sent\u vectoriad
列是非停止字的令牌的所有向量嵌入的平均值(token.is\u stop
属性)
注1
您在数据帧中所称的句子
实际上是文档
类的一个实例
注2
尽管您可能更喜欢使用pandas数据帧,但建议使用getter扩展:
import spacy
from spacy.tokens import Doc
nlp = spacy.load("en_core_web_md")
sents = ["'Whitey on the Moon' is a 1970 spoken word"
, "St Anselm's Church is a Roman Catholic church"
, "Nymphargus grandisonae (common name: giant)"]
vector_except_stopwords = lambda doc: np.mean([token.vector for token in sent if not token.is_stop])
Doc.set_extension("vector_except_stopwords", getter=vector_except_stopwords)
vecs =[] # for demonstration purposes
for doc in nlp.pipe(sents):
vecs.append(doc._.vector_except_stopwords)
实际上,在分类模型中,使用单个值平均所有向量确实会产生很好的结果。实际上需要的是一个每句300列的数据帧(因为300是空间词嵌入的标准长度: 因此,要继续@Sergey的代码:
sents=[“‘月球上的白人’是一个1970年的口语词”
,“圣安瑟姆教堂是一座罗马天主教教堂”
,“大比目鱼亚科(俗名:巨人)”]
df=pd.DataFrame({“句子”:sents})
df['tokenized']=df['Session'].应用(nlp)
df['sent_vectors']=df['tokenized'].apply(lambda x:x.vector)
向量=0['sent_vector'].应用(pd.系列)
因此,vectors
包含可以训练模型的特征。例如,假设每个句子都附加了一种情感:
来自sklearn.linear\u模型导入逻辑回归
从sklearn.model\u选择导入列车\u测试\u拆分
X=向量
y=df[“情绪”]
X_系列,X_测试,y_系列,y_测试=系列测试分割(X,y,测试尺寸=0.2)
clf=逻辑回归()
clf.fit(X_系列、y_系列)
y_pred=clf.预测(X_检验)
我不能做的是从数据框条目中删除stopwords(即从存储在数据框中的
is\u stop
isFalse的Doc
父对象中删除每个Token
对象,谢谢!我假设这会产生每个句子的单个特征(句子向量的平均值)。这足以训练分类器模型吗?是的,这就是对已发送或文档进行分类所需的。这与您所要求的有点不同:一列表示一个不间断的单词。通过平均值(或tfidf平均值)查找单个文档嵌入这是不同于Word嵌入的方法。这和Work或OHE或香草平原TFIDF之类的Word模型不同。好的,谢谢你的解释。我想我需要提取300个特征作为栏目。“MrGuo回答了你的问题吗?有帮助吗?请考虑。