【发布时间】:2022-01-27 23:49:43
【问题描述】:
我正在尝试计算文本文件中的单词对。首先,我对文本做了一些预处理,然后统计了单词对,如下图:
((Aspire, to), 1) ; ((to, inspire), 4) ; ((inspire, before), 38)...
现在,我要报告 1000 个最常见的对,按以下方式排序:
- 单词(对中的第二个单词)
- 相对频率(对出现次数/第 2 个单词的总出现次数)
这是我到目前为止所做的
from pyspark.sql import SparkSession
import re
spark = SparkSession.builder.appName("Bigram occurences and relative frequencies").master("local[*]").getOrCreate()
sc = spark.sparkContext
text = sc.textFile("big.txt")
tokens = text.map(lambda x: x.lower()).map(lambda x: re.split("[\s,.;:!?]+", x))
pairs = tokens.flatMap(lambda xs: (tuple(x) for x in zip(xs, xs[1:]))).map(lambda x: (x, 1)).reduceByKey(lambda x, y: x + y)
frame = pairs.toDF(['pair', 'count'])
# Dataframe ordered by the most frequent pair to the least
most_frequent = frame.sort(frame['count'].desc())
# For each row, trying to add a column with the relative frequency, but I'm getting an error
with_rf = frame.withColumn("rf", frame['count'] / (frame.pair._2.sum()))
我认为我比较接近我想要的结果,但我无法弄清楚。一般来说,我是 Spark 和 DataFrames 的新手。 我也试过了
import pyspark.sql.functions as F
frame.groupBy(frame['pair._2']).agg((F.col('count') / F.sum('count')).alias('rf')).show()
任何帮助将不胜感激。
编辑:这是frame 数据框的示例
+--------------------+-----+
| pair|count|
+--------------------+-----+
|{project, gutenberg}| 69|
| {gutenberg, ebook}| 14|
| {ebook, of}| 5|
| {adventures, of}| 6|
| {by, sir}| 12|
| {conan, doyle)}| 1|
| {changing, all}| 2|
| {all, over}| 24|
+--------------------+-----+
root
|-- pair: struct (nullable = true)
| |-- _1: string (nullable = true)
| |-- _2: string (nullable = true)
|-- count: long (nullable = true)
【问题讨论】:
-
您可以发布包含在
frame数据框和架构中的示例数据吗?并包含此示例的输出。 -
@Nithish 对不起,我忘了。我编辑了我的帖子。
-
按“单词(对中的第二个单词)”排序,您是指字母顺序还是频率顺序?
-
@Crow59 按字母顺序
标签: python apache-spark pyspark