Próbuję uczyć się Prapkark lepiej i stłumiam tweety i próbuję uchwycić hashtagi z tekstu Tweeta (wiem, że JSON Twittera już zapewnia Hashtags, robię to jako ćwiczenie).

Więc z pyspark datafram o imieniu Hashtags,

-------------------------------------------
Batch: 18
-------------------------------------------
+--------------------+--------------------+
|               value|            Hashtags|
+--------------------+--------------------+
|Instead, it has c...|[instead,, it, ha...|
|  #iran #abd #Biden |[#iran, #abd, #bi...|
+--------------------+--------------------+

Biorę kolumnę "Wartość", udaj się na małe litery, podzielone na białe znaki / karcie / Newline, tworząc kolumnę tablicy o nazwie "Hashtags", a następnie spróbuj usunąć dowolne elementy z po prostu białe znaki, a wszelkie elementy, które nie zaczynają z "#".

Hashtags = Hashtags.withColumn("Hashtags", lower(Hashtags["value"]))
Hashtags = Hashtags.withColumn("Hashtags", split(Hashtags["Hashtags"], r'\s'))
Hashtags = Hashtags.withColumn("Hashtags", F.array_remove(Hashtags["Hashtags"], r'\s'))
Hashtags = Hashtags.withColumn("Hashtags", F.array_remove(Hashtags["Hashtags"], r'^(?!#).+'))

O ile mogę powiedzieć, array_remove() usuwa elementy z regex r'\s', ale nie usuwa elementów, które nie zaczynają się od "#".

Wiem, że sam rodzaj regex działa poza array_remove(), ponieważ testowałem to w ten sposób:

RegText = r'^(?!#).+'
print(re.findall(RegText, "#AnandWrites"), re.match(RegText, "#AnandWrites"))
print(re.findall(RegText, "AnandWrites"), re.match(RegText, "AnandWrites"))
print(re.findall(RegText, "with\xe2\x80\xa6"), re.match(RegText, "with\xe2\x80\xa6"))
print(re.findall(RegText, "An#andWrites"), re.match(RegText, "An#andWrites"))

Co daje mi następujący wynik, wskazując, że z powodzeniem pasuje do ciągów, które nie zaczynają się od "#"

[] None
['AnandWrites'] <re.Match object; span=(0, 11), match='AnandWrites'>
['withâ\x80¦'] <re.Match object; span=(0, 7), match='withâ\x80¦'>
['An#andWrites'] <re.Match object; span=(0, 12), match='An#andWrites'>
0
N1h1l1sT 14 kwiecień 2021, 19:12

1 odpowiedź

Najlepsza odpowiedź

array_remove nie może być używany z regex. Możesz rozważyć użycie filter za pomocą rlike zamiast tego:

df2 = df.withColumn(
    'Hashtags', 
    F.expr(r"""
        filter(
            split(lower(value), '\\s'), 
            x -> x not rlike '\\s' and x not rlike '^(?!#).+'
        )
    """)
)

df2.show(truncate=False)
+-----------------+---------------------+
|value            |Hashtags             |
+-----------------+---------------------+
|Instead, it has  |[]                   |
|#iran #abd #biden|[#iran, #abd, #biden]|
+-----------------+---------------------+
1
mck 14 kwiecień 2021, 16:38