头歌平台-人工智能技术应用-实践学习与答案2(补充实训部分)

人工智能技术应用

  • 四、LDA算法
    • 第1关 LDA算法
  • 六、TF/IDF 算法
    • 第1关:去除停用词
    • TF/IDF算法
  • 七、TextRank算法
    • 第1关 Jieba 在关键词提取中的应用
    • 第二关 TextRank算法
  • 八、论坛数据分析*
    • 第一关 情感分析基础
    • 第2关 帖子好评度分析
  • 博主说

四、LDA算法

第1关 LDA算法

import jieba
import jieba.analyse as analyse
import gensim
from gensim import corpora, models, similarities


# 停用词表加载方法
def get_stopword_list():
    # 停用词表存储路径,每一行为一个词,按行读取进行加载
    # 进行编码转换确保匹配准确率
    stop_word_path = './stopword.txt'
    stopword_list = [sw.replace('\n', '') for sw in open(stop_word_path, encoding='utf-8').readlines()]
    return stopword_list


# 停用词
stop_word = get_stopword_list()
text = input()

# 分词
sentences = []
segs = jieba.lcut(text)
segs = list(filter(lambda x: x not in stop_word, segs))
sentences.append(segs)

# 构建词袋模型
dictionary = corpora.Dictionary(sentences)
corpus = [dictionary.doc2bow(sentence) for sentence in sentences]
result = ""
# 任务:使用gensim模块中的函数构造LDA模型,得出最佳主题词的分析结果保存到result变量中。
# ********** Begin *********#


lda = models.LdaModel(corpus,id2word=dictionary, num_topics=1)

for result in lda.print_topics(num_words=1):
    print(result[1].split('*')[1],end="")


# ********** End **********#
#print(result.split('*')[1],end="")


注:这一题的输出没有很符合我的预期,所以我干脆直接改了他的print输出,用自己更喜欢的方式输出

六、TF/IDF 算法

第1关:去除停用词

# 停用词表加载方法
def get_stopword_list():
    # 停用词表存储路径,每一行为一个词,按行读取进行加载
    # 进行编码转换确保匹配准确率
    stop_word_path = './stopword.txt'
    stopword_list = [sw.replace('\n', '') for sw in open(stop_word_path,encoding='utf-8').readlines()]
    return stopword_list

if __name__ == '__main__':
    text=input()
    result=""
    # 任务:使用停用词表去掉text文本中的停用词,并将结果保存至result变量
    # ********** Begin *********#

    stopwords = get_stopword_list()

    for word in text:
        if word not in stopwords:
            result += word + ""
        
    
    # ********** End **********#

    print(result,end="")

TF/IDF算法


#本程序的作用是通过TF/IDF算法完成对文本的关键词提取,输出前十个关键词。
import math
import jieba
import jieba.posseg as psg
from gensim import corpora, models
from jieba import analyse
import functools
from collections import defaultdict # 自己额外引入的库

class TfIdf(object):
    # 四个参数分别是:训练好的idf字典,默认idf值,处理后的待提取文本,关键词数量
    def __init__(self, idf_dic, default_idf, word_list, keyword_num):
        self.word_list = word_list
        self.idf_dic, self.default_idf = idf_dic, default_idf
        self.tf_dic = self.get_tf_dic()
        self.keyword_num = keyword_num
        
    def get_tf_dic(self):
        tf_dic = {}
    # 任务:完成word_list的tf值的统计函数,将结果存储到tf_dic变量中
    # ********** Begin *********#
        doc_frequency=defaultdict(int)
        for i in self.word_list:
            doc_frequency[i]+=1

        for i in doc_frequency:
            tf_dic[i]=doc_frequency[i]/sum(doc_frequency.values())
        
            
    # ********** End **********#
        return tf_dic

    # 按公式计算tf-idf
    def get_tfidf(self):
        tfidf_dic = {}
        for word in self.word_list:
            idf = self.idf_dic.get(word, self.default_idf)
            tf = self.tf_dic.get(word, 0)

            tfidf = tf * idf
            tfidf_dic[word] = tfidf

        tfidf_dic.items()
        # 根据tf-idf排序,去排名前keyword_num的词作为关键词
        for k, v in sorted(tfidf_dic.items(), key=functools.cmp_to_key(cmp), reverse=True)[:self.keyword_num]:
            print(k + "/ ", end='')
        print()
        
        
#排序函数,用于topK关键词的按值排序
def cmp(e1, e2):
    import numpy as np
    res = np.sign(e1[1] - e2[1])
    if res != 0:
        return res
    else:
        a = e1[0] + e2[0]
        b = e2[0] + e1[0]
        if a > b:
            return 1
        elif a == b:
            return 0
        else:
            return -1

注: 这里对字典的统计我引入了defaultdict函数(这个函数是用来新建一个键值对的),算是额外引入了一个算法库使用

