我正在做一个nlp项目,并且评论中包含多个句子。我正在使用spark-nlp软件包,该软件包输出一列,其中包含每个评论中的句子列表。我正在使用explode为每个句子创建一行,但是我想添加编号,所以我知道哪个句子是1st,2nd等。我不知道如何使用row_number(),因为我实际上没有什么要订购的。
这是我的数据:
REVIEW_ID REVIEW_COMMENTS SENTENCES_LIST
1 Hi. Sent1. Sent2. [Hi., Sent1., Sent2.]
2 Yeah. Ok. [Yeah., Ok.]
这是我想要的样子:
REVIEW_ID REVIEW_COMMENTS SENTENCES_LIST SENTENCE SENT_NUMBER
1 Hi. Sent1. Sent2. [Hi., Sent1., Sent2.] Hi. 1
1 Hi. Sent1. Sent2. [Hi., Sent1., Sent2.] Sent1. 2
1 Hi. Sent1. Sent2. [Hi., Sent1., Sent2.] Sent2. 3
2 Yeah. Ok. [Yeah., Ok.] Yeah. 1
2 Yeah. Ok. [Yeah., Ok.] Ok. 2
我正在使用下面的代码,并且不确定如何使用row_number(),因为除了在SENTENCES_LIST中的位置以外,我没有一栏可用作“ orderBy”。
df2 = df.withColumn('SENTENCE', F.explode('SENTENCES_LIST'))
df3 = df2.withColumn('SENT_NUMBER',row_number().over(Window.partitionBy('REVIEW_ID').orderBy('????')))
对于Spark2.4+
,您可以将explode
与高阶函数transform.
from pyspark.sql import functions as F
df.withColumn("list", F.explode(F.expr("""transform(SENTENCES_LIST,(x,i)-> struct(x as SENTENCE,(i+1) as SENT_NUMBER))""")))\
.select("*", "list.*").show()
#+---------+-----------------+--------------------+-----------+--------+-----------+
#|REVIEW_ID| REVIEW_COMMENTS| SENTENCES_LIST| list|SENTENCE|SENT_NUMBER|
#+---------+-----------------+--------------------+-----------+--------+-----------+
#| 1|Hi. Sent1. Sent2.|[Hi., Sent1., Sen...| [Hi., 1]| Hi.| 1|
#| 1|Hi. Sent1. Sent2.|[Hi., Sent1., Sen...|[Sent1., 2]| Sent1.| 2|
#| 1|Hi. Sent1. Sent2.|[Hi., Sent1., Sen...|[Sent2., 3]| Sent2.| 3|
#| 2| Yeah. Ok.| [Yeah., Ok.]| [Yeah., 1]| Yeah.| 1|
#| 2| Yeah. Ok.| [Yeah., Ok.]| [Ok., 2]| Ok.| 2|
#+---------+-----------------+--------------------+-----------+--------+-----------+