关键字采集文章(好用的数据采集工具,造数科技对于这篇文章文本分析和可视化技术)
优采云 发布时间: 2021-11-24 07:09关键字采集文章(好用的数据采集工具,造数科技对于这篇文章文本分析和可视化技术)
有用的资料采集工具,数学技术
对于这个文章,我想用一个基本的关键词抽取机制来描述一个文本分析和可视化技术,只用一个词计数器,从我博客上发表的文章语料库中找出前3个关键词. 为了创建这个语料库,我下载了我所有的博客文章(大约1400篇文章),并抓取了每个文章的文本。然后,我使用 nltk 和各种干预/减少技术来标记帖子,计算关键字并获取前 3 个关键字。然后,我将使用 Gephi 聚合所有帖子中的所有关键字以创建可视化。
我已经上传了一个带有完整代码集的jupyter notebook,你也可以下载一个csv文件。需要安装beautifulsoup和nltk。您可以安装它们:
pip install bs4 nltk
首先,我们需要导入所需的库:
import pandas as pd
import numpy as np
from nltk.tokenize import word_tokenize, sent_tokenize
from nltk.corpus import stopwords
from nltk.stem import WordNetLemmatizer, PorterStemmer
from string import punctuation
from collections import Counter
from collections import OrderedDict
import re
import warnings
warnings.filterwarnings("ignore", category=DeprecationWarning)
from HTMLParser import HTMLParser
from bs4 import BeautifulSoup
有一个关于 BeautifulSoup 的警告我们可以忽略。
现在,让我们设置一些我们需要的任务。
首先,我们设置停用词、词干和引用词。
porter = PorterStemmer()
wnl = WordNetLemmatizer()
stop = stopwords.words('english')
stop.append("new")
stop.append("like")
stop.append("u")
stop.append("it'")
stop.append("'s")
stop.append("n't")
stop.append('mr.')
stop = set(stop)
现在,我们构建一些必需的函数。
分词器函数取自此处。如果您想了解一些很酷的主题建模,请阅读如何在 Python 中挖掘新闻提要数据并提取交互式见解……
很不错的文章,进入主题建模和聚类...以后我也会在这里发帖文章。
# From http://ahmedbesbes.com/how-to-mine-newsfeed-data-and-extract-interactive-insights-in-python.html
def tokenizer(text):
tokens_ = [word_tokenize(sent) for sent in sent_tokenize(text)]
tokens = []
for token_by_sent in tokens_:
tokens += token_by_sent
tokens = list(filter(lambda t: t.lower() not in stop, tokens))
tokens = list(filter(lambda t: t not in punctuation, tokens))
tokens = list(filter(lambda t: t not in [u"'s", u"n't", u"...", u"''", u'``', u'\u2014', u'\u2026', u'\u2013'], tokens))
filtered_tokens = []
for token in tokens:
token = wnl.lemmatize(token)
if re.search('[a-zA-Z]', token):
filtered_tokens.append(token)
filtered_tokens = list(map(lambda token: token.lower(), filtered_tokens))
return filtered_tokens
接下来,我的 文章 中有一些 HTML,所以在做任何事情之前,我想从文本中删除它。这是一个使用 bs4 的类。我在 Stackoverflow 上找到了这段代码。
class MLStripper(HTMLParser):
def __init__(self):
self.reset()
self.fed = []
def handle_data(self, d):
self.fed.append(d)
def get_data(self):
return ''.join(self.fed)
def strip_tags(html):
s = MLStripper()
s.feed(html)
return s.get_data()
好的,现在是有趣的事情。要获取我们的关键字,我们只需要 2 行代码。这个函数计算并返回给我们所说的关键字的数量。
def get_keywords(tokens, num):
return Counter(tokens).most_common(num)
最后,我创建了一个函数来获取填充 urls/pubdate/author/text 的 pandas 数据框,然后从中创建我的关键字。该函数遍历一个pandas数据框(每一行是我博客文章中的一篇文章),标有“关键字”、“文章的标题”和文章发布的数据“文本”和返回熊猫数据框。
def build_article_df(urls):
articles = []
for index, row in urls.iterrows():
try:
data=row['text'].strip().replace("'", "")
data = strip_tags(data)
soup = BeautifulSoup(data)
data = soup.get_text()
data = data.encode('ascii', 'ignore').decode('ascii')
document = tokenizer(data)
top_5 = get_keywords(document, 5)
unzipped = zip(*top_5)
kw= list(unzipped[0])
kw=",".join(str(x) for x in kw)
articles.append((kw, row['title'], row['pubdate']))
except Exception as e:
print e
#print data
#break
pass
#break
article_df = pd.DataFrame(articles, columns=['keywords', 'title', 'pubdate'])
return article_df
是时候加载数据并对其进行分析了。这些代码在我的博客 文章(在这里找到),然后只从数据中获取有趣的列,重命名它们并准备它们以进行标记化。大多数可以在读取 csv 文件时在一行中完成,但我已经为另一个项目编写了这个文件,就像它一样。
df = pd.read_csv('../examples/tocsv.csv')
data = []
for index, row in df.iterrows():
data.append((row['Title'], row['Permalink'], row['Date'], row['Content']))
data_df = pd.DataFrame(data, columns=['title' ,'url', 'pubdate', 'text' ])
使用tail()有以下结果
现在,我们可以通过调用 build_article_df 函数来标记和执行我们的字数统计。
article_df = build_article_df(data_df)
这为我们提供了一个新的数据框,其中收录每个 文章 的前 3 个关键字(以及 文章 的标题和标题)。
这本身就很酷。我们使用一个简单的计数器为每个 文章 自动生成关键字。不是很复杂,但它有效。有很多其他方法可以做到这一点,但我们现在将坚持这一点。除了关键字之外,看看这些关键字如何与其他关键字“连接”起来可能会很有趣。比如“data”在其他文章中出现了多少次?
有多种方法可以回答这个问题,但一种方法是通过可视化拓扑/网络映射中的关键字来查看关键字之间的联系。我们需要“计数”我们的关键字,然后构建一个共现矩阵。这个矩阵可以导入到 Gephi 中进行可视化。我们可以使用networkx来绘制网络地图,但是从没有很多工作的角度来看,很难从中得到有用的东西......使用Gephi更加人性化。
我们有关键字,需要一个共现矩阵。为了实现这个目标,我们需要采取几个步骤来分离关键字。
keywords_array=[]
for index, row in article_df.iterrows():
keywords=row['keywords'].split(',')
for kw in keywords:
keywords_array.append((kw.strip(' '), row['keywords']))
kw_df = pd.DataFrame(keywords_array).rename(columns={0:'keyword', 1:'keywords'})
我们现在有一个收录两列的关键字数据框 kw_df:关键字和关键字
目前这没有多大意义,但我们需要两列来构建共现矩阵。我们遍历每个文档的关键字列表(关键字列)以查看是否收录关键字。如果是,我们将添加到我们的外观矩阵,然后构建我们的共存矩阵。
document = kw_df.keywords.tolist()
names = kw_df.keyword.tolist()
document_array = []
for item in document:
items = item.split(',')
document_array.append((items))
occurrences = OrderedDict((name, OrderedDict((name, 0) for name in names)) for name in names)
# Find the co-occurrences:
for l in document_array:
for i in range(len(l)):
for item in l[:i] + l[i + 1:]:
occurrences[l[i]][item] += 1
co_occur = pd.DataFrame.from_dict(occurrences )
现在,我们在 co_occur 数据帧中有一个共存矩阵,可以将其导入 Gephi 以查看节点和边的映射。将 co_occur 数据帧保存为 Gephi 的 CSV 文件(您可以在此处下载矩阵的副本)。
co_occur.to_csv('out/ericbrown_co-occurancy_matrix.csv')
申请Gephi
现在,是时候开始使用 Gephi 了。我是新手,所以我真的不能给你很多教程,但是我可以告诉你构建网络图需要采取的步骤。首先导入通用矩阵csv文件,然后导入电子表格,一切保持默认。然后,在“概览”选项卡中,您将看到一堆节点和连接,如下图所示。
文章子集网络图
接下来,向下移动到“布局”部分,然后选择 Fruchterman Reingold 布局,然后按“运行”重新绘制地图。在某些情况下,您需要在将节点放在屏幕上后按“停止”。您应该看到以下内容。
文章子集网络图
嗯?现在...让我们为图片着色。在“外观”部分,选择“节点”,然后选择“排名”。选择“学位”并点击“申请”。您应该看到网络图形发生了变化,现在有一些与之相关的颜色。你可以使用颜色来播放,但默认的配色方案应该是这样的:
现在还不是很有趣,文本/关键字在哪里?
好吧,您需要转到“概览”选项卡来查看。您应该会看到以下内容(在下拉菜单中选择“默认曲线”后)。
现在这很酷。您可以看到两个非常不同的兴趣领域。“数据”和“佳能”……这是有道理的,因为我写了很多关于数据并分享了很多我的摄影作品(用佳能相机拍摄)。
如果你有兴趣,这里有一张我所有的1400个文章的完整地图。同样,摄影和数据有两个主要集群,但也有一个围绕“业务”、“人”和“cio”的大集群,这符合我多年来的大部分写作习惯。
还有其他可视化文本分析方法。我正在计划一些额外的 文章 来谈谈我最近使用和运行的一些更有趣的方法。敬请关注。