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

文摘   教育   2024-11-23 22:01   中国  

👇 连享会 · 推文导航 | www.lianxh.cn

🍓 课程推荐:连享会:2025 寒假班
嘉宾:连玉君(初级|高级);杨海生(前沿)
时间:2025 年 1 月 13-24 日
咨询:王老师 18903405450(微信)

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


目录

  • 1. 引言

  • 2 算法介绍

    • 2.1 n-grams 算法

    • 2.2 tf-idf 算法

  • 3. textfind 命令

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

    • 4.1 获取文本

    • 4.2 关键词查找

    • 4.3 结果分析

  • 5. 结语

  • 6. 参考文献

  • 7. 相关推文



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| 表示语料库文章总数;
  • 表示包含词 的文章数;
  • 在分母上加 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

温馨提示: 文中链接在微信中无法生效。请点击底部「阅读原文」

  • 专题:文本分析-爬虫
    • Stata文本分析之-tex2col-命令-文字变表格
    • Stata爬虫-正则表达式:爬取必胜客
    • Stata: 正则表达式和文本分析
    • 在 Visual Studio (vsCode) 中使用正则表达式
    • 正则表达式语言 - 快速参考
  • 专题:Python-R-Matlab
    • Python: 使用正则表达式从文本中定位并提取想要的内容


尊敬的老师 / 亲爱的同学们:

连享会致力于不断优化和丰富课程内容,以确保每位学员都能获得最有价值的学习体验。为了更精准地满足您的学习需求,我们诚挚地邀请您参与到我们的课程规划中来。 请您在下面的问卷中,分享您 感兴趣的学习主题或您希望深入了解的知识领域 。您的每一条建议都是我们宝贵的资源,将直接影响到我们课程的改进和创新。 我们期待您的反馈,因为您的参与和支持是我们不断前进的动力。感谢您抽出宝贵时间,与我们共同塑造更加精彩的学习旅程!https://www.wjx.cn/vm/YgPfdsJ.aspx# 再次感谢大家宝贵的意见!

New! Stata 搜索神器:lianxh 和 songbl  GIF 动图介绍
搜: 推文、数据分享、期刊论文、重现代码 ……
👉 安装:
  . ssc install lianxh
  . ssc install songbl
👉  使用:
  . lianxh DID 倍分法
  . songbl all

🍏 关于我们

  • 连享会 ( www.lianxh.cn,推文列表) 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 直通车: 👉【百度一下: 连享会】即可直达连享会主页。亦可进一步添加 「知乎」,「b 站」,「面板数据」,「公开课」 等关键词细化搜索。

连享会
连玉君老师团队分享,主页:lianxh.cn。白话计量,代码实操;学术路上,与君同行。
 最新文章