日记大全

日记大全 > 句子大全

用人工智能进行自然语言处理时如何将文章数字化

句子大全 2023-01-23 05:13:01
相关推荐

在用人工智能尤其是深度学习技术来进行自然语言处理时,关键的第一步是要将语言文本进行数字化,然后才能送入神经网络进行下一步的计算,在形成了文档模型和拆分的单词模型后就可以进行很多进一步的处理。

目前比较可行也是最常用的将文本数字化的技术是向量化技术,即将文本转化为由一串数字组成的向量。这里的向量与数学中的向量稍有区别,在计算机中向量可以看作是一个一维数组。

语言中的单词、句子和文章都可以进行向量化,向量化的结果分别称为“单词向量”、“句子向量”和“文章(或文档)向量”,语言元素向量化之后的结果应该存在一定的联系(或关系),这种联系往往是以“向量距离”来表现的,距离越近说明关系越紧密,这时候也称之为“关系强度越大”。有时候也往往从另一个角度即“相似度”来考量两个向量的关系,一般来说,相似度越高说明两个向量距离越近。从语言的角度上来说,越相似的两个语言元素向量化之后其向量距离应该越近,相似度也越高;经常一起出现的两个语言元素之间的向量距离应该比不常一起出现的要更近,相似度要更高。

向量距离有各种计算方式,像我们常见到的计算向量之间余弦相似度的算法,就是最常使用的计算向量距离的方法之一。

人们对单词、文档的向量化已经进行了很多研究,出现了用于单词向量化(word2vec)、文档向量化(doc2vec)的很多方法。目前常用的方法是:首先对一批文章(称作训练素材)进行清理后对系统进行训练,训练完毕后会生成一个模型,利用该模型就可以生成单词向量或文章向量,并可用于进一步的高级应用。这种方法显然对训练素材的要求比较高,一般要求内容清楚、格式规范,并且与将要应用的领域在内容和风格上都比较贴近。

下面将以Go语言为示例介绍训练向量模型以及生成文章向量的方法,其中使用到了github.com/topxeq/xiaoxian包中提供的一些方法,由于是开源的包,所以详细算法如果感兴趣可以自行去研究。。

在介绍代码之前,先要做一些准备工作,我们先要准备一下训练素材。先新建三个文本文件,分别命名为text1.txt、text2.txt、text3.txt,它们的内容如下:

惠能父亲早亡,家境贫穷以卖柴为生,不识一字。一次,惠能在客店卖柴后听到有人读诵《金刚经》,心下即便开悟,问经从何来,念诵者告诉他从黄梅山东禅寺来,那里有五祖弘忍弘法,座下千余人。后有一人资助惠能银两,惠能尽数交给老母亲,于是前往黄梅拜谒五祖。五祖知道惠能根性大利,派他在厨房做工。惠能八月有余,只是“舂米,破柴”,未曾上过一次正殿,听过一次法会。其时弘忍有意传法,命弟子作偈以呈,以检验他们的修为。神秀上座呈偈曰:“身是菩提树,心如明镜台,时时勤拂拭,莫使惹尘埃。”弘忍告诉大家应照着这个偈修习,能得大利益。但是私下里,他告诉神秀,并未开悟,再呈一偈。惠能听后亦诵一偈,请人代劳题于壁上:“菩提本无树,明镜亦非台,本来无一物,何处惹尘埃。”大众皆惊,弘忍见后,告诉大家并未开悟,将偈子擦干净。后来,五祖于三更招惠能秘授《金刚经》,于“应无所住而生其心”大彻大悟。五祖于是传衣钵,定为传人。并且嘱咐六祖坐船南下,等时机成熟后再弘法,衣钵就到你为止不要再传了。后来惠能隐蔽十五年,才在广州法性寺,由印宗剃度,开始弘法。麾下四十三人开悟,禅宗开枝散叶,形成五宗七派的辉煌时期。

text1.txt的文件内容

80年的光阴,虽然在历史的长河中不过是浪花一朵,但如果以人的一生来说,已经是进入耄耋老年了。但奇迹般的是,随着深度学习技术的横空出世,人工智能又神奇地焕发出了再一次的青春。深度学习系统AlphaGo及其升级版本一再战胜围棋领域的多位世界冠军级选手,最后甚至到了一败难求、人类选手只能仰视的地步,不能不说是引起了世人广泛关注人工智能领域的决定性事件。指纹识别、人脸识别、无人驾驶等应用了深度学习方法而又贴近人们日常生活的技术,可以说深刻地改变了人类的生活和消费方式,也因此让人工智能更加深入人心,激起了人工智能尤其是深度学习领域的学习热潮。

