精华内容
下载资源
问答
  • 2021-03-13 00:28:55

    就在前几天的任务中用到了从文本描述中提取关键字的操作,特意从网上找到了一些提取关键字的方法。

    总结如下:需要引入jieba这个库文件

    基于TF-IDF算法进行关键词提取

    importjieba.analyse

    sentence= "人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。人工智能从诞生以来,理论和技术日益成熟,应用领域也不断扩大,可以设想,未来人工智能带来的科技产品,将会是人类智慧的“容器”。人工智能可以对人的意识、思维的信息过程的模拟。人工智能不是人的智能,但能像人那样思考、也可能超过人的智能。人工智能是一门极富挑战性的科学,从事这项工作的人必须懂得计算机知识,心理学和哲学。人工智能是包括十分广泛的科学,它由不同的领域组成,如机器学习,计算机视觉等等,总的说来,人工智能研究的一个主要目标是使机器能够胜任一些通常需要人类智能才能完成的复杂工作。但不同的时代、不同的人对这种“复杂工作”的理解是不同的。 [1] 2017年12月,人工智能入选“2017年度中国媒体十大流行语”。"keywords= " ".join(jieba.analyse.extract_tags(sentence=sentence, topK=20, withWeight=False, allowPOS=()))print(keywords)

    keywords= jieba.analyse.extract_tags(sentence, topK=10, withWeight=True, allowPOS=(['n', 'v'])) #只提取前10个名词和动词

    print(keywords)

    基于TextRank算法进行关键词提取

    importjieba.analyse

    sentence= "人工智能(Artificial Intelligence),英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能是计算机科学的一个分支,它企图了解智能的实质,并生产出一种新的能以人类智能相似的方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等。人工智能从诞生以来,理论和技术日益成熟,应用领域也不断扩大,可以设想,未来人工智能带来的科技产品,将会是人类智慧的“容器”。人工智能可以对人的意识、思维的信息过程的模拟。人工智能不是人的智能,但能像人那样思考、也可能超过人的智能。人工智能是一门极富挑战性的科学,从事这项工作的人必须懂得计算机知识,心理学和哲学。人工智能是包括十分广泛的科学,它由不同的领域组成,如机器学习,计算机视觉等等,总的说来,人工智能研究的一个主要目标是使机器能够胜任一些通常需要人类智能才能完成的复杂工作。但不同的时代、不同的人对这种“复杂工作”的理解是不同的。2017年12月,人工智能入选“2017年度中国媒体十大流行语”。"result= " ".join(jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('ns', 'n', 'vn', 'v')))print(result)#只需要名词和动词

    result = " ".join(jieba.analyse.textrank(sentence, topK=20, withWeight=False, allowPOS=('n','v')))print(result)

    基于pyhanlp进行关键词提取(这一部分我测试失败了,好像是说我的Java包引入错误,因为hanlp是一个Java项目,所以无法运行)

    from pyhanlp import *result= HanLP.extractKeyword(sentence, 20)print(result)

    参考地址:https://blog.csdn.net/cdlwhm1217096231/article/details/94566936?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

    参考的博文还有一个比较全面的方法,他在例子中用到了

    (1)文件加载

    (2)jieba分词

    (3)去停用词

    (4)构建词袋模型

    (5)LDA模型训练

    (6)结果可视化

    等多中方式,有兴趣的可以参考上面的博文

    更多相关内容
  • 主要介绍了PHP函数实现从一个文本字符串中提取关键字的方法,涉及php针对字符串的遍历与查找等操作技巧,需要的朋友可以参考下
  • 提取文本关键字

    2018-08-03 11:37:52
    提取文本关键字,并附带关键字评分,可以控制提取个数,例如:"我今天很开心,一口气买了好多东西!";提取结果:[一口气/4.471413137990432, 今天/2.37971480120688, 开心/1.1111375260524337]
  • 文本关键字提取

    2018-05-21 16:30:33
    文本关键字提取,需要自建知识库,采用文本处理等方式
  • 自然语言处理分析的最基本和初始步骤是关键词提取,在NLP中,我们有许多...并将简单概述下每个方法的使用场景,然后使用附加示例将其应用于提取关键字。本文关键字:关键字提取、关键短语提取、Python、NLP、TextR...
    自然语言处理分析的最基本和初始步骤是关键词提取,在NLP中,我们有许多算法可以帮助我们提取文本数据的关键字。本文中,云朵君将和大家一起学习四种即简单又有效的方法,它们分别是 Rake、Yake、Keybert 和 Textrank。并将简单概述下每个方法的使用场景,然后使用附加示例将其应用于提取关键字。

    本文关键字:关键字提取、关键短语提取、Python、NLP、TextRank、Rake、BERT

    在我之前的文章中,我介绍了使用 Python 和 TFIDF 从文本中提取关键词,TFIDF 方法依赖于语料库统计来对提取的关键字进行加权,因此它的缺点之一是不能应用于单个文本。

    为了说明每种关键字提取方法(Rake、Yake、Keybert 和 Textrank)的实现原理,将使用已发表的文章[1]的摘要以及主题指定的关键字,并通过检查哪些方法的提取的关键词与作者设置的关键词更接近,来检验每种方法。在关键词提取任务中,有显式关键词,即显式地出现在文本中;也有隐式关键词,即作者提到的关键词没有显式地出现在文本中,而是与文章的领域相关。

    98ec6121ec9cf5204c48b5a257f9518b.png

    在上图展示的示例中,有文本标题和文章摘要,标准关键字(由作者在原始文章中定义)被标记为黄色。注意machine learning这个词并不明确,也没有在摘要中找到。虽然可以在文章的全文中提取,但这里为了简单起见,语料数据仅限于摘要。

    文本准备

    标题通常与提供的文本相结合,因为标题包含有价值的信息,并且高度概括了文章的内容。因此,我们将文本和标题两个变量之间通过加上一个加号而简单地拼接。

    title = "VECTORIZATION OF TEXT USING DATA MINING METHODS"
    text = "In the text mining tasks, textual representation should be not only efficient but also interpretable, as this enables an understanding of the operational logic underlying the data mining models. Traditional text vectorization methods such as TF-IDF and bag-of-words are effective and characterized by intuitive interpretability, but suffer from the «curse of dimensionality», and they are unable to capture the meanings of words. On the other hand, modern distributed methods effectively capture the hidden semantics, but they are computationally intensive, time-consuming, and uninterpretable. This article proposes a new text vectorization method called Bag of weighted Concepts BoWC that presents a document according to the concepts’ information it contains. The proposed method creates concepts by clustering word vectors (i.e. word embedding) then uses the frequencies of these concept clusters to represent document vectors. To enrich the resulted document representation, a new modified weighting function is proposed for weighting concepts based on statistics extracted from word embedding information. The generated vectors are characterized by interpretability, low dimensionality, high accuracy, and low computational costs when used in data mining tasks. The proposed method has been tested on five different benchmark datasets in two data mining tasks; document clustering and classification, and compared with several baselines, including Bag-of-words, TF-IDF, Averaged GloVe, Bag-of-Concepts, and VLAC. The results indicate that BoWC outperforms most baselines and gives 7% better accuracy on average"
    full_text = title +", "+ text 
    print("The whole text to be usedn", full_text)

    现在开始使用今天的四个主角来提取关键字!

    Yake

    它是一种轻量级、无监督的自动关键词提取方法,它依赖于从单个文档中提取的统计文本特征来识别文本中最相关的关键词。该方法不需要针对特定的文档集进行训练,也不依赖于字典、文本大小、领域或语言。Yake 定义了一组五个特征来捕捉关键词特征,这些特征被启发式地组合起来,为每个关键词分配一个分数。分数越低,关键字越重要。你可以阅读原始论文[2],以及yake 的Python 包[3]关于它的信息。

    特征提取主要考虑五个因素(去除停用词后)

    大写term

    (Casing)
    大写字母的term(除了每句话的开头单词)的重要程度比那些小写字母的term重要程度要大。

    其中,  表示该词的大写次数, 表示该词的缩写次数。

    词的位置

    (Word Position)
    文本越开头的部分句子的重要程度比后面的句子重要程度要大。

    402 Payment Required

    其中 表示包含该词的所有句子在文档中的位置中位数。

    词频

    (Term Frequency)
    一个词在文本中出现的频率越大,相对来说越重要,同时为了避免长文本词频越高的问题,会进行归一化操作。

    402 Payment Required

    其中,MeanTF是整个词的词频均值, 是标准差。

    上下文关系

    (Term Related to Context)
    一个词与越多不相同的词共现,该词的重要程度越低。

    402 Payment Required

    其中 表示窗口size为 从左边滑动, 表示从右边滑动。 表示出现在固定窗口大小为 下,出现不同的词的个数。 表示所有词频的最大值。

    词在句子中出现的频率

    (Term Different Sentence)
    一个词在越多句子中出现,相对更重要

    402 Payment Required

    其中 SF(t) 是包含词t tt的句子频率, 表示所有句子数量。
    最后计算每个term的分值公式如下:

    402 Payment Required

    表示的是单词 的分值情况,其中 分值越小,表示的单词 越重要。

    安装和使用

    pip install git+https://github.com/LIAAD/yake 
    import yake

    首先从 Yake 实例中调用 KeywordExtractor 构造函数,它接受多个参数,其中重要的是:要检索的单词数top,此处设置为 10。参数 lan:此处使用默认值en。可以传递停用词列表给参数 stopwords。然后将文本传递给 extract_keywords 函数,该函数将返回一个元组列表 (keyword: score)。关键字的长度范围为 1 到 3。

    kw_extractor = yake.KeywordExtractor(top=10, stopwords=None)
    keywords = kw_extractor.extract_keywords(full_text)
    for kw, v in keywords:
       print("Keyphrase: ",kw, ": score", v)
    8ec036a61939d8d682a780987a829713.png

    从结果看有三个关键词与作者提供的词相同,分别是text mining, data miningtext vectorization methods。注意到Yake会区分大写字母,并对以大写字母开头的单词赋予更大的权重。

    Rake

    Rake 是 Rapid Automatic Keyword Extraction 的缩写,它是一种从单个文档中提取关键字的方法。实际上提取的是关键的短语(phrase),并且倾向于较长的短语,在英文中,关键词通常包括多个单词,但很少包含标点符号和停用词,例如and,the,of等,以及其他不包含语义信息的单词。

    Rake算法首先使用标点符号(如半角的句号、问号、感叹号、逗号等)将一篇文档分成若干分句,然后对于每一个分句,使用停用词作为分隔符将分句分为若干短语,这些短语作为最终提取出的关键词的候选词。

    每个短语可以再通过空格分为若干个单词,可以通过给每个单词赋予一个得分,通过累加得到每个短语的得分。Rake 通过分析单词的出现及其与文本中其他单词的兼容性(共现)来识别文本中的关键短语。最终定义的公式是:

    即单词 的得分是该单词的度(是一个网络中的概念,每与一个单词共现在一个短语中,度就加1,考虑该单词本身)除以该单词的词频(该单词在该文档中出现的总次数)。

    然后对于每个候选的关键短语,将其中每个单词的得分累加,并进行排序,RAKE将候选短语总数的前三分之一的认为是抽取出的关键词。

    安装和使用

    # $ git clone https://github.com/zelandiya/RAKE-tutorial
    # 要在python代码中导入rake:
    import rake 
    import operator
    
    # 加载文本并对其应用rake:
    filepath = "keyword_extraction.txt"
    rake_object = rake.Rake(filepath)
    text = "Compatibility of systems of linear constraints over the set of natural numbers. Criteria of compatibility of a system of linear Diophantine equations, strict inequations, and nonstrict inequations are considered.Upper bounds for components of a minimal set of solutions and algorithms of construction of minimal generatingsets of solutions for all types of systems are given. These criteria and the corresponding algorithms for constructing a minimal supporting set of solutions can be used in solving all the considered types of systems and systems of mixed types."
    sample_file = open(“data/docs/fao_test/w2167e.txt”, ‘r’)
    text = sample_file.read()
    keywords = rake_object.run(text) print “Keywords:”, keywords

    候选关键字

    如上所述,我们知道RAKE通过使用停用词和短语分隔符解析文档,将包含主要内容的单词分类为候选关键字。这基本上是通过以下一些步骤来完成的,首先,文档文本被特定的单词分隔符分割成一个单词数组,其次,该数组再次被分割成一个在短语分隔符和停用单词位置的连续单词序列。最后,位于相同序列中的单词被分配到文本中的相同位置,并一起被视为候选关键字。

    stopwordpattern = rake.build_stop_word_regex(filepath)
    phraseList = rake.generate_candidate_keywords(sentenceList, stopwordpattern)

    关键词得分

    从文本数据中识别出所有候选关键字后,将生成单词共现图,该图计算每个候选关键字的分数,并定义为成员单词分数。借助该图,我们根据图中顶点的程度和频率评估了计算单词分数的几个指标。

    keywordcandidates = rake.generate_candidate_keyword_scores(phraseList, wordscores)

    提取关键词

    计算候选关键字得分后,将从文档中选择前T个候选关键字。T值是图中字数的三分之一。

    totalKeywords = len(sortedKeywords)
    for keyword in sortedKeywords[0:(totalKeywords / 3)]: 
          print “Keyword: “, keyword[0], “, score: “, keyword[1]

    另一个库

    # pip install multi_rake
    from multi_rake import Rake
    rake = Rake()
    keywords = rake.apply(full_text)
    print(keywords[:10])
    9d307f8833bd1f883f7643341fbf0547.png

    TextRank

    TextRank 是一种用于提取关键字和句子的无监督方法。它一个基于图的排序算法。其中每个节点都是一个单词,边表示单词之间的关系,这些关系是通过定义单词在预定大小的移动窗口内的共现而形成的。

    该算法的灵感来自于 Google 用来对网站进行排名的 PageRank。它首先使用词性 (PoS) 对文本进行标记和注释。它只考虑单个单词。没有使用 n-gram,多词是后期重构的。

    TextRank算法是利用局部词汇之间关系(共现窗口)对后续关键词进行排序,直接从文本本身抽取。其主要步骤如下:

    1. 把给定的文本T按照完整句子进行分割,即

    2. 对于每个句子,进行分词和词性标注处理,并过滤掉停用词,只保留指定词性的单词,如名词、动词、形容词,即 ,其中是保留后的候选关键词。

    3. 构建候选关键词图 ,其中V为节点集,由(2)生成的候选关键词组成,然后采用共现关系co-occurrence构造任两点之间的边,两个节点之间存在边仅当它们对应的词汇在长度为K的窗口中共现,K表示窗口大小,即最多共现K个单词。

    4. 根据上面公式,迭代传播各节点的权重,直至收敛。

    5. 对节点权重进行倒序排序,从而得到最重要的T个单词,作为候选关键词。

    6. 由(5)得到最重要的T个单词,在原始文本中进行标记,若形成相邻词组,则组合成多词关键词。例如,文本中有句子“Matlab code for plotting ambiguity function”,如果“Matlab”和“code”均属于候选关键词,则组合成“Matlab code”加入关键词序列。

    安装及使用

    要使用Textrank生成关键字,必须首先安装 summa 包,然后必须导入模块 keywords

    pip install summa 
    from summa import keywords

    之后,只需调用 keywords 函数并将要处理的文本传递给它。我们还将 scores 设置为 True 以打印出每个结果关键字的相关性。

    TR_keywords = keywords.keywords(full_text, scores=True) 
    print(TR_keywords[0:10])
    847f9ce87b24795d0099cc6397460a24.png

    KeyBERT

    KeyBERT[4]是一种简单易用的关键字提取算法,它利用 SBERT 嵌入从文档中生成与文档更相似的关键字和关键短语。首先,使用 sentences-BERT 模型生成文档embedding。然后为 N-gram 短语提取词的embedding。然后使用余弦相似度测量每个关键短语与文档的相似度。最后将最相似的词识别为最能描述整个文档并被视为关键字的词。

    安装和使用

    要使用 keybert 生成关键字,必须先安装 keybert 包,然后才能导入模块 keyBERT。

    pip install keybert
    from keybert import KeyBERT

    然后创建一个接受一个参数的 keyBERT 实例,即 Sentences-Bert 模型。可以从以下来源[5]中选择想要的任何embedding模型。根据作者的说法,all-mpnet-base-v2模型是最好的。

    kw_model = KeyBERT(model='all-mpnet-base-v2')
    它将像这样开始下载:
    3085f5a065288028a67871750b69d076.png
    下载 BERT 预训练模型
    keywords = kw_model.extract_keywords(full_text, 
                                         keyphrase_ngram_range=(1, 3), 
                                         stop_words='english', 
                                         highlight=False, 
                                         top_n=10) 
    
    keywords_list= list(dict(keywords).keys()) 
    print(keywords_list)
    7fdbc26500c50a4d00b7172c15ce09bf.png

    考虑到大多数关键短语的长度在 1 到 2 之间,可以将 keyphrase_ngram_range 更改为 (1,2)。这次我们将 highlight 设置为 true。

    8e6eda93b53d3325c710c6a22027b79b.png

    写在最后

    到这里我们已经一起学习了在提取关键字/关键短语领域使用的四种最棒的技术,并提供了简单代码实现。这四种方法各有千秋。并且每个都成功地提取了与作者指定的关键字相同或接近并与该领域相关的关键字。

    若你有学到一点什么,记得 点赞 收藏 加关注 哦!

    参考资料

    [1]

    文章: https://www.researchgate.net/publication/353592446_TEXT_VECTORIZATION_USING_DATA_MINING_METHODS

    [2]

    论文: https://www.sciencedirect.com/science/article/abs/pii/S0020025519308588

    [3]

    yake包: https://github.com/LIAAD/yake

    [4]

    KeyBERT: https://github.com/MaartenGr/KeyBERT

    [5]

    pretrained_models: https://www.sbert.net/docs/pretrained_models.html

    [6]

    https://links.jianshu.com/go?to=https%3A%2F%2Fmedium.datadriveninvestor.com%2Frake-rapid-automatic-keyword-extraction-algorithm-f4ec17b2886c

    [7]

    https://blog.csdn.net/chinwuforwork/article/details/77993277

    
     
    
     
    
     
    
     
    
     
    往期精彩回顾
    
    
    
    
    适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载中国大学慕课《机器学习》(黄海广主讲)机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑
    AI基础下载机器学习交流qq群955171419,加入微信群请扫码:

    df3df7061012c20b38440eef3088fd60.png

    展开全文
  • 从文档中提取关键字

    2021-08-10 18:44:20
    想象一下你手上有数百万(也许数十亿)的文本文档。无论是社交媒体数据还是社区论坛帖子。生成数据时没有标记。给那些文件贴标签真是费劲。 手工标注不实用;...这篇文章记录了我是如何在Python中提取关键字,并

    想象一下你手上有数百万(也许数十亿)的文本文档。无论是社交媒体数据还是社区论坛帖子。生成数据时没有标记。给那些文件贴标签真是费劲。

    手工标注不实用;现有的标签列表很快就会过时。雇用一家供应商公司来做标记工作太贵了。

    你可能会说,为什么不使用机器学习呢?比如,普通网络深度学习。但是,神经网络首先需要一些训练数据。并且要适合你数据集的训练数据。

    那么,有没有一个解决方案可以让我们满足:

    • 不需要训练数据。
    • 手动干扰最小,可自动运行。
    • 自动捕获新单词和短语。

    这篇文章记录了我是如何在Python中提取关键字,并且它是如何工作的。

    请注意,本文中的代码是在Jupyter Notebook中运行和测试的。如果你运行一个代码块,但是遇到了缺少导入包的错误,那么这个包一定已经在前面某处导入过了。

    核心思想

    TF-IDF是一种广泛使用的算法,用于评估单词与文档集合中文档的相关性。

    基于TF-IDF,那些独特而重要的词在文档中应该具有较高的TF-IDF值。因此,理论上,我们应该能够利用文本权重来提取文档中最重要的单词。

    例如,一个关于sciket learn的文档应该包含很多高密度的关键字scikit learn,而另一个关于“pandas”的文档应该对pandas具有很高的TF-IDF值。

    目标数据

    我发现来自NLTK的Reuters文档语料库是一个很好的关键词提取目标:https://www.nltk.org/

    如果你不熟悉NLTK语料库,本文可能有助于在不到一个小时的时间内开始NLTK,https://towardsdatascience.com/book-writing-pattern-analysis-625f7c47c9ad。

    下载路透社语料库。运行Python代码:

    import nltk
    nltk.download("reuters")
    

    列出我们刚刚下载的语料库中的所有文档ID。

    from nltk.corpus import reuters
    reuters.fileids()
    

    检查一个文档的内容及其类别。

    fileid = reuters.fileids()[202]
    print(fileid,"\n"
          ,reuters.raw(fileid),"\n"
          ,reuters.categories(fileid),"\n")
    

    路透社语料库是由重叠的类别组成的。我们还可以按类别名称获取文档。对于完整的NLTK语料库操作,请查看这篇精彩的文章:访问文本语料库和词汇资源:https://www.nltk.org/book/ch02.html#fig-inaugural2

    生成停用词列表

    为了节省时间和计算资源,我们最好排除诸如“am”、“I”、“should”之类的停用词。NLTK提供了一个很好的英语停用词列表。

    from nltk.corpus import stopwords
    ignored_words = list(stopwords.words('english'))
    

    你也可以用你自己的停用词扩展这个列表,这些词不包括在NLTK停用词列表中。

    ignored_words.extend(
    '''get see seeing seems back join 
    excludes has have other that are likely like 
    due since next 100 take based high day set ago still 
    however long early much help sees would will say says said 
    applying apply remark explain explaining
    '''.split())
    

    建立关键词词汇表-单字

    在使用TF-IDF提取关键字之前,我将建立自己的词汇表,包括单个单词(例如“Python”)和两个单词(例如“white house”)。

    在这里,我将使用scikit-learn中的CountVectorizer来执行单个单词提取工作。

    from sklearn.feature_extraction.text import CountVectorizer
    import pandas as pd
    count_vec = CountVectorizer(
        ngram_range = (1,1)   #1
        ,stop_words = ignored_words
    )
    
    text_set = [reuters.raw(fileid).lower() for fileid in reuters.fileids()] #2
    tf_result = count_vec.fit_transform(text_set)
    
    tf_result_df = pd.DataFrame(tf_result.toarray()
                                   ,columns=count_vec.get_feature_names()) #3
    
    the_sum_s = tf_result_df.sum(axis=0) #4
    
    the_sum_df = pd.DataFrame({ #5
        'keyword':the_sum_s.index
        ,'tf_sum':the_sum_s.values
    })
    
    the_sum_df = the_sum_df[
        the_sum_df['tf_sum']>2  #6
    ].sort_values(by=['tf_sum'],ascending=False)
    

    代码#1,指定CountVectorizer只对单个单词计数。你可能会问,为什么不使用ngram_range = (1,2),然后同时得到1gram和bigram呢?这是因为这里的捕获bigram会得到“they are”、“I will”和“will be”这样的短语。这些是连词短语,通常不是文档的关键字或关键短语。

    另一个原因是为了节省内存资源,捕获bigram短语在这个阶段会由于太多的组合而占用大量内存。

    代码#2,使用Python生成式将路透社的所有文章放在一行代码中。

    代码#3,将计数向量结果转换为可读的数据帧。

    代码#4,产生一个列表,包含关键字及其在语料库中的总出现次数。

    代码#5,将序列转换为数据帧,以便于读取和数据操作。

    代码#6,选取只出现2次以上的单词。

    如果你查看由the_sum_df[:10]设置的前10个结果,你将看到那些最常用的词:
    在这里插入图片描述
    最常见但毫无意义的是,我们可以通过Python切片轻松地按比例排除:

    start_index = int(len(the_sum_df)*0.01) # 排除前1%的人
    my_word_df  = the_sum_df.iloc[start_index:]
    my_word_df  = my_word_df[my_word_df['keyword'].str.len()>2]
    

    也可以删除少于2个字符的单词,如“vs”、“lt”等。

    请注意,我使用的是.iloc而不是.loc。因为原始数据集是按TF(term frequency)值重新排序的。iloc将对索引的索引(或索引标签的序列)进行切片。但loc将在索引标签上切片。

    建立关键词词汇表-bigram

    在建立二元短语表时,不仅要考虑出现频率,还要考虑其与相邻词的关系。

    例如短语“they are”,多次出现在一起,但他们只能跟在有限的词后面,就像他们是兄弟一样,他们是好人,这些词具有很高的内部粘性,但外部连接灵活性很低。

    这通常可以用信息熵来度量。熵值越高,表示与其他词一起使用的可能性越大。
    在这里插入图片描述
    而那些对我们大脑具有高内部粘性(计数频率)和高外部熵的短语,我们称之为“普通短语”,这些是我们想要添加到提取词汇表中的。

    NLTK提供了一个类似的解决方案来解决bigram短语提取问题。

    from nltk.collocations import BigramAssocMeasures
    from nltk.collocations import BigramCollocationFinder
    from nltk.tokenize import word_tokenize
    text_set_words  = [word_tokenize(reuters.raw(fileid).lower()) 
                       for fileid in reuters.fileids()] #1
    bigram_measures = BigramAssocMeasures()
    finder = BigramCollocationFinder.from_documents(text_set_words) #2
    finder.apply_freq_filter(3) #3
    finder.apply_word_filter(lambda w: 
                             len(w) < 3 
                             or len(w) > 15 
                             or w.lower() in ignored_words) #4
    phrase_result = finder.nbest(bigram_measures.pmi, 20000) #5
    colloc_strings = [w1+' '+w2 for w1,w2 in phrase_result] #6
    

    代码#1,在这个Python理解表达式中,我使用word_tokenize将文档标记为单词列表。输出如下:

    [
        ['word1','word2',...,'wordn'], 
        ['word1','word2',...,'wordn'],
        ...
        ['word1','word2',...,'wordn']
    ]
    

    代码#2,从标记化文档列表启动bigram查找器对象。还有另一个函数from_words()可以处理标记词列表。

    代码#3,删除频率小于3的候选项。

    编码#4,删除单词长度小于3或大于15的候选词。

    代码#5,使用BigramAssocMeasures中的pmi函数来测量2个单词短语的可能性。此链接列出所有其他度量函数和源代码:https://tedboy.github.io/nlps/generated/generated/nltk.BigramAssocMeasures.html#methods

    代码#6,将结果转换为更可读的格式。

    通过将BigramAssocMeasures、BigramCollocationFinder替换为TrigramAssocMeasures和TrigramCollocationFinder,你将得到3个单词的短语提取器。在路透社关键词提取样本中,我将跳过3个单词的短语。我在这里发布了示例代码,以防你需要它。

    from nltk.collocations import TrigramAssocMeasures
    from nltk.collocations import TrigramCollocationFinder
    from nltk.tokenize import word_tokenize
    text_set_words  = [word_tokenize(reuters.raw(fileid).lower()) 
                       for fileid in reuters.fileids()]
    trigram_measures = TrigramAssocMeasures()
    finder = TrigramCollocationFinder.from_documents(text_set_words)
    finder.apply_freq_filter(3)
    finder.apply_word_filter(lambda w: 
                             len(w) < 3 
                             or len(w) > 15 
                             or w.lower() in ignored_words)
    tri_phrase_result = finder.nbest(bigram_measures.pmi, 1000)
    tri_colloc_strings = [w1+' '+w2+' '+w3 for w1,w2,w3 in tri_phrase_result] 
    tri_colloc_strings[:10]
    

    用TF-IDF测量关键词权重

    现在,让我们将单字和双字短语组合在一起,构建路透社定制的词汇表。

    my_vocabulary = []
    my_vocabulary.extend(my_word_df['keyword'].tolist()) 
    my_vocabulary.extend(colloc_strings)
    

    我们启动吧。请注意,请找到一台至少有16g RAM的机器来运行代码。TF-IDF计算需要一段时间,可能会占用大量内存。

    from sklearn.feature_extraction.text import TfidfVectorizer
    vec          = TfidfVectorizer(
                        analyzer     ='word'
                        ,ngram_range =(1, 2)
                        ,vocabulary  =my_vocabulary)
    text_set     = [reuters.raw(fileid) for fileid in reuters.fileids()]
    tf_idf       = vec.fit_transform(text_set)
    result_tfidf = pd.DataFrame(tf_idf.toarray()
                                , columns=vec.get_feature_names()) #1
    

    将结果集转换为代码#1中的Dateframe后,result_tfidf将保存所有关键字的TF-IDF值:

    图片

    看看结果

    让我们查看其中一篇文章,并将其与上面提取器提取的关键字进行比较,以验证其有效性。
    通过指定fileid索引输出一个原始文档。

    file_index= 202 # 更改号码以检查不同的文章
    fileid = reuters.fileids()[file_index]
    print(fileid,"\n"
            ,reuters.raw(fileid),"\n"
            ,reuters.categories(fileid),"\n")
    

    返回fileid、raw及其categories(嗯,很多年前,美国和日本打了一场关税战)

    test/15223 
     WHITE HOUSE SAYS JAPANESE TARRIFFS LIKELY
      The White House said high U.S.
      Tariffs on Japanese electronic goods would likely be imposed as
      scheduled on April 17, despite an all-out effort by Japan to
      avoid them.
          Presidential spokesman Marlin Fitzwater made the remark one
      day before U.S. And Japanese officials are to meet under the
      emergency provisions of a July 1986 semiconductor pact to
      discuss trade and the punitive tariffs.
          Fitzwater said: "I would say Japan is applying the
      full-court press...They certainly are putting both feet forward
      in terms of explaining their position." But he added that "all
      indications are they (the tariffs) will take effect."
    
     ['trade']
    

    打印出我们dataframe对象中的前10个关键字。

    test_tfidf_row = result_tfidf.loc[file_index]
    keywords_df = pd.DataFrame({
        'keyword':test_tfidf_row.index,
        'tf-idf':test_tfidf_row.values
    })
    keywords_df = keywords_df[
        keywords_df['tf-idf'] >0
    ].sort_values(by=['tf-idf'],ascending=False)
    keywords_df[:10]
    

    十大关键词:
    在这里插入图片描述
    看起来这里的white,house和white house是一样的。我们需要删除那些已经出现在两个单词短语中的单词。

    bigram_words = [item.split() 
                        for item in keywords_df['keyword'].tolist() 
                        if len(item.split())==2]
    bigram_words_set = set(subitem 
                            for item in bigram_words 
                            for subitem in item) 
    keywords_df_new = keywords_df[~keywords_df['keyword'].isin(bigram_words_set)]
    

    上面的代码首先构建一个单词集,其中包含来自2个单词短语的单词。然后,通过~xxxx.isin(xxxx)过滤出已经在两个单词短语中使用的单个单词。

    其他考虑因素

    你拥有的文本语料库越大,TF-IDF提取关键词的效果就越好。路透社语料库包含10788篇文章,结果表明它是有效的。我相信这个解决方案对于更大的文本数据库会更好。

    上面的代码在我的macbookairm1中运行不到2分钟,这意味着每日刷新结果集是可行的。

    如果你有数百GB甚至TB大小的数据。你可能需要考虑重写C/C++或GO中的逻辑,并且还可以利用GPU的功率来提高性能。

    本文所描述的解决方案远不是完美的,例如,我没有过滤掉动词和形容词。解决方案的主干可以扩展到其他语言。

    提取的关键字

    让我们再次打印出最终结果。

    keywords_df_new[:10]
    

    关税得到最高的TF-IDF值,其余关键字看起来很好地代表了路透社的这篇文章。达到目标!
    在这里插入图片描述

    参考文献

    展开全文
  • } } } 例 在Java wikipedia article introduction part上使用guessFromString方法,这里是找到的前10个最常用的关键字(即句柄): java x12 [java] compil x5 [compiled, compiler, compilers] sun x5 [sun] develop...

    这是一个可能的解决方案,使用

    Apache Lucene.我没有使用最后一个版本,但

    3.6.2 one,因为这是我知道最好的。除了/ lucene-core-xxxjar,不要忘了将/ contrib / analyzer / common / lucene-analyzerers-xxxjar从下载的档案添加到您的项目中:它包含语言特定的分析器(特别是英文在你的情况下)。

    请注意,这只会根据各自的句柄找到输入文字的频率。将这些频率与英文统计数据进行比较,之后(this answer可能有帮助)。

    数据模型

    一个关键词一个干。不同的词可能具有相同的词干,因此设定了术语。关键词频率在每次找到新词时都会增加(即使已经找到 – 一个集合自动删除重复项)。

    public class Keyword implements Comparable {

    private final String stem;

    private final Set terms = new HashSet();

    private int frequency = 0;

    public Keyword(String stem) {

    this.stem = stem;

    }

    public void add(String term) {

    terms.add(term);

    frequency++;

    }

    @Override

    public int compareTo(Keyword o) {

    // descending order

    return Integer.valueOf(o.frequency).compareTo(frequency);

    }

    @Override

    public boolean equals(Object obj) {

    if (this == obj) {

    return true;

    } else if (!(obj instanceof Keyword)) {

    return false;

    } else {

    return stem.equals(((Keyword) obj).stem);

    }

    }

    @Override

    public int hashCode() {

    return Arrays.hashCode(new Object[] { stem });

    }

    public String getStem() {

    return stem;

    }

    public Set getTerms() {

    return terms;

    }

    public int getFrequency() {

    return frequency;

    }

    }

    公用事业

    要言辞:

    public static String stem(String term) throws IOException {

    TokenStream tokenStream = null;

    try {

    // tokenize

    tokenStream = new ClassicTokenizer(Version.LUCENE_36, new StringReader(term));

    // stem

    tokenStream = new PorterStemFilter(tokenStream);

    // add each token in a set, so that duplicates are removed

    Set stems = new HashSet();

    CharTermAttribute token = tokenStream.getAttribute(CharTermAttribute.class);

    tokenStream.reset();

    while (tokenStream.incrementToken()) {

    stems.add(token.toString());

    }

    // if no stem or 2+ stems have been found, return null

    if (stems.size() != 1) {

    return null;

    }

    String stem = stems.iterator().next();

    // if the stem has non-alphanumerical chars, return null

    if (!stem.matches("[a-zA-Z0-9-]+")) {

    return null;

    }

    return stem;

    } finally {

    if (tokenStream != null) {

    tokenStream.close();

    }

    }

    }

    搜索一个集合(将被潜在的关键字列表使用):

    public static T find(Collection collection, T example) {

    for (T element : collection) {

    if (element.equals(example)) {

    return element;

    }

    }

    collection.add(example);

    return example;

    }

    核心

    这是主要的输入法:

    public static List guessFromString(String input) throws IOException {

    TokenStream tokenStream = null;

    try {

    // hack to keep dashed words (e.g. "non-specific" rather than "non" and "specific")

    input = input.replaceAll("-+", "-0");

    // replace any punctuation char but apostrophes and dashes by a space

    input = input.replaceAll("[\\p{Punct}&&[^'-]]+", " ");

    // replace most common english contractions

    input = input.replaceAll("(?:'(?:[tdsm]|[vr]e|ll))+\\b", "");

    // tokenize input

    tokenStream = new ClassicTokenizer(Version.LUCENE_36, new StringReader(input));

    // to lowercase

    tokenStream = new LowerCaseFilter(Version.LUCENE_36, tokenStream);

    // remove dots from acronyms (and "'s" but already done manually above)

    tokenStream = new ClassicFilter(tokenStream);

    // convert any char to ASCII

    tokenStream = new ASCIIFoldingFilter(tokenStream);

    // remove english stop words

    tokenStream = new StopFilter(Version.LUCENE_36, tokenStream, EnglishAnalyzer.getDefaultStopSet());

    List keywords = new LinkedList();

    CharTermAttribute token = tokenStream.getAttribute(CharTermAttribute.class);

    tokenStream.reset();

    while (tokenStream.incrementToken()) {

    String term = token.toString();

    // stem each term

    String stem = stem(term);

    if (stem != null) {

    // create the keyword or get the existing one if any

    Keyword keyword = find(keywords, new Keyword(stem.replaceAll("-0", "-")));

    // add its corresponding initial token

    keyword.add(term.replaceAll("-0", "-"));

    }

    }

    // reverse sort by frequency

    Collections.sort(keywords);

    return keywords;

    } finally {

    if (tokenStream != null) {

    tokenStream.close();

    }

    }

    }

    在Java wikipedia article introduction part上使用guessFromString方法,这里是找到的前10个最常用的关键字(即句柄):

    java x12 [java]

    compil x5 [compiled, compiler, compilers]

    sun x5 [sun]

    develop x4 [developed, developers]

    languag x3 [languages, language]

    implement x3 [implementation, implementations]

    applic x3 [application, applications]

    run x3 [run]

    origin x3 [originally, original]

    gnu x3 [gnu]

    通过获取术语集(在上述示例中的括号[…]之间显示),迭代输出列表以了解每个句柄的原始找到的单词。

    下一步是什么

    将干音频率/频率和比率与英语统计数字进行比较,如果您管理它,可以让我进入循环:我也很有兴趣:)

    展开全文
  • 文本提取最常用的关键字和短语。 它不包括常见的停用词。 它可以配置为提取任意长度的短语(ngram),而不仅仅是关键字。 // Get the top two most commonly used phrases of two more words in the Stream ...
  • 这将是查找outter结构的主正则表达式:\bvertices\s*\((\s*(?...在然后使用一个额外的正则表达式来提取顶点结构中的所有内容:\([^)]+\)请参见演示here。在代码:import retest_str = """/* *- C++ -* *\| ==...
  • 今天小编就为大家分享一篇python数据分析:关键字提取方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • textrank作为文档关键字提取的常用算法,python将textrank封装了对象,可直接使用
  • 关键字提取

    2018-02-22 11:46:23
    java文章关键字提取 java文章关键字提取 java文章关键字提取 重要的事件说三遍
  • java提取文章关键字

    2017-11-24 13:31:49
    java提取文章关键字,可随意更改提取关键字的个数、规则,内置jar包,下载即可运行
  • 作为一种经典的文本关键字提取和摘要自动生成算法,TextRank将文本看做若干单词组成的集合,并通过对单词节点图的节点权值进行迭代计算,挖掘单词之间的潜在语义关系。在TextRank节点图模型的基础上,将马尔可夫状态...
  • 一个玩具包,用于从纯文本文档中提取关键字。 预处理是使用spaCy进行的(标记化,停用词的去除和去词性化),并且通过使用scikit-learn中的实现通过对句子应用tf-idf来选择关键字。 用法 诗歌用于包装和依赖性管理...
  • 自然语言处理分析的最基本和初始步骤是关键词提取,在NLP中,我们有许多...并将简单概述下每个方法的使用场景,然后使用附加示例将其应用于提取关键字。本文关键字:关键字提取、关键短语提取、Python、NLP、TextR...
  • 如图 2.44 GB (2,622,087,057 字节)的文件 开源大赛居然结束了......
  • 这是一个函数定位接收一个字符串作为参数(连同其他配置可选参数),并且定位该字符串中的所有关键字(出现最多的词),返回一个数组或一个字符串由逗号分隔的关键字。/*** Finds all of the keywords (words that ...
  • 初学python,想利用编程读取txt文本并生成excel,记录一下。 txt数据源截取如下(将近2W行数据): 00:00:06 RADV Voice Signal:-63dBm 00:00:09 RADD DATA Signal:-65dBm 00:00:12 RADV Voice Signal:-61dBm 00:00:...
  • AWK是一种处理文本文件的语言,是一个强大的文本分析工具。这篇文章主要介绍了Linux 中awk 提取包含某个关键字的段落实例代码,需要的朋友可以参考下
  • 实现了用C#调用一言API,并通过字符串筛选提取关键字,筛选出句子与作者,并实现了可以显示自定义类别句子的功能!
  • tf-idf作为文档关键字提取的常用算法,python将tf-idf封装了对象,可直接使用
  • 如何使用TF-IDF和Python的Scikit-Learn从文本提取关键字 (How to extract keywords from text with TF-IDF and Python’s Scikit-Learn) Back in 2006, when I had to use TF-IDF for keywor...
  • 如下图所示,有一个近2000行的数据表,需要把其中含有关键字‘颈廓清术,中央组(VI组)’的数据所在行都都给抽取出来,且提取后的表格不能改变原先的顺序。 问题分析: 一开始想用excel的筛选功能,但是发现只提供...
  • 提取Java关键字

    千次阅读 2021-02-27 22:41:25
    // 导入文本 impButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { writeText(); } }); // 计算关键字数 calcButton.addActionListener(new ActionListener...
  • matlab提取关键字

    2021-04-19 00:46:03
    MEX 文件的目录列表 type 列出 M 文件 lookfor 通过 help 条目搜索关键字 which 定位函数和文件 Demo 运行演示程序 Path 控制 MATLAB 的搜索路径 管理变量和工作......MEX 文件的目录列表 列出 M 文件 通过 help ...
  • 一个非常天真的方法是从文本中删除常见的stopwords,留下更多有意义的单词,如“标准”,“JSON”等.但是你仍会得到很多噪音,所以你可以考虑像OpenCalais那样的服务对您的文本进行相当复杂的分析.更新:好的,我之前回答...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 56,925
精华内容 22,770
关键字:

文本提取关键字