修改测试bug

dev-QQq
qinzhenpen 2 years ago
parent 37fc4366c8
commit 65023521e3

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 86 KiB

@ -2,7 +2,7 @@
* @Author: qinzhenpen qzp1807@126.com * @Author: qinzhenpen qzp1807@126.com
* @Date: 2024-07-15 15:44:46 * @Date: 2024-07-15 15:44:46
* @LastEditors: qinzhenpen qzp1807@126.com * @LastEditors: qinzhenpen qzp1807@126.com
* @LastEditTime: 2024-08-16 17:40:50 * @LastEditTime: 2024-08-21 17:54:11
* @FilePath: \vue3\src\layout\components\AppMain.vue * @FilePath: \vue3\src\layout\components\AppMain.vue
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
--> -->
@ -32,7 +32,7 @@ const tagsViewStore = useTagsViewStore();
width: 100%; width: 100%;
position: relative; position: relative;
overflow: hidden; overflow: hidden;
background: url("@/assets/images/背景.png") no-repeat; background: url("@/assets/images/背景.webp") no-repeat;
background-size: 100% 100%; background-size: 100% 100%;
} }

@ -16,8 +16,8 @@ axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
const service = axios.create({ const service = axios.create({
// axios中请求配置有baseURL选项表示请求URL公共部分 // axios中请求配置有baseURL选项表示请求URL公共部分
// baseURL: import.meta.env.VITE_APP_BASE_API, // baseURL: import.meta.env.VITE_APP_BASE_API,
baseURL:'http://118.31.7.2:9868/',
baseURL:'http://192.168.2.16:9868/', // baseURL:'http://192.168.2.16:9868/',
// 超时 // 超时
timeout: 100000 timeout: 100000
}) })

@ -2,7 +2,7 @@
* @Author: qinzhenpen qzp1807@126.com * @Author: qinzhenpen qzp1807@126.com
* @Date: 2024-08-16 17:56:32 * @Date: 2024-08-16 17:56:32
* @LastEditors: qinzhenpen qzp1807@126.com * @LastEditors: qinzhenpen qzp1807@126.com
* @LastEditTime: 2024-08-21 11:17:00 * @LastEditTime: 2024-08-21 18:16:01
* @FilePath: \vue3\src\views\digitalMarketTech\artificialIntelligence\index.vue * @FilePath: \vue3\src\views\digitalMarketTech\artificialIntelligence\index.vue
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
--> -->

@ -342,7 +342,7 @@ onMounted(() => {
getList(); getList();
var chartDom = document.getElementById("main"); var chartDom = document.getElementById("main");
var chartDom2 = document.getElementById("main2"); var chartDom2 = document.getElementById("main2");
myChart = echarts.init(chartDom); myChart = echarts.init(chartDom);472
myChart2 = echarts.init(chartDom2); myChart2 = echarts.init(chartDom2);
// //
var option = { var option = {
@ -367,7 +367,6 @@ onMounted(() => {
}, },
], ],
}; };
// //
myChart.setOption(option); myChart.setOption(option);
myChart2.setOption(option); myChart2.setOption(option);
@ -472,7 +471,6 @@ const resTable2=ref()
}) })
} }
} }
};
const showChart = ref(false); const showChart = ref(false);
// //

@ -400,7 +400,7 @@ const modelCalculation = () => {
proxy.$modal.msgWarning("请先分析数据/未选择模型参数!"); proxy.$modal.msgWarning("请先分析数据/未选择模型参数!");
return; return;
} }
const processedData = processArrayData(analysisHanderKry.value, analysisData.value); const processedData = processArrayData(analysisHanderKry.value, aAnalyzeTheRawData.value);
loading.value = true; loading.value = true;
marketingAlgorithmApi marketingAlgorithmApi
.getMarketingAlgorithmPreprocessing(JSON.stringify({ map: processedData, statistic: g_modelParameter.value, userId: n_dataTableQuery.value.userId })) .getMarketingAlgorithmPreprocessing(JSON.stringify({ map: processedData, statistic: g_modelParameter.value, userId: n_dataTableQuery.value.userId }))

