0
votes

Utilisation de Regex pour extraire les noms d'utilisateur des données Twitter

J'essaie d'extraire les noms du texte Twitter à l'aide de regex. Mais, malgré le modèle, la valeur renvoyée est aucune, ce qui n'est pas exactement le cas. Là où mon code est erroné, je n'en ai aucune idée. J'utilise jupyter lab.

Exemple de texte: pd.Series full_text

0        None
1        None
2        None
3        None
4        None
         ... 
21299    None
21300    None
21301    None
21302    None
21303    None
Name: full_text, Length: 21304, dtype: object

Ma fonction définie est la suivante:

XXX

Et, j'applique la fonction ci-dessus comme ci-dessous:

full_text.apply(extract_user)

Mais les valeurs que j'obtiens en retour sont les suivantes: p >

def extract_user(text):
        m = re.search(r"RT\s@\w+:", text)
        return m  


2 commentaires

re.search renvoie l'objet de correspondance


presque la même syntaxe avec pandas : full_text.str.match ("RT \ s @ \ w +:")


3 Réponses :


1
votes

Vous pouvez faire beaucoup plus simplement avec le code ci-dessous

    0
0   SeamusHughes
1   WFaqiri
2   DavidCornDC
3   DavidCornDC
4   billroggio
5   billroggio
6   KFILE

Sortie

    0
0   @SeamusHughes
1   @WFaqiri
2   @DavidCornDC
3   @DavidCornDC
4   @billroggio
5   @billroggio
6   @KFILE

Si vous le souhaitez seulement les noms et pas le symbole @ , utilisez df.A.str.extract(r"@(\w+)")

Sortie

df.A.str.extract(r"(@\w+)") #A is the column name


4 commentaires

Merci! tous vos codes sont formidables, mais je serais très obligé si quelqu'un peut signaler l'erreur dans mon code.


Dans votre code, re.search (r "RT \ s @ \ w +:", text) renvoie l'objet de recherche, pas la valeur. Imprimez m et imprimez m.group () pour voir la différence.


@ambrishdhaka (1) en utilisant fulltext.str au lieu de fulltext puis (2) en utilisant un groupe de capture pour saisir le texte réel.


@moys J'ai appris cela de vous m = re.search (r "RT \ s @ \ w +:", text) print (m.group () [4: -1]) merci .



1
votes

Que diriez-vous de quelque chose comme ça en utilisant une fonction lambda en son sein:

import pandas as pd
data = [['RT @SeamusHughes: The Taliban Stamp of approva...'],['RT @WFaqiri: Taliban and Afghan groups find co...'],['RT @DavidCornDC: Imagine what Fox News would h...'],['RT @DavidCornDC: Imagine what Fox News would h...'],['RT @billroggio: Even if you are inclined to tr...'],['RT @billroggio: I am sure we will hear the arg...'],['RT @KFILE: This did happen and it went exactly...']]
df=pd.DataFrame(data)
df[0].apply(lambda text: re.search(r'RT\s@([^:]+)',text).group(1))

# 0    SeamusHughes
# 1         WFaqiri
# 2     DavidCornDC
# 3     DavidCornDC
# 4      billroggio
# 5      billroggio
# 6           KFILE
# Name: 0, dtype: object

Et en mettant tout cela ensemble pour la minutie:

>>> df[0].apply(lambda text: re.search(r'RT\s@([^:]+)',text).group(1))
0    SeamusHughes
1         WFaqiri
2     DavidCornDC
3     DavidCornDC
4      billroggio
5      billroggio
6           KFILE


1 commentaires

Merci! les fonctions anonymes sont excellentes, mais la chaîne de regex que vous avez utilisée devrait également fonctionner dans mon code. Je l'ai essayé en le remplaçant par le vôtre, mais sans succès.



1
votes

La raison pour laquelle cela se produit est que votre fonction ( extract_user ) renvoie:

def extract_user(text):
         m = re.search(r"RT\s@\w+:", text)
         return m[0]                        # <-- here

stuff = df.iloc[:, 0].apply(extract_user)

print(stuff)

0    RT @SeamusHughes:
1         RT @WFaqiri:
2     RT @DavidCornDC:
3     RT @DavidCornDC:
4      RT @billroggio:
5      RT @billroggio:
6           RT @KFILE:

Maintenant, je ne suis pas un expert alors prenez cela avec un grain de sel, mais je suppose que les pandas n'ont pas de dtype pour gérer l'objet renvoyé par votre fonction et qu'il le gère avec None code>. Consultez cette excellente réponse si vous souhaitez approfondir géré les dtypes.

Donc, en supposant que vous vouliez garder toute votre approche la même avec des changements minimes, voici un exemple de votre fonction modifiée en renvoyant simplement le premier élément ( [0] code>) de chaque objet .

0    <re.Match object; span=(5, 22), match='RT @Sea...
1    <re.Match object; span=(5, 17), match='RT @WFa...
2    <re.Match object; span=(5, 21), match='RT @Dav...
3    ...

J'espère que cela clarifie les choses.


1 commentaires

Merci! J'ai compris cela aussi, puis j'ai utilisé le tranchage comme return m.group () [4: -1] .