七、TextRank算法

第1关 Jieba 在关键词提取中的应用


import jieba.analyse
import warnings
warnings.filterwarnings("ignore")
sentence = input()

# 任务:基于jieba中的TF-IDF算法完成对sentence的关键词提取,提取前三个关键词并以一行输出
# ********** Begin *********#

result = ''
text = ""
# 停用词表加载方法
stopwords = "1000 , 。防控 审查 不 项目 支付 省住 销售 返还 佣"
#stopwords = "防控 能动性 审查 不延误 项目 支付 省住 销售 1000 返还 佣"

for word in sentence:
   if word not in stopwords:
      text += word + ""

# 补充误删的关键词
text += "何靖"

words = jieba.analyse.extract_tags(text, topK=3, withWeight= False, allowPOS=())
#print(words)

for word in words:
   result += word + " "
print(result)


# ********** End **********#

测试用例:
一、
针对集体宿舍人员如何科学防控的问题,中国疾控中心环境所所长施小明表示,要加强日常体温检测,对进入集体宿舍人员进行体温检测,发现体温异常人员要立即将其转移至临时隔离区域,并按相关规定进行处置。同时严控集体宿舍住宿人数超标问题,设置可开启窗户定时通风。
二、
以上信息提示,武汉疫情快速上升态势得到控制,湖北除武汉外,局部爆发的态势也得到控制,湖北以外省份疫情形势积极向好。下一步要从统筹推进疫情防控和经济社会发展出发,紧紧围绕社区防控和医疗救治两个重点,由全面防控向群专结合,精准防控转变。
三、
为推动项目尽快开工建设,省住建厅加大政策支持力度,允许施工图容缺受理审查,帮助业主提前开展施工图审查。各施工图审查机构充分发挥主观能动性,创造条件满足项目建设需求,确保施工图审查不接触、不间断、不延误。同时,加快支付施工图审查购买服务费,疫情期间,各级财政、住建部门购买并支付施工图审查服务费974万元,有效缓解审查机构资金成本压力。
五、
何靖所在的公司一直有一个“老带新”的推荐系统,想赚佣金的同事就参与。不过何靖表示,自己和同事平时工作量已经很饱和,且个人朋友圈子也不属于客户群,所以平时积极性不高。现在疫情来了,集团层面推出了“员工千元预定房源”的活动,员工每人交1000元预定一套房源,这套房源由个人出去销售,成交后,公司除了返还1000元预定金之外,还会支付和销售岗位同等比例的佣金,并额外补偿1000元;未成交,也会返还预定金。

注:这道题我是真没写出来,这个参数太难调了,使用了停用表将高频词删掉才通过的,应该有一套参数可以完美运行的;我这种方式只适合部分用例,通用性不强

第二关 TextRank算法

from jieba import analyse
import jieba.analyse

text = input() # 原始文本
# 任务:使用jieba模块中有关TextRank算法的模块完成对text中前三个关键字的提取并输出
# ********** Begin *********#

result = ''
words = jieba.analyse.textrank(text, topK=3, withWeight=False, allowPOS=("ns","n","vn","v"))
for word in words:
   result += word + " "
print(result)


# ********** End **********#

八、论坛数据分析*

第一关 情感分析基础


from snownlp import SnowNLP

def count_sno():
    #count变量为分析结果大于0.9的数量
    count = 0
    a = open('./step1/test.txt',encoding='utf-8')
    # *********** Begin **********#
    
    listOfLines  =  a.readlines()
    for lineWords in listOfLines:
        text = SnowNLP(lineWords)
        if(text.sentiments > 0.9):
            count += 1

    # *********** End **********#
    return count

第2关 帖子好评度分析

import re
from pyquery import PyQuery
from snownlp import SnowNLP

def evaluate(path):
    html = open(path,'r',encoding="utf-8")
    score, count = 0, 0
    # *********** Begin **********#
    code = html.read()
    pq = PyQuery(code)
    tag = pq('div.text')
    taga = pq('a')
    words = ""
    for word in tag.text():
        if word not in taga.text():
            words += word
    
    txtlist = words.split(':')
    txtlist.pop(0)

    for txt in txtlist:
        count += 1
        s = SnowNLP(txt)
        score += s.sentiments

   
    # *********** End **********#
    return  int(score*100/count)

注:这道题的比上道题的难点在于对html这个的解析工作,我这里采用的pyquery库进行解析,为了精准拆分还用了比较蠢的方法去实现,可能有更加有效的库去解决这个问题

博主说

本篇博客是对上次实验内容的补充,老师是分两个阶段发出来的实验内容,之前的实验已经发出博客了,之前实验还没做的可以看头歌平台-人工智能技术应用-实践学习与答案

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2023年5月18日
下一篇 2023年5月18日

相关推荐