Firth(1957)有一句名言,理解一个词要从ta身边入手。

You shall know a word by the company it keeps

通过一个单词所处的语境,我们可以了解该单词的含义。该谚语源于英国语言学家 J.R. Firth 的理论,他认为单词的含义是由其周围的语境和与之相伴的其他单词所决定的,因此我们需要通过单词出现的上下文来理解其含义。这一理论在语言学、自然语言处理等领域有着广泛的应用。之前分享过

之前分享过 使用正则表达式、文本向量化、线性回归算法从md&a数据中计算 「企业融资约束指标」 , 使用的是正则表达式识别融资约束文本。但是正则表达式设计十分复杂且有难度,在此之前,如果能够查看某些融资关键词附近上下文, 可帮助研究者更全面地了解数据集中关键词的使用情况和语境,更好的设计正则表达式,亦或许意外找出新的有价值的线索。


代码

import jieba
import re
from nltk.tokenize import word_tokenize
import pandas as pd
import warnings

def word_in_context(text, keywords, window=3, lang='chinese'):
    """
    Given text and keywords, the task is to find the text where the keyword appears
    Args:
        text (str): input document, string format
        keywords (list): keywords
        window (int): return the text where the keyword appears, default is 3, meaning return 3 word.
        lang (str, optional): setting the lang, only support chinese and english. Defaults to 'chinese'.

    Returns:
        list contains multiple dictionaries, where each dictionary contains the sentence, keyword, and the sentence where the keyword appears
    """
    if lang=='chinese':
        words = jieba.lcut(text.lower())
    else:
        try:
            words = word_tokenize(text.lower())
        except:
            warnings.warn("你应该安装nltk和对应的nltk_data, 请看B站https://www.bilibili.com/video/BV14A411i7DB")
            words = text.lower().split(' ')
    keywords = [w.lower() for w in keywords]
    kw_idxss = [[i for i, x in enumerate(words) if x == keyword] for keyword in keywords]
    rows = []
    for keyword, kw_idxs in zip(keywords, kw_idxss):
        for idx in kw_idxs:
            half = int((window-1)/2)
            start = max(0, idx - half)
            end = min(len(words), idx + half + 1)
            row = {'keyword': keyword, 
                   'context': ''.join(words[start: end]) if lang=='chinese' else ' '.join(words[start: end])
                      }
            rows.append(row)
    df = pd.DataFrame(rows)
    return df




练习

#测试代码,假设zh_text是年报文本,从找找出丝网词相关词的上下文
zh_text = """
【插入一条自家广告】大邓自己家的家,
安平县多隆丝网制品,生产销售不锈钢轧花网、
电焊网、石笼网、刀片刺绳、冲孔网等丝网制品。
联系人 邓颖静 0318-7686899

人生苦短,我学Python
在社科中,可以用Python做文本分析
Python是一门功能强大的编程语言,广泛应用在经管社科领域。
可以做网络爬虫、文本分析、LDA话题模型、相似度分析等。

今年经济不景气,形势异常严峻。
由于疫情不景气,静默管理, 产品积压, 公司经营困难。
保就业促就业,任务十分艰巨。
"""

#【产品词】上下文
word_in_context(text = zh_text, 
                keywords = ['石笼'], 
                window=10, 
                lang='chinese')
keyword context
石笼 电焊网、石笼网、刀片刺绳

#【经营】上下文
word_in_context(text = zh_text, 
                keywords = ['经营'], 
                window=10, 
                lang='chinese')
keyword context
经营 >积压, 公司经营困难。\n保
#【Python】上下文
word_in_context(text = zh_text, 
                keywords = ['python'], 
                window=10, 
                lang='chinese')
keyword context
python 人生苦短,我学python\n在社科中
python 中,可以用python做文本分析\n
python 做文本分析\npython是一门功能强大的



广而告之