NLP(I): 正则表达式

NLP(I): 正则表达式

使用tweepy获取推特数据

爬取

请注意,以下代码中的breaer_token需要自己去推特申请一个开发者账号,也就是说,你自己写代码时这个token和我的是不一样的,不要直接复制。

import tweepy
client = tweepy.Client(bearer_token='AAAAAAAAAAAAAAAAAAAAACZyhAEAAAAAwq%2ByW0tqZ4TbIbtKlDx3w9dpghc%3DG7qdk7bQvPvl5r9W5fKXhLAx4SFSiOD32I5kIZjVISOF79F2WG')

query = 'nft lang:en -is:retweet -has:links' # tweets have 'nft', written in English, not retwee, do not have links
tweets = list(tweepy.Paginator(client.search_recent_tweets, query=query, tweet_fields=['context_annotations', 'created_at'], max_results=100).flatten(limit=10000))
print("{} tweets are collected.".format(len(tweets)))
10000 tweets are collected.
将数据保存为csv文件
import csv


driveFolderDirectory = './'
savedFileName = 'tweets.csv'
pathToSave = driveFolderDirectory + savedFileName

with open(pathToSave, 'w', newline='', encoding='utf-8') as csvfile:
    fieldnames = ['idx','tweetId', 'createdTime', 'tweetText']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    for i,tweet in enumerate(tweets):
        writer.writerow({'idx': i, 'tweetId': tweet.id, 'createdTime': tweet.data['created_at'], 'tweetText': tweet.data['text']})

将所有大写转小写

读入csv文件

csv_data = []
with open(pathToSave, encoding='utf-8') as csvfile:
    for row in csv.DictReader(csvfile, skipinitialspace=True):
        csv_data.append(row)

操作数据

for row in csv_data:
    row['tweetText'] = row['tweetText'].lower()

去除井号、url、数字

去除匹配特定正则表达式,使用re.sub()方法。

regex_task2 = [r'\B(\#[a-zA-Z0-9]+\b)(?!;)', 
               r'\b(http(s)?:\/\/)?(www.)?([a-zA-Z0-9])+([\-\.]{1}[a-zA-Z0-9]+)*\.[a-zA-Z]{2,5}(:[0-9]{1,5})?(\/[^\s]*)?\b',
               r'\d?\.?\d+']
import re

for row in csv_data:
    for ptn in regex_task2:
        row['tweetText'] = re.sub(ptn, '', row['tweetText'])

去除后缀

从每个单词删去-ing, -ed, -ly。注意不是删去整个单词。

regex_task3 = [r'([a-zA-Z]+)ing\b', r'([a-zA-Z]+)ed\b', r'([a-zA-Z]+)ly\b']


for row in csv_data:
    for ptn in regex_task3:
        row['tweetText'] = re.sub(ptn, r'\1', row['tweetText'])

词形还原

把所有to do形式换成do。

regex_task4 = r'\bto\b\s+([a-zA-Z]+)\b'


for row in csv_data:
    row['tweetText'] = re.sub(regex_task4, r'\1', row['tweetText'])

去除停用词(stop words)

这里的停用词采用维基百科给出的十个最常用英文停用词,链接https://en.wikipedia.org/wiki/Most_common_words_in_English

regex_task5 = [r'\bthe\b', r'\bbe\b', r'\bto\b', r'\bof\b', r'\band\b', r'\ba\b', r'\bin\b', r'\bthat\b', r'\bhave\b', r'\bI\b']


for row in csv_data:
    for ptn in regex_task5:
        row['tweetText'] = re.sub(ptn, "", row['tweetText'])

令牌化(tokenize)

tokens是一个列表,其每个元素是被拆分为令牌的一句话。

tokens = []

for row in csv_data:
    sentences = re.split(r' *[\.\?!][\'"\)\]]* *', row['tweetText'])
    for sentence in sentences:
        raw_words = sentence.split()
        pure_words = []
        for raw_word in raw_words:
            pure_words.append(re.sub(r'[^a-z]', "", raw_word))
        tokens.append(pure_words)
        
print(tokens[0])

简单可视化

画一个统计每句话长度的直方图。

import matplotlib.pyplot as plt
 

lengths = []
for token_list in tokens:
    lengths.append(len(token_list))