@ -82,7 +82,7 @@
</div> </div>
<div class="analysisResults" style="margin-top: 20px"> <div class="analysisResults" style="margin-top: 20px">
<span style="font-weight: bold; font-size: 18px; color: #3596eb; display: block">分析结果</span> <span style="font-weight: bold; font-size: 18px; color: #3596eb; display: block">分析结果</span>
<el-button @click="download"></el-button> <el-button v-if="preProcessText.text3 !== '词云生成'" @click="download"></el-button>
<div v-show="preProcessText.text3 == '词频分析'" v-loading="loading2" :element-loading-spinner="svg" element-loading-svg-view-box="-10, -10, 50, 50" element-loading-background="rgba(122, 122, 122, 0.8)"> <div v-show="preProcessText.text3 == '词频分析'" v-loading="loading2" :element-loading-spinner="svg" element-loading-svg-view-box="-10, -10, 50, 50" element-loading-background="rgba(122, 122, 122, 0.8)">
<h4>词频列表</h4> <h4>词频列表</h4>
<p>你可以对词频词语进行修改删除以及增加频次数越大显示越大最多200关键词</p> <p>你可以对词频词语进行修改删除以及增加频次数越大显示越大最多200关键词</p>
@ -107,7 +107,7 @@
<div class="div" v-if="preProcessText.text3 == '词云生成'"> <div class="div" v-if="preProcessText.text3 == '词云生成'">
<div id="mywordcloud_positive" style="width: 50%; height: 600px"></div> <div id="mywordcloud_positive" style="width: 50%; height: 600px"></div>
</div> </div>
<div ref="captureElement" v-if="preProcessText.text3 == '情感倾向分析' && n_emotiveTendency"> <div ref="captureElement" v-if="preProcessText.text3 == '情感倾向分析' && n_emotiveTendency == 0 ? true : g_emotionAnalysis">
<div class="emotion_analysis"> <div class="emotion_analysis">
<div class="emotion_analysis-ani-in-le"> <div class="emotion_analysis-ani-in-le">
<span>正向情感</span> <span>正向情感</span>
@ -185,18 +185,229 @@
<template v-slot:content> <template v-slot:content>
<!-- 情感分析 --> <!-- 情感分析 -->
<div> <div>
<p style="font-weight: 700;font-size:22px">总览</p><p>文本分析指对文本数据进行表示 (representation)处理(processing)和建模(modeling)来获得有用的见解(insight)<br />文本分析的一个挑战是高维度(high dimensionality)<br /><br />语料库: 指在自然语言处理中用于各种目的的大量文本(文档)集合<br /><br />另一个挑战是: 大多数情况下文本是非结构化数据(not structured)</p><img src="@/assets/images/f4001.png" alt=""><p style="font-weight: 700;font-size:22px">文本分析步骤</p><p>&nbsp;&nbsp;&nbsp;&nbsp;1.句法分析(Parsing): 是指处理非结构化文本使其具有一定的结构供将来分析的过程句法分析将文本进行解构然后以一种更为结构化的方式来呈现(unsturctured -> sturctured)<br />&nbsp;&nbsp;&nbsp;&nbsp;2.搜索和检索 (Search and retrieval): 在一个语料库中识别包含例如特殊单词短语主题或者实体(如人或组织)等搜索项(search items)的文档这些搜索项通常称为关键术语 (key term)<br />&nbsp;&nbsp;&nbsp;&nbsp;3.文本挖掘 (text mining): 指使用前两步产生的术语和索引来发现与感兴趣领域或问题相关的有意义的见解(discover meaningful insights)<br />聚类(clustering) 分类 (classification) 都可以应用于文本挖掘比如将文档聚化成簇 或者 分类文本以进行情感分析(sentiment analysis)<br />文本挖掘可以利用来自各个研究领域的方法和技术如统计分析(statistical analysis)信息检索(information retrieval)数据挖掘(data mining)和自然语言处理(natural language processing)</p> <p style="font-weight: 700; font-size: 22px">总览</p>
<p style="font-weight: 700;font-size:22px">挑战</p><li>语法(syntax): 涉及句子结构和语法规则</li><li>语义(semantics): 是对句子含义的研究</li><li>语用(pragmatic): 关注特定上下文中句子的含义</li><li>同义词(homonyms): 具有相同拼写但含义不同的单词</li><li>缩写词(acronyms): 是单词的缩写形式</li><p>对于计算机来说文本只是编码和数字的字符序列(sequence of characters)它不了解语法语义(semantic meanings)和其实用含义(pragmatic meaning)<br />同时在原始形式中单词或者文本之间没有自然相似性度量(nature similarity metric)(因此难以执行聚类或分类)<br />因此我们需要以适合用于聚类和分类的形式来表示和处理文本</p><p style="font-weight: 700;font-size:22px">第一步收集原始文本数据(Collecting Raw Text)</p><p>对于文本分析来说进行任何事情之前必须先收集数据</p> <p>
<li>可以在许多网站上对用户生成的内容(user-generated contents)开始积极的监控可以使用公开的API, 网页爬虫 web scraper/crawler</li><li>准备处理非结构化或者半结构化数据</li><p style="font-weight: 700;font-size:22px">第二步表示文本 (Representing Text)</p><p>使用文本规范化的技术(text normalization techniques)对原始文本进行转化</p><li>分词 (tokenization): 指从文本正文中分离(也叫做标记)单词 (seperating words)</li><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.按空格(spaces)来分词(可能会把标点符号也给分出来比如 day. )<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.基于标点符号和空格来分词 (可能会把 well, cant, state-of-the-art 等直接分开)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;分词比想象中更困难 (résumé resume)<br />没有一个分词器适用于每一种情形(no one-size-fits-all)</p><li>大小写转换 (case folding): 将所有的字母都变成小写(或者都变成大写)</li> 文本分析指对文本数据进行表示 (representation)处理(processing)和建模(modeling)来获得有用的见解(insight)
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.但是在一些情况下可能会出错: 如专有名词缩写公司名等(General Motors; WHO; US;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.减少错误的方法是对不进行大小写转换的单词建立一个查找表(lookup table)</p><li>停止词(stop word): 在给定语言中并非所有的单词都需要被考虑(比如the, a, of, and, to等这些不太可能有助于语义的理解)</li><li>词根法(Lemmatization)和词干法(Stemming): 词根法看单词的意义(: Goose, geese, goose, gander, ganders)词干法看单词的组成(walk, walking, Walk, walks, walked)最受欢迎的是"Porter stemmer", WordNet</li><li>词袋法(Bag-of-words representation): 将文档转化成高维向量(high-dimensional vector)向量指示了文档中各个单词的 存在/不存在/出现频率(presence/absence/frequency)</li><img src="@/assets/images/f4002.png" alt=""><p>词袋法足够简单(朴素且过分简化问题 naive and over-simplified) 并被广泛应用于文本分析问题中 (是入门的好方法)其将文档表示为一组词语(单词)而忽略了其他信息(如顺序 order上下文 context推论 inferences和语义 semantics)比如a dog bites a man "a man bites a dog"意思完全不同但是他们在词袋法里是同一种表示</p> <br />
<li>语料库的表示(Representation of a corpus): 语料库可以大到包括一种或者多种语言的所有文档也可以小到仅限于特定领域(focused on a specific domains)</li><p>大多数语料库都具有元数据比如语料库的大小以及文本提取的领域某些语料库包含了文本中出现的每个词的信息内容(Information content, IC)信息内容是用来表示语料库中词语重要性(importance of a term)的度量IC值较高的词语的重要性要比IC值较低的词语高<br />然而信息内容无法满足分析动态改变的非结构化数据的需求问题传统语料库和IC元数据都无法随着时间改变因此任何语料库中不存在的词汇和任何新发明的词汇都会自动得到0的IC值其次传统语料库限制了用于文本分析算法 (text analysis algorithm) 的全部知识(语料库代表了整个知识库)</p><p style="font-weight: 700;font-size:22px">第三步词频-逆文档频率(TFIDF - Term Frequency - Inverse Document Frequency)</p><p style="font-weight: 600;font-size:18px">词频 (Term Frequency)</p><p>我们需要一个适应文本上下文(context)和性质(nature)的度量标准 metric (不像IC一样)<br />TFIDF直接作用于所有获取的文档(fetched documents)一旦获取的文档发生更改TFIDF可以被轻松更新TFIDF是一种广泛用于文本分析的措施TFIDF对动态内容的处理也是相当强大且有效的因为文档的变化只需要更新频率计数<br /> 文本分析的一个挑战是高维度(high dimensionality)
给定一个单词 t 以及一个包含 n 个词的文档 d = {t1, t2, , tn} d t 最简单的词频形式可以定义为 t d 中出现的次数</p><img src="@/assets/images/f4003.png" alt=""><p>可以对词频函数取对数以获得更多数据细节</p><img src="@/assets/images/f4005.png" alt=""><p>对于长文档因为其包含的词语数量和种类多因此往往有更高的词频值这些因素导致了长文档的词频值的提升以至于人们对长文档产生了偏见为了解决这个问题可以对词频进行规范化</p><img src="@/assets/images/f4006.png" alt=""><p>Zipfs Law i 个最常见的单词出现在最常见词的 1/i </p><p style="font-weight: 600;font-size:18px">Term Frequency 问题</p><p>词语的重要性仅取决于其在特定文档中的存在如果该词语频繁出现在每个文档中怎么办这个词还重要吗我们需要拓宽我们的视野不仅要在单个文档中而是要在整个语料库中考虑一个词语的重要性</p><p style="font-weight: 600;font-size:18px">词语的文档频率 (Document Frequency of a term)</p><p>文档频率被定义为语料库中包含一个词语的文档的数目假设语料库D包含N个文档语料库D={d1, d2, , dn}中词语 t 的文档频率的定义为</p><img src="@/assets/images/f4007.png" alt=""><p style="font-weight: 600;font-size:18px">逆文档频率 (Inverse Document Frequency)</p><p>逆文档频率的定义N代表了语料库的总文档数DF(t) 代表单词 t 的文档频率逆文档频率就是他们的商取对数得到</p> <br />
<img src="@/assets/images/f4008.png" alt=""><p>如果词语不在语料库内会导致分母为零快速解决的方法是在分母上加个1</p><img src="@/assets/images/f4009.png" alt=""><p>拥有较高IDF的词往往在整个语料库中更重要罕见单词的IDF会很高高频单词的IDF会很低<br />警告因为语料库中所有文档数目(N)是保持恒定的因此IDF仅取决于DF那些DF值最低的词获得相同的最高IDF因此有必要引入更多权重词来对文档中出现次数相同的词进行区分</p><p style="font-weight: 600;font-size:18px">TFIDF</p><p>是一种既考虑词在单个文档中的普及率 prevalence (TF)也考虑他在整个语料库中的稀缺程度 scarcity (IDF)的评估方法词语 t 在文档 d 中的TFIDF 定义为 d t 的词频 乘以语料库中 t 的文档频率如下公式</p><img src="@/assets/images/f4010.png" alt=""><p>一个词的TFIDF值越高它在一个文档中出现的就越频繁但在语料库的所有文档中出现得就越少<br />TFIDF在简单和直接的计算中是很有效的因为它不需要文本含义的相关知识文档 d 被表示为 TFIDF(t, d) 的高维向量 (high-dimensional vector)<br /><br />TFIDF方法减少描述长度的数量相对较少同时其很难揭示文档内或文档之间(intra-document or inter-document)的统计结构<br />主题建模(Topic Modelling)能够解决这个问题主题(topic): 经常在一起出现的具有相关含义的单词簇(a cluster of words)每个词在主题中都有权重</p> <br />
<p style="font-weight: 700;font-size:22px">第四步主题建模(Topic Modelling)</p><p>主题建模提供了文档的简短描述同时它也提供了自动组织搜索理解并汇总大量信息的工具主题建模是统计模型它研究一组文档中的单词确定文档主题并发现主题是如何相关(associated)或者如何随时间变化的(change over time)</p><p style="font-weight: 600;font-size:18px">流程</p><p>&nbsp;&nbsp;&nbsp;&nbsp;1.揭开(uncover)语料库中隐藏的主题模式(hidden topical patterns)<br />&nbsp;&nbsp;&nbsp;&nbsp;2.根据这些主题来注释文档(annotate document)<br />&nbsp;&nbsp;&nbsp;&nbsp;3.使用注释来组织搜索汇总文档(organize, search, summarise)</p><p style="font-weight: 600;font-size:18px">主题(topic)</p><p>一个主题被正式定义为固定单词词汇分布(a distribution over a fixed vocabulary of words)不同的主题在相同的词汇上会有不同的分布词汇中的某个词可以在多个主题中有不同的权重<br />一个文档通常由多个主题以不同的比例贯穿文本</p><p style="font-weight: 600;font-size:18px">LDA</p><p>最简单的主题模型是Latent Dirichlet Allocation(LDA)这是一个语料库的生成概率模型(generative probabilistic model of a corpus)在生成概率模型中从概率密度函数 (probability density function) 得出模型观测值 (model observation)在LDA中文档被视为生成过程 (generative process) 的结果(带有隐藏变量 hidden variables)<br />LDA假设了<br /></p><li>有一个固定的词汇表 (fixed vocabulary of words)</li> 语料库: 指在自然语言处理中用于各种目的的大量文本(文档)集合
<li>潜在主题 (latent topics) 的数目是预定义的</li><li>每个潜在主题的特征都是词汇表中单词的分布(Dirichlet distribution)</li><li>每个文档表示潜在主题的一个随机混合(random mixture)</li><p style="font-weight: 600;font-size:18px">LDA流程</p><p>&nbsp;&nbsp;&nbsp;&nbsp;1.选择文档的长度N<br />&nbsp;&nbsp;&nbsp;&nbsp;2.每个文档有一个在主题上的分布<br />&nbsp;&nbsp;&nbsp;&nbsp;3.为文档中的每个词分配一个主题并选择相应的主题中的单词<br /><br />在现实中只有文档是可用(available)LDA的目标是为每一个文档推断潜在的主题(underlying topic)主题比例 (topic proportion) 以及主题分配 (topic assignment)</p><p style="font-weight: 600;font-size:18px">算法</p><p>&nbsp;&nbsp;&nbsp;&nbsp;1.选择一个值 k<br />&nbsp;&nbsp;&nbsp;&nbsp;2.对于每个文档将文档中的每个单词随机分配给k个主题之一<br />&nbsp;&nbsp;&nbsp;&nbsp;对于每个文档 d遍历每个单词 w然后计算 d 中分配给主题 t 的单词所占的比例通常会应用平滑(smoothing)处理</p><img src="@/assets/images/f4011.png" alt=""><p>&nbsp;&nbsp;&nbsp;&nbsp;4.计算从单词w来的所有文档中对主题 t 的分配比例 P(w | t)<br />&nbsp;&nbsp;&nbsp;&nbsp;5.计算属于主题 t 的单词 w 的概率</p><img src="@/assets/images/f4012.png" alt=""> <p style="font-weight: 600;font-size:18px">注意事项</p> <p>LDA将文档视为主题的混合体<br />LDA将主题视为单词的混合体<br />如果单词 w 很有可能出现在主题 t 则所有带有 w 的文档将与主题 t 的关联更为紧密<br /> <br />
如果单词 w 不太可能出现在主题 t 则包含 w 的文档出现在 t 中的可能性将会很小因为文档 d 中剩余的单词将出现在其他主题中因此 d 有更高的可能性属于那些主题因此就算我们将 w 添加到 t 也不会将很多该类文档带到 t </p><p style="font-weight: 600;font-size:18px">应用</p><p>主题模型可以被用于文档建模(document modelling)文档分类(document classification)与协同过滤(collaborative filtering)<br />主题模型不仅可以应用于文本数据它还可以用于注释图像</p><p style="font-weight: 700;font-size:22px">情感分析 (Sentiment Analysis)</p><p>情感分析使用统计和自然语言处理来从文本中挖掘观点来识别并抽取主观信息<br />应用 检测产品或者电影的评论的极性(polarity of reviews)<br /><br />分析层面包括了文档层面(document)语句层面(sentence)短语层面(phrase)和短文层面(short-text)<br /><br />分类方法(朴素贝叶斯最大熵或者支持向量机SVM) 经常被用来提取语料库统计以用于情感分析</p><img src="@/assets/images/f4013.png" alt=""><p>分类器仅基于对其进行训练的数据集来确定情感</p><li>词义随着领域不同而改变</li><li>因此模型无法直接应用于其他领域</li><p>绝对的情感水平无法提供信息应该建立一条基线然后将其与观察值比较比如一个产品拥有40%正面推文60%负面推文貌似是不成功的但是如果其他类似的成功产品也有类似的正负面百分比那么不应该认为该产品是不成功的<br /><br />如何对大量评论添加标签(积极消极中立):<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;1.使用表情符号 (小心阴阳怪气)<br /> <br />
&nbsp;&nbsp;&nbsp;&nbsp;2.使用 Amazon Mechanical Turk 互联网众包市场将上标签工作外包出去</p><p style="font-weight: 700;font-size:22px">获得结果(gaining insights)</p><p style="font-weight: 600;font-size:18px">词云(word cloud)</p><p>五星好评的词云</p><img src="@/assets/images/f4015.png" alt=""><p>一星差评的词云</p><img src="@/assets/images/f4016.png" alt=""><p>TFIDF能够用来凸显评论中有信息量的单词</p> <img src="@/assets/images/f4017.png" alt=""><p>LDA可以把评论归类为主题圆盘的大小代表了词的权重</p><img src="@/assets/images/f4018.png" alt=""><p>另一种可视化方式</p><img src="@/assets/images/f4019.png" alt=""> 另一个挑战是: 大多数情况下文本是非结构化数据(not structured)
</div> </p>
<img src="@/assets/images/f4001.png" alt="" />
<p style="font-weight: 700; font-size: 22px">文本分析步骤</p>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;1.句法分析(Parsing): 是指处理非结构化文本使其具有一定的结构供将来分析的过程句法分析将文本进行解构然后以一种更为结构化的方式来呈现(unsturctured -> sturctured)
<br />
&nbsp;&nbsp;&nbsp;&nbsp;2.搜索和检索 (Search and retrieval): 在一个语料库中识别包含例如特殊单词短语主题或者实体(如人或组织)等搜索项(search items)的文档这些搜索项通常称为关键术语 (key term)
<br />
&nbsp;&nbsp;&nbsp;&nbsp;3.文本挖掘 (text mining): 指使用前两步产生的术语和索引来发现与感兴趣领域或问题相关的有意义的见解(discover meaningful insights)
<br />
聚类(clustering) 分类 (classification) 都可以应用于文本挖掘比如将文档聚化成簇 或者 分类文本以进行情感分析(sentiment analysis)
<br />
文本挖掘可以利用来自各个研究领域的方法和技术如统计分析(statistical analysis)信息检索(information retrieval)数据挖掘(data mining)和自然语言处理(natural language processing)
</p>
<p style="font-weight: 700; font-size: 22px">挑战</p>
<li>语法(syntax): 涉及句子结构和语法规则</li>
<li>语义(semantics): 是对句子含义的研究</li>
<li>语用(pragmatic): 关注特定上下文中句子的含义</li>
<li>同义词(homonyms): 具有相同拼写但含义不同的单词</li>
<li>缩写词(acronyms): 是单词的缩写形式</li>
<p>
对于计算机来说文本只是编码和数字的字符序列(sequence of characters)它不了解语法语义(semantic meanings)和其实用含义(pragmatic meaning)
<br />
同时在原始形式中单词或者文本之间没有自然相似性度量(nature similarity metric)(因此难以执行聚类或分类)
<br />
因此我们需要以适合用于聚类和分类的形式来表示和处理文本
</p>
<p style="font-weight: 700; font-size: 22px">第一步收集原始文本数据(Collecting Raw Text)</p>
<p>对于文本分析来说进行任何事情之前必须先收集数据</p>
<li>可以在许多网站上对用户生成的内容(user-generated contents)开始积极的监控可以使用公开的API, 网页爬虫 web scraper/crawler</li>
<li>准备处理非结构化或者半结构化数据</li>
<p style="font-weight: 700; font-size: 22px">第二步表示文本 (Representing Text)</p>
<p>使用文本规范化的技术(text normalization techniques)对原始文本进行转化</p>
<li>分词 (tokenization): 指从文本正文中分离(也叫做标记)单词 (seperating words)</li>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.按空格(spaces)来分词(可能会把标点符号也给分出来比如 day. )
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.基于标点符号和空格来分词 (可能会把 well, cant, state-of-the-art 等直接分开)
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;分词比想象中更困难 (résumé resume)
<br />
没有一个分词器适用于每一种情形(no one-size-fits-all)
</p>
<li>大小写转换 (case folding): 将所有的字母都变成小写(或者都变成大写)</li>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.但是在一些情况下可能会出错: 如专有名词缩写公司名等(General Motors; WHO; US;)
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.减少错误的方法是对不进行大小写转换的单词建立一个查找表(lookup table)
</p>
<li>停止词(stop word): 在给定语言中并非所有的单词都需要被考虑(比如the, a, of, and, to等这些不太可能有助于语义的理解)</li>
<li>词根法(Lemmatization)和词干法(Stemming): 词根法看单词的意义(: Goose, geese, goose, gander, ganders)词干法看单词的组成(walk, walking, Walk, walks, walked)最受欢迎的是"Porter stemmer", WordNet</li>
<li>词袋法(Bag-of-words representation): 将文档转化成高维向量(high-dimensional vector)向量指示了文档中各个单词的 存在/不存在/出现频率(presence/absence/frequency)</li>
<img src="@/assets/images/f4002.png" alt="" />
<p>词袋法足够简单(朴素且过分简化问题 naive and over-simplified) 并被广泛应用于文本分析问题中 (是入门的好方法)其将文档表示为一组词语(单词)而忽略了其他信息(如顺序 order上下文 context推论 inferences和语义 semantics)比如a dog bites a man "a man bites a dog"意思完全不同但是他们在词袋法里是同一种表示</p>
<li>语料库的表示(Representation of a corpus): 语料库可以大到包括一种或者多种语言的所有文档也可以小到仅限于特定领域(focused on a specific domains)</li>
<p>
大多数语料库都具有元数据比如语料库的大小以及文本提取的领域某些语料库包含了文本中出现的每个词的信息内容(Information content, IC)信息内容是用来表示语料库中词语重要性(importance of a term)的度量IC值较高的词语的重要性要比IC值较低的词语高
<br />
然而信息内容无法满足分析动态改变的非结构化数据的需求问题传统语料库和IC元数据都无法随着时间改变因此任何语料库中不存在的词汇和任何新发明的词汇都会自动得到0的IC值其次传统语料库限制了用于文本分析算法 (text analysis algorithm) 的全部知识(语料库代表了整个知识库)
</p>
<p style="font-weight: 700; font-size: 22px">第三步词频-逆文档频率(TFIDF - Term Frequency - Inverse Document Frequency)</p>
<p style="font-weight: 600; font-size: 18px">词频 (Term Frequency)</p>
<p>
我们需要一个适应文本上下文(context)和性质(nature)的度量标准 metric (不像IC一样)
<br />
TFIDF直接作用于所有获取的文档(fetched documents)一旦获取的文档发生更改TFIDF可以被轻松更新TFIDF是一种广泛用于文本分析的措施TFIDF对动态内容的处理也是相当强大且有效的因为文档的变化只需要更新频率计数
<br />
给定一个单词 t 以及一个包含 n 个词的文档 d = {t1, t2, , tn} d t 最简单的词频形式可以定义为 t d 中出现的次数
</p>
<img src="@/assets/images/f4003.png" alt="" />
<p>可以对词频函数取对数以获得更多数据细节</p>
<img src="@/assets/images/f4005.png" alt="" />
<p>对于长文档因为其包含的词语数量和种类多因此往往有更高的词频值这些因素导致了长文档的词频值的提升以至于人们对长文档产生了偏见为了解决这个问题可以对词频进行规范化</p>
<img src="@/assets/images/f4006.png" alt="" />
<p>Zipfs Law i 个最常见的单词出现在最常见词的 1/i </p>
<p style="font-weight: 600; font-size: 18px">Term Frequency 问题</p>
<p>词语的重要性仅取决于其在特定文档中的存在如果该词语频繁出现在每个文档中怎么办这个词还重要吗我们需要拓宽我们的视野不仅要在单个文档中而是要在整个语料库中考虑一个词语的重要性</p>
<p style="font-weight: 600; font-size: 18px">词语的文档频率 (Document Frequency of a term)</p>
<p>文档频率被定义为语料库中包含一个词语的文档的数目假设语料库D包含N个文档语料库D={d1, d2, , dn}中词语 t 的文档频率的定义为</p>
<img src="@/assets/images/f4007.png" alt="" />
<p style="font-weight: 600; font-size: 18px">逆文档频率 (Inverse Document Frequency)</p>
<p>逆文档频率的定义N代表了语料库的总文档数DF(t) 代表单词 t 的文档频率逆文档频率就是他们的商取对数得到</p>
<img src="@/assets/images/f4008.png" alt="" />
<p>如果词语不在语料库内会导致分母为零快速解决的方法是在分母上加个1</p>
<img src="@/assets/images/f4009.png" alt="" />
<p>
拥有较高IDF的词往往在整个语料库中更重要罕见单词的IDF会很高高频单词的IDF会很低
<br />
警告因为语料库中所有文档数目(N)是保持恒定的因此IDF仅取决于DF那些DF值最低的词获得相同的最高IDF因此有必要引入更多权重词来对文档中出现次数相同的词进行区分
</p>
<p style="font-weight: 600; font-size: 18px">TFIDF</p>
<p>是一种既考虑词在单个文档中的普及率 prevalence (TF)也考虑他在整个语料库中的稀缺程度 scarcity (IDF)的评估方法词语 t 在文档 d 中的TFIDF 定义为 d t 的词频 乘以语料库中 t 的文档频率如下公式</p>
<img src="@/assets/images/f4010.png" alt="" />
<p>
一个词的TFIDF值越高它在一个文档中出现的就越频繁但在语料库的所有文档中出现得就越少
<br />
TFIDF在简单和直接的计算中是很有效的因为它不需要文本含义的相关知识文档 d 被表示为 TFIDF(t, d) 的高维向量 (high-dimensional vector)
<br />
<br />
TFIDF方法减少描述长度的数量相对较少同时其很难揭示文档内或文档之间(intra-document or inter-document)的统计结构
<br />
主题建模(Topic Modelling)能够解决这个问题主题(topic): 经常在一起出现的具有相关含义的单词簇(a cluster of words)每个词在主题中都有权重
</p>
<p style="font-weight: 700; font-size: 22px">第四步主题建模(Topic Modelling)</p>
<p>主题建模提供了文档的简短描述同时它也提供了自动组织搜索理解并汇总大量信息的工具主题建模是统计模型它研究一组文档中的单词确定文档主题并发现主题是如何相关(associated)或者如何随时间变化的(change over time)</p>
<p style="font-weight: 600; font-size: 18px">流程</p>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;1.揭开(uncover)语料库中隐藏的主题模式(hidden topical patterns)
<br />
&nbsp;&nbsp;&nbsp;&nbsp;2.根据这些主题来注释文档(annotate document)
<br />
&nbsp;&nbsp;&nbsp;&nbsp;3.使用注释来组织搜索汇总文档(organize, search, summarise)
</p>
<p style="font-weight: 600; font-size: 18px">主题(topic)</p>
<p>
一个主题被正式定义为固定单词词汇分布(a distribution over a fixed vocabulary of words)不同的主题在相同的词汇上会有不同的分布词汇中的某个词可以在多个主题中有不同的权重
<br />
一个文档通常由多个主题以不同的比例贯穿文本
</p>
<p style="font-weight: 600; font-size: 18px">LDA</p>
<p>
最简单的主题模型是Latent Dirichlet Allocation(LDA)这是一个语料库的生成概率模型(generative probabilistic model of a corpus)在生成概率模型中从概率密度函数 (probability density function) 得出模型观测值 (model observation)在LDA中文档被视为生成过程 (generative process) 的结果(带有隐藏变量 hidden variables)
<br />
LDA假设了
<br />
</p>
<li>有一个固定的词汇表 (fixed vocabulary of words)</li>
<li>潜在主题 (latent topics) 的数目是预定义的</li>
<li>每个潜在主题的特征都是词汇表中单词的分布(Dirichlet distribution)</li>
<li>每个文档表示潜在主题的一个随机混合(random mixture)</li>
<p style="font-weight: 600; font-size: 18px">LDA流程</p>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;1.选择文档的长度N
<br />
&nbsp;&nbsp;&nbsp;&nbsp;2.每个文档有一个在主题上的分布
<br />
&nbsp;&nbsp;&nbsp;&nbsp;3.为文档中的每个词分配一个主题并选择相应的主题中的单词
<br />
<br />
在现实中只有文档是可用(available)LDA的目标是为每一个文档推断潜在的主题(underlying topic)主题比例 (topic proportion) 以及主题分配 (topic assignment)
</p>
<p style="font-weight: 600; font-size: 18px">算法</p>
<p>
&nbsp;&nbsp;&nbsp;&nbsp;1.选择一个值 k
<br />
&nbsp;&nbsp;&nbsp;&nbsp;2.对于每个文档将文档中的每个单词随机分配给k个主题之一
<br />
&nbsp;&nbsp;&nbsp;&nbsp;对于每个文档 d遍历每个单词 w然后计算 d 中分配给主题 t 的单词所占的比例通常会应用平滑(smoothing)处理
</p>
<img src="@/assets/images/f4011.png" alt="" />
<p>
&nbsp;&nbsp;&nbsp;&nbsp;4.计算从单词w来的所有文档中对主题 t 的分配比例 P(w | t)
<br />
&nbsp;&nbsp;&nbsp;&nbsp;5.计算属于主题 t 的单词 w 的概率
</p>
<img src="@/assets/images/f4012.png" alt="" />
<p style="font-weight: 600; font-size: 18px">注意事项</p>
<p>
LDA将文档视为主题的混合体
<br />
LDA将主题视为单词的混合体
<br />
如果单词 w 很有可能出现在主题 t 则所有带有 w 的文档将与主题 t 的关联更为紧密
<br />
如果单词 w 不太可能出现在主题 t 则包含 w 的文档出现在 t 中的可能性将会很小因为文档 d 中剩余的单词将出现在其他主题中因此 d 有更高的可能性属于那些主题因此就算我们将 w 添加到 t 也不会将很多该类文档带到 t
</p>
<p style="font-weight: 600; font-size: 18px">应用</p>
<p>
主题模型可以被用于文档建模(document modelling)文档分类(document classification)与协同过滤(collaborative filtering)
<br />
主题模型不仅可以应用于文本数据它还可以用于注释图像
</p>
<p style="font-weight: 700; font-size: 22px">情感分析 (Sentiment Analysis)</p>
<p>
情感分析使用统计和自然语言处理来从文本中挖掘观点来识别并抽取主观信息
<br />
应用 检测产品或者电影的评论的极性(polarity of reviews)
<br />
<br />
分析层面包括了文档层面(document)语句层面(sentence)短语层面(phrase)和短文层面(short-text)
<br />
<br />
分类方法(朴素贝叶斯最大熵或者支持向量机SVM) 经常被用来提取语料库统计以用于情感分析
</p>
<img src="@/assets/images/f4013.png" alt="" />
<p>分类器仅基于对其进行训练的数据集来确定情感</p>
<li>词义随着领域不同而改变</li>
<li>因此模型无法直接应用于其他领域</li>
<p>
绝对的情感水平无法提供信息应该建立一条基线然后将其与观察值比较比如一个产品拥有40%正面推文60%负面推文貌似是不成功的但是如果其他类似的成功产品也有类似的正负面百分比那么不应该认为该产品是不成功的
<br />
<br />
如何对大量评论添加标签(积极消极中立):
<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;1.使用表情符号 (小心阴阳怪气)
<br />
&nbsp;&nbsp;&nbsp;&nbsp;2.使用 Amazon Mechanical Turk 互联网众包市场将上标签工作外包出去
</p>
<p style="font-weight: 700; font-size: 22px">获得结果(gaining insights)</p>
<p style="font-weight: 600; font-size: 18px">词云(word cloud)</p>
<p>五星好评的词云</p>
<img src="@/assets/images/f4015.png" alt="" />
<p>一星差评的词云</p>
<img src="@/assets/images/f4016.png" alt="" />
<p>TFIDF能够用来凸显评论中有信息量的单词</p>
<img src="@/assets/images/f4017.png" alt="" />
<p>LDA可以把评论归类为主题圆盘的大小代表了词的权重</p>
<img src="@/assets/images/f4018.png" alt="" />
<p>另一种可视化方式</p>
<img src="@/assets/images/f4019.png" alt="" />
</div>
</template> </template>
</popModel> </popModel>
</template> </template>
@ -216,7 +427,7 @@ import useAlgorithmStore from "@/store/modules/algorithm.js";
import useUserStore from "@/store/modules/user"; import useUserStore from "@/store/modules/user";
import { getUserInfo } from "@/utils/auth"; import { getUserInfo } from "@/utils/auth";
// //
const b_algorithmKnowledge=ref(false) const b_algorithmKnowledge = ref(false);
const userInfo = JSON.parse(getUserInfo()); const userInfo = JSON.parse(getUserInfo());
const loading = ref(false); const loading = ref(false);
const loading2 = ref(false); const loading2 = ref(false);
@ -506,6 +717,7 @@ const sentimentAnalysis = () => {
g_emotionAnalysisinfo = JSON.parse(res.data); g_emotionAnalysisinfo = JSON.parse(res.data);
g_emotionAnalysis.value = JSON.parse(res.data)?.items[0]?.sentiment; g_emotionAnalysis.value = JSON.parse(res.data)?.items[0]?.sentiment;
n_emotiveTendency.value = Math.round(g_emotionAnalysisinfo.items[0].positive_prob * 100); n_emotiveTendency.value = Math.round(g_emotionAnalysisinfo.items[0].positive_prob * 100);
console.log(n_emotiveTendency.value, " n_emotiveTendency.value");
} else { } else {
aCommentOpinion.value = JSON.parse(res.data).items.reduce((groups, item) => { aCommentOpinion.value = JSON.parse(res.data).items.reduce((groups, item) => {
// sentiment // sentiment

@ -467,7 +467,7 @@ const uploadReport = async (id) => {
if(!id){ if(!id){
return return
} }
window.open(`http://192.168.2.16:9868/api/stu/concept/block/download?TOKEN=${'Bearer '+getToken()}&id=${id}`); window.open(`http://118.31.7.2:9868/api/stu/concept/block/download?TOKEN=${'Bearer '+getToken()}&id=${id}`);
// window.open(`http://202.97.179.126:8800/api/stu/concept/block/download?reportName=${tableData2.value[0].reportName}&TOKEN= ${'Bearer '+getToken()}&module=${data2.module}&userId=${data.userId}`) // window.open(`http://202.97.179.126:8800/api/stu/concept/block/download?reportName=${tableData2.value[0].reportName}&TOKEN= ${'Bearer '+getToken()}&module=${data2.module}&userId=${data.userId}`)
// window.open(`http://202.199.90.115:8800/api/stu/concept/block/download?reportName=${tableData2.value[0].reportName}&TOKEN= ${'Bearer '+getToken()}&module=${data2.module}&userId=${data.userId}`) // window.open(`http://202.199.90.115:8800/api/stu/concept/block/download?reportName=${tableData2.value[0].reportName}&TOKEN= ${'Bearer '+getToken()}&module=${data2.module}&userId=${data.userId}`)
}; };

@ -12,7 +12,7 @@
</div> </div>
<div class="el_bon"> <div class="el_bon">
<a target="_blank" @click="showResource(i.resourcesUrl)"> <a target="_blank" @click="showResource(i.resourcesUrl)">
<img :src="getImg(i.resourcesImg)" /> <img data-src="https://jrdsj.sztzjy.com:598/assets/%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%BA%90-1.a6a80357.png" :src="getImg(i.resourcesImg)" />
</a> </a>
</div> </div>
</div> </div>

@ -1,3 +1,11 @@
/*
* @Author: qinzhenpen qzp1807@126.com
* @Date: 2024-07-15 15:44:46
* @LastEditors: qinzhenpen qzp1807@126.com
* @LastEditTime: 2024-08-21 17:56:44
* @FilePath: \digital-marketing\vite.config.js
* @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
import { defineConfig, loadEnv } from 'vite' import { defineConfig, loadEnv } from 'vite'
import path from 'path' import path from 'path'
import createVitePlugins from './vite/plugins' import createVitePlugins from './vite/plugins'
@ -37,6 +45,9 @@ export default defineConfig(({ mode, command }) => {
} }
} }
}, },
esbuild: {
drop: ['console', 'debugger'],
},
//fix:error:stdin>:7356:1: warning: "@charset" must be the first rule in the file //fix:error:stdin>:7356:1: warning: "@charset" must be the first rule in the file
css: { css: {
postcss: { postcss: {

Loading…
Cancel
Save