text2.txt的文件内容

银河系中最古老的恒星几乎和宇宙本身一样古老,因此可能是在大爆炸之后不久的黑暗时期形成的。在10,000光年内的恒星形成核球,并有着一或多根棒从核球向外辐射。最中心处被标示为强烈的电波源,可能是个超大质量黑洞,被命名为人马座A。在很大距离范围内的恒星和气体都以每秒大约220公里的速度在轨道上绕着银河中心运行。这种恒定的速度违反了开普勒动力学,因而认为银河系中有大量不会辐射或吸收电磁辐射的质量。这些质量被称为暗物质。

text3.txt的文件内容

三篇短文各自内容完全不相关,比较适合测试。然后要将分词所需的词典文件dict.txt和用户词典文件userdict.txt复制到当前目录下,因为整理文档时要进行分词。没有词典其实也可以,系统默认会将每个字分拆开,这样生成的向量也有一定意义,但不如适当分词后的逻辑性更强。对于英语篇章,可以不用词典,因为英语本身往往已经是分好词的。

准备好这两项之后,就可以输入下面的代码来测试。

package mainimport ("log" "tools" "github.com/topxeq/xiaoxian")// 第一个测试文本字符串var testDoc1G = `虽然电脑还缺少人类所具有的很多思考模式、逻辑创新、情感产生和变化的能力,但是在处理一些基于经验的、需要海量处理和计算(例如图片、语音、视频的识别等)的机械任务上,人工智能已经具备条件帮助人类去更快更准地完成。而进一步地,以大数据为基础的逻辑判断和行为决断(例如无人驾驶和医疗机器人),是深度学习下一步高歌猛进的目标。`// 第二个测试文本字符串,仅比testDoc1G略有改动var testDoc2G = `虽然计算机还缺少人类所具有的很多思考模式、逻辑创新、情感产生和变化的能力,但是在处理一些基于经验的、需要海量处理和计算(例如图片、语音、视频的识别等)的机械任务上,人工智能已经具备条件帮助人类去更快更准地完成。而进一步地,以大数据为基础的逻辑判断和行为决断(例如无人驾驶、电子竞技和医疗机器人),是深度学习下一步高歌猛进的目标。`// 第三个测试文本字符串,与testDoc1G和testDoc2G差异较大var testDoc3G = `道可道,非常道;名可名,非常名。无名,天地之始,有名,万物之母。故常无欲,以观其妙,常有欲,以观其徼。`func main() { // 通过训练获得一个向量模型对象 // 训练的目录指定为当前目录(“.”表示程序运行时当前所处的目录) // 第二个参数"text*.txt"表示将训练目录中所有符合该条件的文件加入 // 第三个参数"trainData.txt"表示将清理的文本存入该文件 // "d2v.model"是指定的存放训练后模型的文件路径 // 最后两个数字参数分别表示生成向量的维度(300)和训练的轮数(30) modelT, errT := xiaoxian.TrainDoc2VecModel(".", "text*.txt", "trainData.txt", "d2v.model", 300, 30) // 用向量模型将testDoc1G生成一个向量 vector1 := modelT.GetDocVectorMust(testDoc1G) tools.Printfln("文档向量1:%v", vector1) // model2T是从保存的模型文件中读取的模型对象 // 为了演示载入模型的用法 model2T, errT := xiaoxian.LoadD2VModel("d2v.model") if errT != nil { log.Fatalf("载入模型时发生错误:%v", errT) } // vector2是用载入的模型生成的向量 vector2 := model2T.GetDocVectorMust(testDoc1G) tools.Printfln("文档向量2:%v", vector2) // 计算两个向量的相似度 tools.Printfln("文档相似度1:%v", xiaoxian.CalCosineSimilarityOfVectors(vector1, vector2)) // 直接计算两个字符串(代表文档)在该模型下的相似度 tools.Printfln("文档相似度2:%v", model2T.GetSimilarityOfDocsEx(testDoc1G, testDoc1G)) tools.Printfln("文档相似度3:%v", model2T.GetSimilarityOfDocsEx(testDoc1G, testDoc2G)) tools.Printfln("文档相似度4:%v", model2T.GetSimilarityOfDocsEx(testDoc1G, testDoc3G))}

由于xiaoxian包中已经进行了良好的封装,因此代码本身比较简单。首先调用xiaoxian.TrainDoc2VecModel函数来训练一个文章向量模型,该函数的定义如下:

func TrainDoc2VecModel(dirA string, patternA string, dataFileA string, modelFileNameA string, dimA int, roundA int) (*D2VModel, error)