plt.hist(lengths)
plt.show()

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 是的,有一些 Python 库可以用来识别文本中的姓名、电话和地址信息。 一个常用的库是 `spaCy`,它可以用来进行文本分析和处理。 下面是一个使用 `spaCy` 识别文本中的姓名、电话和地址的例子: ```python import spacy nlp = spacy.load("en_core_web_sm") text = "My name is John Smith and my phone number is 555-555-5555. I live at 123 Main Street, New York, NY 10001." doc = nlp(text) # 获取文本中的姓名 names = [ent.text for ent in doc.ents if ent.label_ == "PERSON"] print(names) # 输出: ['John Smith'] # 获取文本中的电话号码 phones = [ent.text for ent in doc.ents if ent.label_ == "PHONE"] print(phones) # 输出: ['555-555-5555'] # 获取文本中的地址 addresses = [ent.text for ent in doc.ents if ent.label_ == "ADDRESS"] print(addresses) # 输出: ['123 Main Street, New York, NY 10001'] ``` 还有一些其他的库也可以用来识别文本中的信息,比如 `regex` 和 `pyap`。 使用方法可能略有不同,但基本原理是相似的。 ### 回答2: 是的,有一些Python的包可以直接识别一段文字中的姓名、电话和地址。其中一个常用的包是re(正则表达式)包。这个包可以用于字符串匹配和查找。 举例来说,如果我有以下一段文字:"这是一个测试文本,里面包含了一些信息:姓名是张三,电话是123456789,地址是北京市朝阳区XXX街道。" 我们可以使用re包中的正则表达式来提取出这段文字中的姓名、电话和地址。 首先,我们可以使用正则表达式来匹配和提取姓名。例如: ``` import re text = "这是一个测试文本,里面包含了一些信息:姓名是张三,电话是123456789,地址是北京市朝阳区XXX街道。" pattern_name = r"姓名是(\w+)" name_match = re.search(pattern_name, text) name = name_match.group(1) ``` 接下来,我们可以使用正则表达式来匹配和提取电话号码。例如: ``` import re text = "这是一个测试文本,里面包含了一些信息:姓名是张三,电话是123456789,地址是北京市朝阳区XXX街道。" pattern_phone = r"电话是(\d{9})" phone_match = re.search(pattern_phone, text) phone = phone_match.group(1) ``` 最后,我们可以使用正则表达式来匹配和提取地址。例如: ``` import re text = "这是一个测试文本,里面包含了一些信息:姓名是张三,电话是123456789,地址是北京市朝阳区XXX街道。" pattern_address = r"地址是([\u4e00-\u9fa5]+)" address_match = re.search(pattern_address, text) address = address_match.group(1) ``` 通过以上的代码,我们可以提取出这段文字中的姓名、电话和地址,并将其分别赋值给name、phone和address变量。这样,我们就能方便地从一段文字中获取到所需的信息。 ### 回答3: 是的,有一些Python的包可以用来识别一段文字中的姓名、电话和地址。一个常用的包是re(正则表达式)。 例如,如果要从一段文字中提取出姓名,可以使用re包中的findall函数。假设我们有以下一段文字:"我的名字是张三,你可以通过电话号码13812345678联系到我,我住在北京市朝阳区XX街道XX小区12号楼34单元"。那么我们可以使用以下代码: import re text = "我的名字是张三,你可以通过电话号码13812345678联系到我,我住在北京市朝阳区XX街道XX小区12号楼34单元" # 提取姓名 name = re.findall("[\u4e00-\u9fa5]{2,4}", text) print("姓名:", name) 这段代码中,我们使用正则表达式[\u4e00-\u9fa5]{2,4}来匹配连续2至4个汉字,从而提取出姓名。运行代码后,输出的结果就是姓名"张三"。 类似地,你也可以使用正则表达式来提取电话和地址信息。对于电话号码,可以使用正则表达式"\d{11}"来匹配连续11位数字;对于地址信息,可以根据你的具体需求使用合适的正则表达式来匹配地址的格式。 总之,使用Python的re包可以方便地进行文本信息的提取和匹配,通过合适的正则表达式,可以准确地识别出一段文字中的姓名、电话和地址等信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值