Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 利用Pandas和spaCy提取句子嵌入特征_Python_Pandas_Dataframe_Nlp_Spacy - Fatal编程技术网

Python 利用Pandas和spaCy提取句子嵌入特征

Python 利用Pandas和spaCy提取句子嵌入特征,python,pandas,dataframe,nlp,spacy,Python,Pandas,Dataframe,Nlp,Spacy,我目前正在学习spaCy,我有一个关于单词和句子嵌入的练习。句子存储在数据帧列中,我们需要根据这些句子的向量来训练分类器 我有一个如下所示的数据帧: +---+---------------------------------------------------+ | | sentence | +---+---------------------------------------------------+ |

我目前正在学习spaCy,我有一个关于单词和句子嵌入的练习。句子存储在数据帧列中,我们需要根据这些句子的向量来训练分类器

我有一个如下所示的数据帧:

+---+---------------------------------------------------+
|   |                                          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
is
False

Doc
父对象中删除每个
Token
对象,谢谢!我假设这会产生每个句子的单个特征(句子向量的平均值)。这足以训练分类器模型吗?是的,这就是对已发送或文档进行分类所需的。这与您所要求的有点不同:一列表示一个不间断的单词。通过平均值(或tfidf平均值)查找单个文档嵌入这是不同于Word嵌入的方法。这和Work或OHE或香草平原TFIDF之类的Word模型不同。好的,谢谢你的解释。我想我需要提取300个特征作为栏目。“MrGuo回答了你的问题吗?有帮助吗?请考虑。