在您希望POS标记存储在熊猫数据框中的一列文本(每行只有一句话)的情况下,SO上的大多数实现都使用apply方法
dfData['POSTags']= dfData['SourceText'].apply(
lamda row: [pos_tag(word_tokenize(row) for item in row])
NLTK文档建议使用pos_tag_sents()有效标记多个句子。
这是否适用于此示例,如果是,那么代码是否像更改pso_tag
为那样简单,pos_tag_sents
或者NLTK意味着段落的文本源
正如评论中提到的那样,pos_tag_sents()
目的是每次都减少感受器的负载, 但是问题是如何做到这一点,并且仍然在熊猫数据框中生成一列?
链接到示例数据集20kRows
输入值
$ cat test.csv
ID,Task,label,Text
1,Collect Information,no response,cozily married practical athletics Mr. Brown flat
2,New Credit,no response,active married expensive soccer Mr. Chang flat
3,Collect Information,response,healthy single expensive badminton Mrs. Green flat
4,Collect Information,response,cozily married practical soccer Mr. Brown hierachical
5,Collect Information,response,cozily single practical badminton Mr. Brown flat
TL; DR
>>> from nltk import word_tokenize, pos_tag, pos_tag_sents
>>> import pandas as pd
>>> df = pd.read_csv('test.csv', sep=',')
>>> df['Text']
0 cozily married practical athletics Mr. Brown flat
1 active married expensive soccer Mr. Chang flat
2 healthy single expensive badminton Mrs. Green ...
3 cozily married practical soccer Mr. Brown hier...
4 cozily single practical badminton Mr. Brown flat
Name: Text, dtype: object
>>> texts = df['Text'].tolist()
>>> tagged_texts = pos_tag_sents(map(word_tokenize, texts))
>>> tagged_texts
[[('cozily', 'RB'), ('married', 'JJ'), ('practical', 'JJ'), ('athletics', 'NNS'), ('Mr.', 'NNP'), ('Brown', 'NNP'), ('flat', 'JJ')], [('active', 'JJ'), ('married', 'VBD'), ('expensive', 'JJ'), ('soccer', 'NN'), ('Mr.', 'NNP'), ('Chang', 'NNP'), ('flat', 'JJ')], [('healthy', 'JJ'), ('single', 'JJ'), ('expensive', 'JJ'), ('badminton', 'NN'), ('Mrs.', 'NNP'), ('Green', 'NNP'), ('flat', 'JJ')], [('cozily', 'RB'), ('married', 'JJ'), ('practical', 'JJ'), ('soccer', 'NN'), ('Mr.', 'NNP'), ('Brown', 'NNP'), ('hierachical', 'JJ')], [('cozily', 'RB'), ('single', 'JJ'), ('practical', 'JJ'), ('badminton', 'NN'), ('Mr.', 'NNP'), ('Brown', 'NNP'), ('flat', 'JJ')]]
>>> df['POS'] = tagged_texts
>>> df
ID Task label \
0 1 Collect Information no response
1 2 New Credit no response
2 3 Collect Information response
3 4 Collect Information response
4 5 Collect Information response
Text \
0 cozily married practical athletics Mr. Brown flat
1 active married expensive soccer Mr. Chang flat
2 healthy single expensive badminton Mrs. Green ...
3 cozily married practical soccer Mr. Brown hier...
4 cozily single practical badminton Mr. Brown flat
POS
0 [(cozily, RB), (married, JJ), (practical, JJ),...
1 [(active, JJ), (married, VBD), (expensive, JJ)...
2 [(healthy, JJ), (single, JJ), (expensive, JJ),...
3 [(cozily, RB), (married, JJ), (practical, JJ),...
4 [(cozily, RB), (single, JJ), (practical, JJ), ...
在长:
首先,您可以将Text
列提取到字符串列表中:
texts = df['Text'].tolist()
然后可以应用该word_tokenize
功能:
map(word_tokenize, texts)
注意,@Boud的建议几乎是相同的,使用df.apply
:
df['Text'].apply(word_tokenize)
然后将标记化的文本转储到字符串列表中:
df['Text'].apply(word_tokenize).tolist()
然后,您可以使用pos_tag_sents
:
pos_tag_sents( df['Text'].apply(word_tokenize).tolist() )
然后将列添加回DataFrame中:
df['POS'] = pos_tag_sents( df['Text'].apply(word_tokenize).tolist() )
在中,可以对数据帧中的每一列应用一些groupby函数,例如: 假设我想应用一个lambda函数
问题内容: 这是我用于Twitter语义分析的代码:- 输入即:- 以以下格式获取输出(wordList): 我只希望以行格式输出一行。我该怎么做?如果您有更好的Twitter语义分析代码,请与我分享。 问题答案: 简而言之: 或者,如果您想添加另一列来存储标记化的字符串列表: 有专门针对Twitter文本编写的标记生成器,请参见http://www.nltk.org/api/nltk.token
问题内容: 我有一个大的数据框(几百万行)。 我希望能够对它进行分组操作,而只是按行的任意连续(最好大小相等)的子集进行分组,而不是使用各个行的任何特定属性来确定它们要进入的组。 用例:我想通过IPython中的并行映射将函数应用于每一行。哪行进入哪个后端引擎都没有关系,因为该函数一次基于一行来计算结果。(至少在概念上;实际上是矢量化的。) 我想出了这样的东西: 但这似乎很漫长,并且不能保证大小相
我正在处理一个非常宽的数据集(1005行*590,718列,1.2g)。将如此大的数据集加载到pandas dataframe中会导致完全由于内存不足而导致代码失败。 我知道Spark可能是处理大型数据集的Pandas的一个很好的替代方案,但是Pandas中是否有任何适合的解决方案来减少加载大型数据时的内存占用?
有人能解释一下为什么这个代码不起作用吗? 它返回错误:TypeError:(“'NoneType'对象不可调用”,“发生在索引0上”)数据帧df在某些单元格中包含一些None值。我的意图是对所有非无值应用函数。
假设熊猫数据帧如下所示: 如何将第三行(如row3)提取为pd数据帧?换句话说,row3.shape应该是(1,5),row3.head()应该是: