cntext 2.2.0
Chinese text analysis library, which can perform word frequency statistics, dictionary expansion, sentiment analysis, similarity, readability, co-occurrence analysis, social computing (attitude, prejudice, culture) on texts; Now support Ollama(LLM) analysis
License: MIT
Requires Python: <4.0,>=3.8

## cntext：面向社会科学研究的中文文本分析工具库
cntext 是专为**社会科学实证研究者**设计的中文文本分析 Python 库。它不止于词频统计式的传统情感分析，还拥有词嵌入训练、语义投影计算，**可从大规模非结构化文本中测量抽象构念**——如态度、认知、文化观念与心理状态。

🎯 **你能用它做什么**
1. 构建结构化研究数据集
   - 汇总多个文本文件（txt/pdf/docx/csv）为 DataFrame：``ct.read_files()``
   - 提取上市公司年报中的“管理层讨论与分析”（MD&A）：``ct.extract_mda()``
   - 计算文本可读性指标（如Flesch指数）：``ct.readability()``

2. **基础文本分析(传统方法)**
   - 词频统计与关键词提取：``ct.word_count()``
   - 情感分析（可选hownet、dutir等内置词典）：``ct.sentiment()``
   - 文本相似度计算（余弦距离）：``ct.cosine_sim()``

3. **测量内隐态度与文化变迁**
   - 两行代码训练领域专用词向量（Word2Vec/GloVe）：``ct.Word2Vec()``
   - 构建概念语义轴（如“创新 vs 守旧”）：``ct.generate_concept_axis()``
   - 通过语义投影量化刻板印象、组织文化偏移：``ct.project_text()``
4. **融合大模型进行结构化分析**
   - 调用 LLM 对文本进行语义解析，返回结构化结果（如情绪维度、意图分类）：``ct.llm()``


cntext 不追求黑箱预测，而致力于让文本成为理论驱动的科学测量工具。 开源免费，欢迎学界同仁使用、验证与共建。

<br><br>

## 安装 cntext

```
pip3 install cntext --upgrade
```

<br>

需要注意， **cntext 使用环境为 Python3.9 ~ 3.12**,如安装失败，问题可能出在 python 版本问题； 

<br><br>

## 功能模块
```python
import cntext as ct
ct.hello()
```
![](img/01-hello.jpg)

cntext 含 io、model、stats、mind 五个模块

1. 导入数据用 io
2. 训练模型扩展词典用 model
3. 统计词频、情感分析、相似度等用 stats
4. 可视化模块 plot
5. 态度认知文化变迁用 mind
6. 大模型 LLM

函数部分加粗的为常用函数。

