textfind:文本分析之词频分析-TF-IDF

发布时间:2021-02-22 阅读 5637

Stata连享会   主页 || 视频 || 推文 || 知乎

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

New! lianxh 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh

课程详情 https://gitee.com/arlionn/Course   |   lianxh.cn

课程主页 https://gitee.com/arlionn/Course

作者:杜思昱 (中山大学)
邮箱dusy@mail2.sysu.edu.cn


目录


1. 引言

本文主要介绍了 Stata 中用于关键词搜索的命令:textfind。该命令能够识别、分析并将文本数据转换为分类数据,以便在定量分析中进一步使用。其不仅可以实现由字符串实现的标准关键词搜索,也允许用户使用多个关键词和排除标准来识别数据集中的观察结果。同时,在结果中,textfind 命令会报告以下统计量:

  • Total Finds:根据特定条件匹配到的观测结果的数量;
  • Average Finds:观测结果中特定条件的单词数;
  • Average Length:特定词的文本长度;
  • Average Position:特定词所在位置;
  • Average tf-idf:词频-逆文档频率;
  • Means test:不同搜索标准下的样本 t 检验的 p 值。

2 算法介绍

2.1 n-grams 算法

n-grams 是一种基于统计语言模型的算法,其主要思想是将文本分成若干个字节大小为 n 的序列。具体来看,有 n 个词组成的序列 (或者句子),其概率为:

根据链式规则,可得:

但上述计算方式存在两个问题:

  • 模型参数空间巨大;
  • 计算的概率数据矩阵严重稀疏 (如果任一项概率为 0,则联合概率为 0)。

为解决该问题,引入马尔科夫假设 (Markov assumption) 进行改进,其主要思想是当前词仅跟前面有限个词相关,即不必追溯最开始的词,这样便可以大幅缩减上式的长度。通过马尔科夫假设改进,上式变为:

由于条件概率的直接算法是计数法,上式又可写为:

2.2 tf-idf 算法

tf-idf 是文本挖掘和自然语言处理方面相当重要的算法。

其中,tf 指词频,即某个词在文章中出现的频率。对 tf 最直观的理解是,当一个词在文章中出现的频率越高时,文章的主题和这个词的相关可能性越大。但上述直观理解存在以下误区:

  • 文章中出现最多的字词很可能是 “你”、“我”、“他”、“的”、“是”、“这” 等停用词,仅通过这些词来分析一篇文章的主题是不可行的。因此,在正式进行文本分析之前,需对文本进行剔除停用词处理;
  • 在剔除停用词后,文章中高频词能否代表主题?例如,一篇描述国内专利的文章,其高频词汇很可能是 “中国”。这显然与文章的主题 “专利” 不符,但 “中国” 又不是一个停用词,此时候就需要另外一个算法:idf。

idf 即逆文档频率。上例中 “中国” 的词频最高,却不能反应文章主题,主要是因为 “中国” 这个词太常见了,其不仅在这篇文章里出现次数多,在其他文章里出现的次数也很多。这说明 “中国” 这个词不足以描述文章特征。于是,评价某个词的独特性算法 idf 就被设计出来——语料库文章总数/包含某个词的文章数。

  • |D| 表示语料库文章总数;
  • ti 表示包含词 ti 的文章数;
  • 在分母上加 1,是为了避免分母为 0 带来的计算问题,取对数是为了降低 idf 差异。

上式说明,如果一个词在越多的文章中出现过,其独特性就越低,反之出现的文章数越少,idf 值越大,其独特性也就越高。

综上,tf-idf 计算公式如下:

由上式也可以看出,选取 tf-idf 值靠前的词作为文章主题,则准确性会大幅提高。

3. textfind 命令

命令安装:

ssc install textfind   //安装 textfind 命令

基本语法:

textfind varlist [if] [in] [, keyword("string1" "string2" ...) but("string1" "string2"...) nocase exact or notable tag(newvar) nfinds length position tfidf]
  • keyword("string1" "string2" ...) 是主要的搜索选项,用于在变量集中查找选定的字符串。该字符串可以是文本、数字或任何其他 ustrregexm() 正则表达式的搜索条件;
  • but("string1" "string2" ...) 是主要的排除选项,用于在变量集中查找选定字符串并删除其匹配项;
  • nocase 表示不区分大小写;
  • exact 对变量集中的关键词执行精确搜索,只匹配完全等于 "string1","string2"… 的观测值;
  • or 对关键词中的多个条目执行替代匹配,默认是 “string1” 和 “string2” 的附加搜索;
  • notable 要求 Stata 不要展示统计量表;
  • tag(newvar) 生成一个名为 newvar 的变量,用于标记找到的结果;
  • nfinds 为关键词中的每个字符串生成一个变量,描述字符串在每次观察中的出现次数。默认的变量名是 myvar1_nfindmyvar2_nfind,… ; length 生成新的变量 myvar_length,描述在变量集中找到的每个变量的单词长度;
  • position 为关键词中的每个字符串生成一个变量,描述每次观测中首次发现字符串的位置。默认变量名是 myvar1_posmyvar2_pos,… ;
  • tfidf 为关键词中每个字符串生成一个变量,描述文本在每次观察中的 tf-idf 逆向文档频率。默认变量名是 myvar1_tfidfmyvar2_tfidf,… 。