参数中dirA表示训练素材存放的路径,我们用“.”表示当前目录;patternA表示将该目录下哪些文件当作训练素材(因为可能有其他文件,所以要区分开),我们用“text*.txt”表示所有以“text”开头并以“.txt”结尾的文件,对于我们的三个例子文本文件,显然文件名都符合这个要求;dataFileA用于指定训练过程中保存的清理后的所有文本的文件名,如果传入空字符串将不保存这个过程文件;modelFileNameA用于指定训练完毕后保存的模型文件名,传入空字符串也将不保存该模型;dimA表示生成的每个文章向量的维度(即一个向量由多少个数字项组成),一般来说,维度越小计算机处理起来越快,维度越大则可以更充分地表现文章之间的差异因而实际效果越好,我们需要权衡这两个因素来确定该值,建议在100至1000之间选择;roundA是表示训练的轮数,也是越大越好但也会越慢,一般建议在10至30之间选择。

xiaoxian.TrainDoc2VecModel函数运行成功后,将返回一个xiaoxian.D2VModel对象,调用该对象的方法就可以进行一系列的与文章向量相关的操作。对于本例来说,我们调用了该对象的GetDocVectorMust函数,对参数中传入的文本字符串生成一个新的文章向量。

如果在xiaoxian.TrainDoc2VecModel函数中传入modelFileNameA参数来保存了向量模型,则可以在以后用xiaoxian.LoadD2VModel函数来载入该模型,本例中也演示了这种用法。如果训练时没有保存,也可以调用D2VModel.SaveModel函数来保存,传入文件路径名就可以了。

需要说明的是,即使是同一篇文章,每次生成的文章向量一般也是不同的,但它们的向量距离应该是很接近的,也就是说相似度应该是很高的。上面的代码中特地演示了这一点,对于代码中定义的文本字符串testDoc1G,先后两次生成了该文档的向量vector1和vector2,并且后面又分别将testDoc1G与它自己、testDoc1G与稍将其加以修改后的testDoc2G、testDoc1G与有较大不同的testDoc3G进行了向量相似度的计算。计算向量相似度可以用xiaoxian.CalCosineSimilarityOfVectors来计算两个已经生成好的文章向量的相似度,也可以D2VModel.GetSimilarityOfDocsEx函数来直接计算两个字符串在该模型下的相似度。

该段代码的运行结果如下:

文档向量1:[-0.02435952 0.02134627 0.018935079 -0.054204702 -0.120689906 -0.006422895 -0.027686184 -0.1341439 0.025836209 0.2322654 -0.022633187 0.136047 -0.123515 0.12815993 0.05813795 0.06811903 0.11295072 -0.009665259 0.055137236 -0.014839303 -0.11663169 0.017001705 0.06489083 0.051224425 0.14905249 -0.04720692 0.099287935 0.16361555 0.04455658 0.036252014 0.15035929 0.050073426 -0.063439354 0.105252735 0.16086821 0.13484709 0.09769018 -0.05374073 0.16638637 0.17796664 0.12779465 0.04965567 -0.098637044 -0.050973535 0.07541737 -0.1585799 -0.15283051 0.0099941855 0.1090593 0.021443658 0.10715237 -0.13737091 0.0653615 0.06123986 0.087992735 -0.022919575 0.058399748 0.117554225 -0.020294622 -0.28243673 -0.025490323 -0.035578176 -0.085441664 0.016822616 0.026005289 0.08942653 -0.0047714203-0.19891211 -0.13851142 0.06517466 0.038212333 0.2767579 -0.04174414 -0.101303585 0.0040712133 -0.01941264 -0.22683248 0.22946824 -0.041218694 0.06264911 0.050599672 0.09363092 0.17397834 0.06897181 0.15680167 -0.039536968 0.18736863 0.06889958 0.20629996 -0.00050252635 -0.033323392 0.1467586 -0.02897739 0.05945234 0.029643312 0.08487909 0.14622727 0.030582588 0.07847026 -0.11728856 0.03340383 -0.01023648 -0.101186976 -0.099897824 0.0516956 0.12313716 -0.116405144 -0.017859122 0.021919427 -0.034578983 0.28140667 0.10450229 -0.033052385 0.012700467 -0.12491902 0.12255258 -0.09621908 -0.01169696 0.071585946 0.06892862 0.09016633 -0.018596686 0.23597609 -0.034804754 0.02038067 -0.101332806 -0.045336094 -0.08612244 0.16144836 0.15477267 -0.22233237 0.18951745 -0.1106226 -0.032538205 -0.16426972 0.06558776 -0.10628384 -0.03988652 -0.09605203 -0.10302766 0.048969217 0.31255582 -0.18277676 -0.1418957 -0.004046394 0.1125602 0.08006495 0.061411977 -0.10379107 -0.09234393 -0.09445347 0.11473044 -0.053628746 -0.0023065773 0.09786826 -0.12833163 0.03176049 -0.17571706 0.0635696 -0.17951596 0.060163114 -0.21126962 0.09503206 -0.10902114 0.119118676 0.049606264 -0.040002897 -0.055702638 0.30032957 -0.15180999 -0.1266786 0.089968815 0.021192942 -0.122851245 -0.124596134 0.03640155 0.064306766 -0.055995777 -0.004663459 -0.07258314 -0.18132421 -0.11949342 -0.04311391 -0.05489896 -0.04513738 0.19104034 0.1267273 0.07907883 0.12531258-0.104529776 -0.090924926 0.17263666 0.08045747 -0.118644364 0.06551456 -0.020357711 -0.011650374 0.13789506 -0.16159767 0.011487074 0.05023705 -0.06890651 0.061714843 -0.27498594 -0.033768307 -0.23873541 0.044403806 -0.13149351 0.043205865 0.07857808 0.0071027433 -0.092370614 -0.11583762 -0.109700345 0.13559109 -0.04150299 0.0014626913 0.07451609 0.06684799 0.047136072 0.0155980475 0.08119795 0.022471964 0.02465361 0.01637838 -0.041250575 0.124021396 -0.19419311 0.1016053560.14476146 -0.096206464 0.19656616 -0.17685567 0.01070636 -0.031826477 -0.0816213 0.1710496 -0.15831709 -0.1876301 -0.09142066 -0.08626761 0.088914655 -0.1591471 -0.07586372 0.09471226 0.07653991 -0.029074652 0.0072579966 0.004580366 0.020869417 0.010638543 -0.09019479 -0.014396582 -0.055381503 -0.11468237 -0.087084770.15404022 -0.048716005 0.029767761 -0.002243826 0.15140778 0.0675738 0.012891392 -0.06303312 -0.12469459 0.063273534 0.04777992 -0.032410905 0.20875646 0.08755125 0.04634867 0.09676597 0.28187016 -0.068045065 0.032431003 -0.1388508 -0.009952507 0.09828437 -0.13228947 0.007438427 0.090031326 0.13337666 -0.04345268 0.09336966 0.09976085 0.16990325 0.0075959307 -0.1540627 0.12314613 -0.10411318 0.04736088 -0.11495972 0.04747955 0.12483751 0.2872128 0.07956477 0.054493114 0.31278983 -0.012712609 -0.1983478]文档向量2:[-0.025275985 0.003681622 0.020913813 -0.05783278 -0.11547527 -0.0054479884 -0.025727496 -0.13643667 0.013774389 0.22885405 -0.034420628 0.113290496-0.11117288 0.14806226 0.08010691 0.060143843 0.1106049 -0.0023196018 0.04862598 -0.0007994582 -0.10208557 -0.01067873 0.069572985 0.05552103 0.12120586 -0.020944325 0.06840456 0.14965631 0.04075964 0.044331186 0.15043448 0.04349222 -0.073238775 0.093189776 0.16926767 0.1385183 0.113069 -0.060982022 0.16555196 0.18365034 0.122852355 0.058563583 -0.099389754 -0.04701848 0.08314053 -0.16618733 -0.16175297 0.010464542 0.12020165 0.040126428 0.11963126 -0.13168508 0.087383345 0.06514353 0.10560799 -0.026192868 0.078541994 0.101531394 -0.024196468 -0.28541672 -0.0031690325 -0.056929205 -0.10302278 0.020792117 0.010435739 0.082676716 -0.0038290077 -0.19763277 -0.12831551 0.067260936 0.034660283 0.2767015 -0.024841858 -0.090859525 0.012210175 0.0037153547 -0.24280404 0.24151981 -0.039435185 0.052708864 0.054697514 0.08407785 0.1789917 0.069699466 0.12777317 -0.024152331 0.19030286 0.071034476 0.21189077 0.0017079774 -0.036688443 0.13957928 -0.0122043770.05562883 0.017836524 0.07952649 0.13216914 0.03154639 0.0878861 -0.098655924 0.040724657 -0.014084395 -0.087834224 -0.098550595 0.027910825 0.12311014 -0.110106915 -0.023194706 0.007123559 -0.04022817 0.27860013 0.096896075 -0.037728358 0.028146988 -0.11447665 0.13350153 -0.09934747 -0.0263653 0.044782497 0.066162944 0.069984384 -0.009444161 0.23926434 -0.03958895 0.03214605 -0.09622159 -0.04846694 -0.07458268 0.15381928 0.14877757 -0.2072499 0.18469632 -0.09748775 -0.03839672 -0.14682472 0.07350803 -0.10333238 -0.04673218 -0.106134616 -0.11593561 0.05671086 0.29729152 -0.18197383 -0.13111408 -0.0064257947 0.12680832 0.070408225 0.07064371 -0.10734699 -0.10147601 -0.10089258 0.1137023 -0.048910975 -0.0017547379 0.09228246 -0.10112088 0.031599857 -0.18893844 0.06528799 -0.16568905 0.04463093 -0.19626366 0.10050493 -0.104880385 0.117935136 0.049099848 -0.056349963 -0.047000162 0.2924253 -0.14069773 -0.14001133 0.08779242 0.028740976 -0.1113801 -0.11493553 0.01602916 0.06664427 -0.0520989 0.009058493 -0.08950943 -0.18060699 -0.10973934 -0.022863522 -0.0390062 -0.04532875 0.18722874 0.12562893 0.087774955 0.13041341 -0.1019956 -0.11794991 0.1786514 0.084872894 -0.10914589 0.07124906-0.01937354 0.011071848 0.13448027 -0.14961517 0.0066697053 0.052073427 -0.073832035 0.077793494 -0.265062 -0.0390877 -0.24217023 0.037561685 -0.1137264 0.053636733 0.08778018 0.00032631555 -0.105351105 -0.10315444 -0.10670399 0.12665188 -0.030698176 0.014095417 0.07178461 0.08106195 0.049631283 -0.004461291 0.08699704 0.018851237 0.033106662 0.010619352 -0.030380998 0.1282463 -0.20624208 0.09591518 0.15778573 -0.103650756 0.20422919 -0.17009994 0.008889008 -0.03689927 -0.09068181 0.16437036 -0.15861787 -0.19241163 -0.069396235 -0.09386297 0.09045335 -0.16082215 -0.075280346 0.097990006 0.06437237 -0.023110662 0.016246649 0.0070562903 0.008220154 0.029042704 -0.07846655 -0.012348997 -0.028184945 -0.094472274 -0.08069028 0.1437221 -0.039354075 0.021899147 -0.0013213083 0.16486949 0.08280897 0.04051166 -0.060119424 -0.10368096 0.066353045 0.048535325 -0.032995522 0.1929427 0.08200385 0.04665428 0.09712241 0.26609546 -0.06777906 0.025696192 -0.1365676 -0.027562356 0.09877913 -0.113127165 0.0033701528 0.09054186 0.122484885 -0.055243745 0.09734362 0.11298317 0.15906921 9.2033435e-05 -0.1417244 0.124786876 -0.11334143 0.038785983 -0.10127784 0.04751155 0.13069336 0.28355765 0.0737834050.06700189 0.29718673 -0.026403395 -0.20149156]文档相似度1:0.9950205306362367文档相似度2:0.9986403890496479文档相似度3:0.9961252511064708文档相似度4:0.43072862133547546

注意几点:

可以看到,生成的文章向量确实是由相应个数的浮点数组成的切片(数组);由于每次生成的向量都不同,因此运行结果每次也都会有差异,但总体趋势应该是类似的;向量相似度计算的结果是一个0到1之间的浮点数,越接近于1表示两个向量距离越近,也就代表两篇文章越相似;反之越接近于0则表示向量距离越远,文章越不相似。注意有时候由于浮点数计算误差的原因,向量距离的计算结果也可能偶尔出现小于0或略大于1的情况;同一篇文章两次生成的向量进行比对,也不一定都是1,但会比较接近;偶尔一篇文章两次的比对结果,比与其他文章的比对结果还要小,这也是正常的;在不同模型下,同一篇文章生成的向量可能会区别较大,这是由于训练素材不同而导致的,这也是正常的现象,并且理当如此;本例中计算的“文档相似度1”和“文档相似度2”,实际上都是testDoc1G自身的比对,“文档相似度3”是testDoc1G与testDoc2G比对的结果,“文档相似度4”是testDoc1G与testDoc3G比对的结果;可以看出,这几个结果总体趋势由大到小,符合这几个字符串的相似度情况。

生成了文档向量之后,就相当于把文档已经数字化,并且是有一定的内在含义的数字化。之后,除了比较文档相似度来进行查重等用途,还可以有不少其他的应用,我们今后会进一步介绍。

阅读剩余内容
网友评论
相关内容
拓展阅读
最近更新