| 模块        | 函数                                                                                           | 功能                                                                           |
| ----------- | ---------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ |
| **io**    | **_ct.get_cntext_path()_**                                                                     | 查看 cntext 安装路径                                                           |
| **io**    | **_ct.get_dict_list()_**                                                                       | 查看 cntext 内置词典                                                           |
| **io**    | `ct.get_files(fformat)`                                                                        | 查看符合 fformat 路径规则的所有的文件                                          |
| **io**    | `ct.detect_encoding(file, num_lines=100)`                                                      | 诊断 txt、csv 编码格式                                                         |
| **io**    | **_ct.read_yaml_dict(yfile)_**                                                                 | 读取内置 yaml 词典                                                             |
| **io**    | **_ct.read_pdf(file)_**                                                                        | 读取 PDF 文件                                                                  |
| **io**    | **_ct.read_docx(file)_**                                                                       | 读取 docx 文件                                                                 |
| **io**    | **_ct.read_file(file, encodings)_**                                                            | 读取文件                                                                       |
| **io**    | **_ct.read_files(fformat, encoding)_**                                                         | 读取符合 fformat 路径规则的所有的文件，返回 df                                 |
| **io**    | **_ct.extract_mda(text, kws_pattern)_**                                                        | 提取 A 股年报中的 MD&A 文本内容。如果返回'',则提取失败。                       |
| **io**    | **_ct.traditional2simple(text)_**                                                              | 繁体转简体                                                                     |
| **io**    | **_ct.fix_text(text)_**                                                                        | 将不正常的、混乱编码的文本转化为正常的文本。例如全角转半角                     |
| **io**    | `ct.fix_contractions(text)`                                                                    | 英文缩写(含俚语表达)处理， 如 you're -> you are                                |
| **io** | `ct.clean_text(text, lang='chinese')`               | 中文、英文文本清洗         |
| **model** | **_ct.Word2Vec(corpus_file, encoding, lang='chinese', ...)_**                                  | 训练 Word2Vec                                                                  |
| **model** | **_ct.GloVe(corpus_file, encoding, lang='chinese', ...)_**                                     | GloVe, 底层使用的 [Standfordnlp/GloVe](https://github.com/standfordnlp/GloVe)  |
| **model** | **_ct.evaluate_similarity(wv, file=None)_**                                                    | 使用近义法评估模型表现，默认使用内置的数据进行评估。                           |
| **model** | **_ct.evaluate_analogy(wv, file=None)_**                                                       | 使用类比法评估模型表现，默认使用内置的数据进行评估。                           |
| **model** | **_ct.glove2word2vec(glove_file, word2vec_file)_**                                             | 将 GLoVe 模型.txt 文件转化为 Word2Vec 模型.txt 文件； 一般很少用到             |
| **model** | **_ct.load_w2v(wv_path)_**                                                                     | 读取 cntext2.x 训练出的 Word2Vec/GloVe 模型文件                                |
| **model** | **_ct.expand_dictionary(wv, seeddict, topn=100)_**                                             | 扩展词典, 结果保存到路径[output/Word2Vec]中                                    |
| **model** | `ct.SoPmi(corpus_file, seed_file, lang='chinese')`                                             | 共现法扩展词典                                                                 |
| **stats** | `ct.word_count(text, lang='chinese')`                                                          | 词频统计                                                                       |
| **stats** | `readability(text, lang='chinese', syllables=3)`                                               | 文本可读性                                                                     |
| **stats** | **_ct.sentiment(text, diction, lang='chinese')_**                                              | 无(等)权重词典的情感分析                                                       |
| **stats** | `ct.sentiment_by_valence(text, diction, lang='chinese')`                                       | 带权重的词典的情感分析                                                         |
| **stats** | **_ct.word_in_context(text, keywords, window=3, lang='chinese')_**                             | 在 text 中查找 keywords 出现的上下文内容(窗口 window)，返回 df                 |
| **stats** | **_ct.epu()_**                                                                                 | 使用新闻文本数据计算经济政策不确定性 EPU，返回 df                              |
| **stats** | **_ct.fepu(text, ep_pattern='', u_pattern='')_**                                               | 使用 md&a 文本数据计算企业不确定性感知 FEPU                                    |
| **stats** | **_ct.semantic_brand_score(text, brands, lang='chinese')_**                                    | 衡量品牌（个体、公司、品牌、关键词等）的重要性                                 |
| **stats** | **_ct.cosine_sim(text1, text2, lang='chinese')_**                                              | 余弦相似度                                                                     |
| **stats** | `ct.jaccard_sim(text1, text2, lang='chinese')`                                                 | Jaccard 相似度                                                                 |
| **stats** | `ct.minedit_sim(text1, text2, lang='chinese')`                                                 | 最小编辑距离                                                                   |
| **stats** | `ct.word_hhi(text)`                                                                            | 文本的赫芬达尔-赫希曼指数                                                      |
| **_plot_**  | `ct.matplotlib_chinese()`                                                                      | 支持 matplotlib 中文绘图                                                       |
| **plot**  | `ct.lexical_dispersion_plot1(text, targets_dict, lang, title, figsize)`                        | 对某一个文本 text， 可视化不同目标类别词 targets_dict 在文本中出现位置         |
| **plot**  | `ct.lexical_dispersion_plot2(texts_dict, targets, lang, title, figsize)`                       | 对某几个文本 texts_dict， 可视化某些目标词 targets 在文本中出现相对位置(0~100) |
| **mind**  | `ct.generate_concept_axis(wv, poswords, negwords)`                                                 | 生成概念轴向量。                                                               |
| **mind**  | **_tm = ct.Text2Mind(wv)_**<br>                                                                | 单个 word2vec 内挖掘潜在的态度偏见、刻板印象等。tm 含多重方法                  |
| **mind**  | `sematic_projection(wv, words, poswords, negwords, return_full=False, cosine=False)`                                            | 测量语义投影                                                                   |
| **mind**  | `ct.project_word(wv, a, b, cosine=False)`                                                                    | 计算词语 a 在词语 b 上的投影                                                   |
| **mind**  | `ct.project_text(wv, text, axis, lang='chinese', cosine=False)`                                                                    | 计算词语文本text在概念轴向量axis上的投影值|
| **mind**  | `ct.sematic_distance(wv, words1, words2)`                                                      | 测量语义距离                                                                   |
| **mind**  | `ct.divergent_association_task(wv, words)`                                                     | 测量发散思维(创造力)                                                           |
| **mind**  | `ct.discursive_diversity_score(wv, words)`                                                     | 测量语言差异性(认知差异性)                                                     |
| **mind**  | **ct.procrustes_align(base_wv, other_wv)**                                                   | 两个 word2vec 进行语义对齐，可反应随时间的社会语义变迁                         |
| **_LLM_**   | **ct.llm(text, prompt, output_format, task, backend, base_url, api_key, model_name, temperature)** | 调用大模型执行结构化文本分析任务（如情感分析、关键词提取、分类等）。 |

<br><br>

## QuickStart

```python
import cntext as ct

print('当前cntext版本: ', ct.__version__)
help(ct)
```

Run

```
当前cntext版本: 2.1.7

Help on package cntext:

NAME
    cntext

PACKAGE CONTENTS
    io
    mind
    model
    stats
    llm
...
```

<br>

<br>

## 一、IO 模块

| 模块     | 函数                                      | 功能                                                       |
| -------- | ----------------------------------------- | ---------------------------------------------------------- |
| **io** | **_ct.get_dict_list()_**                  | 查看 cntext 内置词典                                       |
| **io** | **_ct.read_yaml_dict(yfile)_**            | 读取内置 yaml 词典                                         |
| **io** | `ct.detect_encoding(file, num_lines=100)` | 诊断 txt、csv 编码格式                                     |
| **io** | `ct.get_files(fformat)`                   | 查看符合 fformat 路径规则的所有的文件                      |
| **io** | **_ct.read_yaml_dict(yfile)_**            | 读取内置 yaml 词典                                         |
| **io** | **_ct.read_pdf(file)_**                   | 读取 PDF 文件                                              |
| **io** | **_ct.read_file(file, encoding)_**        | 读取文件                                                   |
| **io** | **_ct.read_files(fformat, encoding)_**    | 读取符合 fformat 路径规则的所有的文件，返回 df             |
| **io** | **_ct.extract_mda(text, kws_pattern)_**   | 提取 A 股年报中的 MD&A 文本内容。如果返回'',则提取失败。   |
| **io** | **_ct.traditional2simple(text)_**         | 繁体转简体                                                 |
| **io** | **_ct.fix_text(text)_**                   | 将不正常的、混乱编码的文本转化为正常的文本。例如全角转半角 |
| **io** | `ct.fix_contractions(text)`               | 英文缩写(含俚语表达)处理， 如 you're -> you are            |
| **io** | `ct.clean_text(text, lang='chinese')`               | 中文、英文文本清洗         |


### 1.1 get_dict_list()

查看 cntext 内置词典

```python
import cntext as ct

ct.get_dict_list()
```

Run

```
['zh_common_NTUSD.yaml',
 'zh_common_DUTIR.yaml',
 'enzh_common_StopWords.yaml',
 'en_valence_Concreteness.yaml',
 'en_common_LoughranMcDonald.yaml',
 'zh_common_FinanceSenti.yaml',
 'zh_common_FLS.yaml',
 'zh_common_TsinghuaPraiseDegrade.yaml',
 'zh_common_FEPU.yaml',
 'en_common_ANEW.yaml',
 'en_common_NRC.yaml',
 'zh_valence_ChineseEmoBank.yaml',
 'zh_valence_SixSemanticDimensionDatabase.yaml',
 'zh_common_FinacialFormalUnformal.yaml',
 'zh_common_LoughranMcDonald.yaml',
 'enzh_common_AdvConj.yaml',
 'en_common_SentiWS.yaml',
 'zh_common_Digitalization.yaml',
 'en_common_LSD2015.yaml',
 'zh_common_HowNet.yaml',
 'zh_common_EPU.yaml']
```

### 1.2 内置 yaml 词典

| pkl 文件                                           | 词典                                                                                                                                                              | 语言    | 功能                                                                                                                              |
| -------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------- |
| **_zh_valence_ChineseEmoBank.yaml_**               | 中文情感词典，含`效价valence`和`唤醒度arousal`。在 cntext 中，我们只使用了 CVAW 词表(单词)，其他词典如 CVAP, CVAS, CVAT 没有纳入到 ChineseEmoBank.pkl.            | Chinese | `效价valence`和`唤醒度arousal`                                                                                                    |
| **_zh_common_DUTIR.yaml_**                         | 大连理工大学情感本体库                                                                                                                                            | 中文    | 七大类情绪，`哀, 好, 惊, 惧, 乐, 怒, 恶`                                                                                          |
| **_zh_common_HowNet.yaml_**                        | 知网 Hownet 词典                                                                                                                                                  | 中文    | 正面词、负面词                                                                                                                    |
| `en_common_SentiWS.yaml`                           | SentimentWortschatz (SentiWS)                                                                                                                                     | 德文    | 正面词、负面词；<br>                                                                                                              |
| **_zh_common_FinacialFormalUnformal.yaml_**        | 金融领域正式、非正式；积极消极                                                                                                                                    | 中文    | formal-pos、<br>formal-neg；<br>unformal-pos、<br>unformal-neg                                                                    |
| `en_common_ANEW.yaml`                              | 英语单词的情感规范 Affective Norms for English Words (ANEW)                                                                                                       | 英文    | pleasure, arousal, dominance                                                                                                      |
| `en_common_LSD2015.yaml`                           | Lexicoder Sentiment Dictionary (2015)                                                                                                                             | 英文    | 正面词、负面词                                                                                                                    |
| `en_common_NRC.yaml`                               | NRC Word-Emotion Association Lexicon                                                                                                                              | 英文    | 细粒度情绪词；                                                                                                                    |
| **_zh_valence_SixSemanticDimensionDatabase.yaml_** | [**通用中英文六维语义情感词典**](https://textdata.cn/blog/2023-03-20-nature-six-semantic-dimension-database/), 含 17940 个中文词的六维度词库， 且每个维度有权重。 | 中文    | vision、socialness、emotion、time、space、motor                                                                                   |
| `enzh_common_AdvConj.yaml`                         | 副词连词                                                                                                                                                          | 中、英  |                                                                                                                                   |
| **_enzh_common_StopWords.yaml_**                   | 中英文停用词                                                                                                                                                      | 中、英  | 停用词                                                                                                                            |
| **_en_valence_Concreteness.yaml_**                 | [英文具体性词典](https://textdata.cn/blog/jcr_concreteness_computation/)                                                                                          | English | word & concreateness score                                                                                                        |
| **_zh_common_LoughranMcDonald.yaml_**              | 中文 LoughranMcDonald 词典                                                                                                                                        | 中文    | 正面、负面词                                                                                                                      |
| **_zh_common_Digitalization.yaml_**                | [管理世界\|吴非(2021)数字化词典](https://textdata.cn/blog/2022-11-03-mda-measure-digitalization/)                                                                 | 中文    | 含人工智能技术、大数据技术、云计算技术、区块链技术、数字技术应用等关键词列表。                                                    |
| **_en_common_LoughranMcDonald.yaml_**              | 英文 LoughranMcDonald 词典                                                                                                                                        | 英文    | 金融 LM 情绪词典 2018 年版本，含七个词表，分别是 Negative, Positive, Uncertainty, Litigious, StrongModal, WeakModal, Constraining |
| **_zh_common_FLS.yaml_**                           | [**业绩说明会前瞻性词典集**](https://textdata.cn/blog/2023-09-08-earnings-communication-conference-forward-looking-statements-information/)                       | 中文    | 含 174 个词语                                                                                                                     |
| **_zh_common_RhetoricalNationalism.yaml_**         | 修辞民族主义                                                                                                                                                      | 中文    | 含四个维度，民族自豪感、民族复兴、企业角色、排外主义，每个维度 100 个词。                                                         |

<br>

### 1.3 read_dict_yaml()

使用 cntext 读取 **_.yaml_** 词典文件； 返回的信息包括

- Name 词典的名字
- Desc 词典的含义、概念解释
- Refer 词典文献出处
- Category 词典 Dictionary 的关键词
- Dictionary 词典, python 字典格式

```python
import cntext as ct
print(ct.read_yaml_dict('zh_common_Digitalization.yaml'))
```

Run

```
{'Name': '中文数字化词典',
'Desc': '基于这篇论文，构建了中文数字化词典，含人工智能技术、大数据技术、云计算技术、区块链技术、数字技术应用等关键词列表。 ', 'Refer': '吴非,胡慧芷,林慧妍,任晓怡. 企业数字化转型与资本市场表现——来自股票流动性的经验证据[J]. 管理世界,2021,37(07):130-144+10.',
'Category': ['Artificial_Intelligence', 'Big_Data', 'Cloud_Computing', 'Block_Chains', 'Usage_of_Digitalization'],

'Dictionary':
    {'Artificial_Intelligence': ['人工智能', '商业智能', '图像理解', '投资决策辅助系统', '智能数据分析', '智能机器人', '机器学习', '深度学习', '语义搜索', '生物识别技术', '人脸识别', '语音识别', '身份验证', '自动驾驶', '自然语言处理'],
    'Big_Data': ['大数据', '数据挖掘', '文本挖掘', '数据可视化', '异构数据', '征信', '增强现实', '混合现实', '虚拟现实'],
    'Cloud_Computing': ['云计算', '流计算', '图计算', '内存计算', '多方安全计算', '类脑计算', '绿色计算', '认知计算', '融合架构', '亿级并发', 'EB级存储', '物联网', '信息物理系统'],
    'Block_Chains': ['区块链', '数字货币', '分布式计算', '差分隐私技术', '智能金融合约'],
    'Usage_of_Digitalization': ['移动互联网', '工业互联网', '移动互联', '互联网医疗', '电子商务', '移动支付', '第三方支付', 'NFC支付', '智能能源', 'B2B', 'B2C', 'C2B', 'C2C', 'O2O', '网联', '智能穿戴', '智慧农业', '智能交通', '智能医疗', '智能客服', '智能家居', '智能投顾', '智能文旅', '智能环保', '智能电网', '智能营销', '数字营销', '无人零售', '互联网金融', '数字金融', 'Fintech', '金融科技', '量化金融', '开放银行']}}
```

<br>

### 1.4 detect_encoding()

```
ct.detect_encoding(file)
```

通过读取前 num_lines 来识别 txt/csv 文件的编码格式

- **_file_** 文件路径

```python
import cntext as ct

#读取data文件夹下的【三体.txt】
#识别编码方式
ct.detect_encoding(file='data/三体.txt')
```

Run

```
utf-8
```

<br>

### 1.5 get_files(fformat)

- **fformat** fformat 格式支持 txt/pdf/docx/xlsx/csv 等。 `*`表示通配符

查看符合 fformat 路径规则的所有的文件， fformat 格式支持 txt/pdf/docx/xlsx/csv 等。 `*`表示通配符

| fformat 格式 | 识别的文件                       |
| ------------ | -------------------------------- |
| `*.txt`      | 匹配当前代码所在路径内的所有 txt |
| `*.pdf`      | 匹配当前代码所在路径内的所有 pdf |
| `data/*.txt` | 匹配「文件夹 data」内所有的 txt  |
| <br>         |                                  |

```python
#查看【文件夹data】内所有的 txt文件。
ct.get_files(fformat='data/*.txt')
```

Run

```
['data/三体.txt',
 'data/santi.txt',
 'data/w2v_corpus.txt',
 'data/sopmi_corpus.txt',
 'data/brown_corpus.txt',
 'data/sopmi_seed_words.txt']
```

<br>

### 1.6 read_pdf

读取 PDF，返回文本内容

```python
ct.read_pdf(file)
```

- **_file_** PDF 文件路径

点击 [**格力电器 2023.pdf**](https://textdata.cn/data/格力电器2023.pdf)

```python
import cntext as ct

text = ct.read_pdf('格力电器2023.pdf')
print(text)
```

Run

```
珠海格力电器股份有限公司 2023年年度报告全文
珠海格力电器股份有限公司
2023年年度报告


二〇二四年四月
珠海格力电器股份有限公司 2023年年度报告全文
 第 2 页 共 249 页 第一节 重要提示、目录和释义
公司董事会、监事会及董事、监事、高级管理人员保证年度报告内容
的真实、准确、完整，不存在虚假记载、误导性陈述或重大遗漏，并承担
个别和连带的法律
......
```

<br>

### 1.7 read_docx

读取 docx，返回文本内容

```python
ct.read_docx(file)
```

- **_file_** docx 文件路径

```python
import cntext as ct

text = ct.read_docx('test.docx')
text
```

Run

```
这是来自test.docx里内容
```

<br>

### 1.8 read_file()

```
ct.read_file(file, encoding='utf-8')
```

- **file** 待读取的文件路径； 支持 txt、pdf、docx、xlsx、xls， 返回 DataFrame(含 doc 和 file 两个字段)。
- **encoding** 待读取文件的编码方式

以 `data/三体.txt` 为例

```python
import cntext as ct

#默认encoding='utf-8'
#sdf = ct.read_file(file='data/三体.txt')

sdf = ct.read_file(file='data/三体.txt', encoding='utf-8')
sdf
```

![](img/01-san_ti_df.png)

<br>

### 1.9 read_files()

```
ct.read_files(fformat, encoding='utf-8'）
```

批量读取符合 fformat 格式的所有文件数据，返回 DataFrame(含 doc 和 file 两个字段)。

读取[文件夹 data 里所有 txt]

```python
import cntext as ct

# 默认encoding='utf-8'
# ddf = ct.read_files(fformat='data/*.txt')

ddf = ct.read_files(fformat='data/*.txt', encoding='utf-8')
ddf
```

![](img/02-ddf.png)

<br>

### 1.10 extract_mda

提取 A 股年报中的 MD&A 文本内容。如果返回'',则提取失败。

```
ct.extract_mda(text, kws_pattern='')
```

- text 中国 A 股年报原始文本
- kws_pattern 管理层讨论与分析章节识别关键词的模板。cntext 内置的 kws_pattern 内容如下

```
kws_pattern = '董事会报告|董事会报告与管理讨论|企业运营与管理评述|经营总结与分析|管理层评估与未来展望|董事局报告|管理层讨论与分析|经营情况讨论与分析|经营业绩分析|业务回顾与展望|公司经营分析|管理层评论与分析|执行摘要与业务回顾|业务运营分析'
```

<br>

```python
import cntext as ct

text = ct.read_pdf('格力电器2023.pdf')
mda_text = ct.extract_mda(text)
print(mda_text)
```

Run

```
'管理层讨论与分析  \n一、报告期内公司所处行业情况  \n（一）行业发展现状  \n1.消费领域 ——家电行业稳定增长，空调市场恢复明显  \n2023年，中国经济保持了整体恢复向好的态势，激发消费是稳增长的重中之重。国家鼓励和推动消费品以旧换\n新，促进消费经济大循环，加速更新需求释放，推动高能效产品设备销售和出口增长，进一步激发绿色消费潜力。  \n1）家电行业稳定增长  \n2023年，国内经济恢复明显，家电行业稳定增长。根据全国家用电器工业信息中心发布的《 2023年中国家电\n行业年度报告》，家电行业外销明显增长，出口规模为 6,174亿元，同比增长 9.9%；国内市场实现稳步增长，销售\n规模为7'
.......
.......
```

<br>

以[2001 年~2023 会计年度报告数据集](https://textdata.cn/blog/2023-03-23-china-a-share-market-dataset-mda-from-01-to-21/)为例， 查看 **_extract_mda_** 的抽取 mda 的能力。

```python
import glob
import cntext as ct

print('extract_mda识别能力')
for year in range(2001, 2024):
    num = 0
    for file in glob.glob(f'年报txt/{year}/*.txt'):
        mda_text = ct.extract_mda(open(file).read())
        if mda_text!='':
            num = num + 1

    volume = len(glob.glob(f'年报txt/{year}/*.txt'))
    ratio = num/volume

    print(f'{year}: {ratio:.2f}')
```

Run

```
2001: 0.24
2002: 0.37
2003: 0.43
2004: 0.70
2005: 0.77
2006: 0.78
2007: 0.79
2008: 0.77
2009: 0.79
2010: 0.82
2011: 0.84
2012: 0.96
2013: 0.95
2014: 0.98
2015: 0.98
2016: 0.99
2017: 0.98
2018: 0.98
2019: 0.99
2020: 0.97
2021: 0.98
2022: 0.99
2023: 0.99
```

建议各位用最近 10 年的年报数据，通过 extract_mda 提取 mda 文本，或者直接购买 [数据集 | 2001-2023 年 A 股上市公司年报&管理层讨论与分析](数据集 | 2001-2023 年 A 股上市公司年报&管理层讨论与分析)

<br>

### 1.11 traditional2simple()

繁体转简体

```
ct.traditional2simple(text, mode='t2s')
```

- **_text_** 待转换的文本
- **_mode_** 转换模式， 默认 mode='t2s'繁转简; mode 还支持 s2t

 <br>

```python
import cntext as ct

text = '簡體漢字'
ct.traditional2simple(text)
```

Run

```
'简体汉字'
```

<br>

```python
text = '简体汉字'
ct.traditional2simple(text, mode='s2t')
```

Run

```
'簡體漢字'
```

<br>

### 1.12 fix_text()

将不正常的、混乱编码的文本转化为正常的文本。例如全角转半角

```python
import cntext as ct

raw_text = '今日起可中遇到技术问题，可以拨打电话０３７１－６６３２１９９１、６６３２１９７３咨询。'

text = ct.fix_text(raw_text)
text
```

Run

```
今日起可中遇到技术问题，可以拨打电话0371-66321991、66321973咨询。
```

<br>

### 1.13 fix_contractions(text)

将英文缩写(含俚语表达)转化为完整的表达，如如

```
- you're -> you are
- yall  -> you all
- gotta  -> got to
...
```

<br>

```python
import cntext as ct

raw_text = "yall're happy now"

text = ct.fix_contractions(raw_text)
text
```

Run

```
"you all are happy now"
```

<br>


### 1.14 clean_text(text)

```python
ct.clean_text(text, lang='chinese')
```

- **_text_** 待处理的文本
- **_lang_** 语言类型， 默认 lang='chinese', 支持"english"、"chinese"

```python
import cntext as ct

chinese_text = ("今天的训练很棒！跑了5.6公里，心率稳定。"
                "查看 https://example.com/data 😊 #健身打卡")

print(">>> 中文清洗")
print("原始:", repr(chinese_text))
print("清洗:", repr(ct.clean_text(chinese_text, lang="chinese")))
print()

    # 英文测试
english_text = ("Great workout today! Ran 5.6 miles, HR stable. "
                "Check https://example.com/data 😊 #Fitness")
print(">>> 英文清洗")
print("原始:", repr(english_text))
print("清洗:", repr(ct.clean_text(english_text, lang="english")))
```
Run
```
>>> 中文清洗
原始: '今天的训练很棒！跑了5.6公里，心率稳定。查看 https://example.com/data 😊 #健身打卡'
清洗: '今天的训练很棒！跑了数字公里，心率稳定。查看   健身打卡'

>>> 英文清洗
原始: 'Great workout today! Ran 5.6 miles, HR stable. Check https://example.com/data 😊 #Fitness'
清洗: 'great workout today! ran NUMBER miles, hr stable. check  😊 #fitness'
```

<br><br>

## 二、Stats 模块

| 模块        | 函数                                                               | 功能                                                           |
| ----------- | ------------------------------------------------------------------ | -------------------------------------------------------------- |
| **stats** | `ct.word_count(text, lang='chinese')`                              | 词频统计                                                       |
| **stats** | `ct.readability(text, lang='chinese')`                             | 文本可读性                                                     |
| **stats** | **_ct.sentiment(text, diction, lang='chinese')_**                  | 无(等)权重词典的情感分析                                       |
| **stats** | `ct.sentiment_by_valence(text, diction, lang='chinese')`           | 带权重的词典的情感分析                                         |
| **stats** | **_ct.word_in_context(text, keywords, window=3, lang='chinese')_** | 在 text 中查找 keywords 出现的上下文内容(窗口 window)，返回 df |
| **stats** | **_ct.epu(text, e_pattern, p_pattern, u_pattern)_**                | 使用新闻文本数据计算经济政策不确定性 EPU，返回 df              |
| **stats** | **_ct.fepu(text, ep_pattern='', u_pattern='')_**                   | 使用 md&a 文本数据计算企业不确定性感知 FEPU                    |
| **stats** | **_ct.semantic_brand_score(text, brands, lang='chinese')_**        | 衡量品牌（个体、公司、品牌、关键词等）的重要性                 |
| **stats** | **_ct.cosine_sim(text1, text2, lang='chinese')_**                  | 余弦相似度                                                     |
| **stats** | `ct.jaccard_sim(text1, text2, lang='chinese')`                     | Jaccard 相似度                                                 |
| **stats** | `ct.minedit_sim(text1, text2, lang='chinese')`                     | 最小编辑距离                                                   |
| **stats** | `ct.word_hhi(text)`                                                | 文本的赫芬达尔-赫希曼指数                                      |

<br>

### 2.1 word_count()

统计词频， 返回 Counter(类似于 python 字典) ； 支持中英文

```
ct.word_count(text, lang='chinese', return_df=False)
```

- **text** 待分析的文本字符串
- **lang** 文本的语言类型， 中文 chinese、英文 english，默认中文。
- **return_df** 返回结果是否为 dataframe，默认 False

```python
import cntext as ct

text = '致力于致力于以零文章处理费或订阅费发布优质研究软件。'

#ct.word_count(text, lang='chinese')
ct.word_count(text)
```

Run

```
Counter({'致力于': 2,
         '文章': 1,
         '处理费': 1,
         '订阅费': 1,
         '发布': 1,
         '优质': 1,
         '研究': 1,
         '软件': 1})
```

<br>

```python
ct.word_count(text, return_df=True)
```

![](img/09-term_freq.png)

<br>

### 2.2 readability()

```
ct.readability(text, lang='chinese', syllables=3, return_series=False)
```

计算文本可读性常见指标； 含 Gunning Fog Index、 SMOG Index、Coleman Liau Index、 Automated Readability Index(ARI)、Readability Index(Rix)； 指标越大，复杂度越高，文本的可读性越差。

- **text** 待分析的文本字符串
- **lang** 文本的语言类型， 中文 chinese、英文 english，默认中文。
- **syllables** 音节数(汉字数)大于等于 syllables 为复杂词. 默认值为 3
- **return_series**: 计算结果是否输出为 pd.Series 类型，默认为 False

<br>

```
Gunning Fog Index = 0.4 * (Total_Words/Total_Sentences + 100 * Complex_Words/Total_Words)
SMOG Index = 1.0430 * sqrt(Complex_Words/Total_Sentences) * 30 + 3.1291
Coleman-Liau Index = 0.0588 * (100*Total_Letters/Total_Words) -0.296*(100*Total_Sentences/Total_Words) - 15.8
Automated Readability Index(ARI) = 4.71 * (Total_Characters/Total_Words) + 0.5*(Total_Words/Total_Sentences) - 21.43
Readability Index(RIX) = Complex_Words * (6 + Total_characters) / Total_Sentences
```

<br>

```python
import cntext as ct

text = '致力于以零文章处理费或订阅费发布优质研究软件。'

ct.readability(text, lang='chinese', syllables=3)
```

Run

```
{'fog_index': 120.4,
 'flesch_kincaid_grade_level': 20.2,
 'smog_index': 57.32,
 'coleman_liau_index': 83.96,
 'ari': 87.4,
 'rix': 87.0}
```

<br>

### 2.3 sentiment(text, diction, lang)

常见的情感分析默认情绪词无(等)权重， 通过统计词语个数来反应情感信息。

```
sentiment(text, diction, lang='chinese', return_series=False)
```

- **text** 待分析的文本字符串
- **diction** 格式为 Python 字典类型。形如下面的案例
- **lang** 文本的语言类型， 中文 chinese、英文 english，默认中文。
- **return_series** 计算结果是否输出为 pd.Series 类型，默认为 False

```python
import cntext as ct

diction = {'pos': ['高兴', '快乐', '分享'],
           'neg': ['难过', '悲伤'],
           'adv': ['很', '特别']}

text = '我今天得奖了，很高兴，我要将快乐分享大家。'
ct.sentiment(text=text,
             diction=diction,
             lang='chinese')
```

Run

```
{'pos_num': 3,
 'neg_num': 0,
 'adv_num': 1,
 'stopword_num': 8,
 'word_num': 14,
 'sentence_num': 1}
```

<br>

### 2.4 sentiment_by_valence()

```
ct.sentiment_by_valence(text, diction, lang='chinese', return_series=False)
```

- **text** 待分析的文本字符串
- **diction** 格式为 Python 字典类型。形如下面的案例
- **lang** 文本的语言类型， 中文 chinese、英文 english，默认中文。
- **return_series** 计算结果是否输出为 pd.Series 类型，默认为 False

常见的情感分析是无(等)权重, 但实际上不同的词语所携带的情感信息的强度差异是很大的。据此学者们开发出很多带权重的词典，例如

- 英文具体性词典 en_valence_Concreteness.yaml， 词典中每个词都有一个 concreteness 值
- 中文六维度语义词典 zh_valence_SixSemanticDimensionDatabase.yaml, 每个中文词有六个值。

以具体性为例， **语言具体性 Concreteness**描述了一个词在多大程度上是指一个实际的、有形的或“真实的”实体，以一种更具体、更熟悉、更容易被眼睛或心灵感知的方式描述对象和行为（即，可想象或生动；Brysbaert, Warriner, and Kuperman 2014; Semin and Fiedler 1988)

```python
import cntext as ct
import pandas as pd

concreteness_dict = ct.read_yaml_dict('en_valence_Concreteness.yaml')['Dictionary']
concreteness_dict
```

Run

```
{'roadsweeper': {'concreteness': 4.85},
 'traindriver': {'concreteness': 4.54},
 'tush': {'concreteness': 4.45},
 'hairdress': {'concreteness': 3.93},
 'pharmaceutics': {'concreteness': 3.77},
 'hoover': {'concreteness': 3.76},
 'shopkeeping': {'concreteness': 3.18},
 'pushiness': {'concreteness': 2.48},
 ......
 }
```

可能 **_concreteness_dict_**不够直观， 如果整理转