4. Stata 实操:分析政府报告

4.1 获取文本

copy "http://www.gov.cn/guowuyuan/2020zfgzbg.htm" govr.txt  //复制网页内容到本地
shellout "govr.txt" // 打开查看本地的 txt 文档 

从政府官网获取 2020 年政府工作报告,复制到本地后打开,得到如下结果:

可以看到,文档中有很多无关字符,但基本都是英文和符号,并不影响后续中文处理,因此可以不做处理。若要进行处理,可用 filefiltersubinfile 替换 govr.txt 文档中的无用字符。报告正文部分如下图所示:

4.2 关键词查找

insheet using govr.txt, delimiter(" ")  //读入 txt
textfind v1, key("财政""经济""教育""医疗""健康""疫情")
The following table displays the keyword(s) and exclusion(s) criteria used in
the search and returns six statistics for each variable specified:

Total finds:           the number of observations when criterion is met.
Average finds per obs: the average occurrence of word when criterion is met.
Average length:        the average word length when criterion is met.
Average position:      the average position of match when criterion is met.
Average tf-idf:        the average term frequency-inverse document frequency
                       when the criterion is met.
Means test p-value:    the p-value for a means comparison test across samples
                       identified by the different criteria.

                               Summary Table                               
-----------------------------------------------------------------------------
variable:   v1
n: 562                                    Average                       Means
                 Total   -----------------------------------------       test
keyword(s)       Finds      Finds     Length   Position     TF-IDF    p-value
-----------------------------------------------------------------------------
财政                 4       1.75     150.75       58.5    .055839          .
经济                25       1.48     106.04      67.84    .052428    .083264
教育                 2        6.5      105.5         82    .266509    .317742
医疗                 2          3        117       66.5    .157223          .
健康                 8       1.25    103.375     58.625    .057632          .
疫情                15    2.06667    160.667          .    .047356          .
-----------------------------------------------------------------------------
Total                0          .          .          .          .    .000099
-----------------------------------------------------------------------------
exclusion(s):
textfind v1, key("经济") but("疫情") //排除疫情,对 “经济” 检索
 Summary Table                               
----------------------------------------------------------------------------
variable:   v1
n: 562                                   Average                       Means
                Total   -----------------------------------------       test
keyword(s)      Finds      Finds     Length   Position     TF-IDF    p-value
----------------------------------------------------------------------------
经济               25       1.48     106.04      67.84    .052428          .
----------------------------------------------------------------------------
Total              16      1.375    79.8125    51.3125    .072006          0
----------------------------------------------------------------------------
exclusion(s):
"疫情"

4.3 结果分析

根据统计结果,我们有以下发现:

  • “经济” 和 “疫情” 在 6 个检索词中出现次数最多;
  • “教育” 和 “医疗” 拥有最高的 tf-idf 值,说明 2020 年政府工作报告主题更倾向教育和医疗行业,这或许与新冠疫情的爆发有关。

5. 结语

本文主要从算法基础和 Stata 实操两方面介绍了 Stata 的命令 textfind,它能够识别并统计文本数据,并将其转换为分类数据。同时,textfind 的语法规则简单,应用也很方便,但其背后蕴藏着大量的文本分析的逻辑。此外,关键词 key() 选项中的内容多样化决定了其广泛的适用性,因此该命令有很高的实用价值。

6. 参考文献

  • Cox N J. Stata tip 98: Counting substrings within strings[J]. The Stata Journal, 2011, 11(2): 318-320. -PDF-

7. 相关推文

Note:产生如下推文列表的命令为:
lianxh 字符串 正则 文本, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

连享会-直播课 上线了!
http://lianxh.duanshu.com

免费公开课:


课程一览

支持回看

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]

Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。


关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。直播间 有很多视频课程,可以随时观看。
  • 连享会-主页知乎专栏,400+ 推文,实证分析不再抓狂。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会主页  lianxh.cn
连享会主页 lianxh.cn

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会学习群-常见问题解答汇总:
https://gitee.com/arlionn/WD

New! lianxh 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh