罗兰在MATLAB的艺术

把想法变成MATLAB

你能通过文本分析找到爱吗?

吉米·法伦了妮可·基德曼约会的机会,但是你知道么,有可能爱上任何人吗?今天的嘉宾博客古原Takeuchi想谈论与MATLAB寻找真爱。

内容

爱的实验

我读了一个很有趣的《纽约时报》的文章爱上任何人,这样做。这是一个实验是这样的:

“两个异性陌生人面对面坐在实验室并回答一系列36越来越多的个人问题。然后他们默默地凝视对方的眼睛四分钟。六个月后,他们结婚了。”

我想看看如果有人可以试一试。幸运的是,我的一个朋友在日本是想试一试,但是有一个小问题:她找不到任何的男性同行愿意加入她的这个实验。

这是一个大问题在日本的出生率负增长。甚至有一个新词,“猎婚”在密集的力气就能结婚。我们可以做这个实验之前,我们需要首先解决这个问题。很多人转向网上约会,但这并不是那么容易。你需要一些证据吗?

潜在语义分析和MATLAB

在一个网上约会的世界需要梳理一个麻木的概要文件的体积只是开始。随后的想法:为什么不使用MATLAB和我在线配置文件来找到你的爱吗?

我们需要数据分析。我没有获得真正的网上约会档案,但幸运的是我找到了网上约会Ipsum由劳伦Hallden随机生成虚拟的。我使用潜在语义分析(LSA)在线集群配置文件基于词中所包含的信息。我编造了一个MATLAB类myLSA.m实现潜在语义分析方法。让我们到一个对象进行初始化文理学院和加载数据和打印其中之一。

LSA = myLSA ();概要文件= readtable (“online_profiles.xlsx”);流(' % s \ n % s \ n % s \ n % s \ n % s \ n”,profiles.Profile {1} (1:73),profiles.Profile {1} (74:145) profiles.Profile {1} (146:219),profiles.Profile {1} (220:291) profiles.Profile {1} (292:358))
在咖啡店冒险炸玉米饼医学院工作。女权主义去健身房强大和自信的家庭人听音乐,我的胡子黑泽明讨论政治尝试不同的餐馆我知道我上市超过6。滑雪不戏剧户外活动讨论政治泡菜我的朋友告诉我,他们不明白为什么我单身。

随机词沙拉而言并非坏事,只不过他们都是男性的概要文件。如果你需要女性概要文件,你需要找到其他来源。

文本处理管道

我们可以分析文本之前,我们需要处理成一个适当的形式。有一个相当标准的英语文本的过程。

  1. 标记:使用空白文本分割成词的标记,等等。
  2. 标准化:标准化单词形式,即。全是小写字母
  3. Stopwords:删除常用单词,如“,,,‘
  4. 阻止:减少单词根形式通过削减他们的结局
  5. 索引:单词的文档和词的频率计数
  6. Document-Term频率矩阵:将索引文档频率计数到x项矩阵

分词器方法负责第一个四个步骤——标记化,规范化,stopwords和遏制。检查之前和之后。

标记化的= LSA.tokenizer (profiles.Profile);之前= profiles.Profile后(1)= {strjoin(标记化的{1},' ')}
= '之前在咖啡店冒险炸玉米饼医学院工作。女权主义goi……后= '工作咖啡商店adventur taco医生学校femin去健身房强大的知名的……”

接下来,索引器方法创建单词列表和字数向量。

[word_lists, word_counts] = LSA.indexer(标记);

然后我们创建一个document-term从这些使用频率矩阵docterm。最低频率设置为2,滴任何单词,只发生一次整个文档的集合。

docterm = LSA.docterm (word_lists word_counts 2);

TF-IDF权重

你可以直接使用document-term频率矩阵,但原始的字数是有问题的,它给了太多体重频繁的话,和频繁的词出现在许多文档通常是不太有用的理解这些文档之间的差异。我们希望看到的重量来表示每个单词的相关性。

TF-IDF是一种常见的频率加权的方法。它是由TF,代表词的频率,和IDF,逆文档频率。TF尺度基础上给定项在文档中出现的次数,并根据有多少反向IDF尺度给定术语出现在文档。更频繁的一个词出现在文档中,体重就越低。TF-IDF只是一个产品的两个指标。让我们使用tfidf应用这个权重方案。也可以返回特遣部队。

tfidf = LSA.tfidf (docterm);

我经历了文本处理的每一步,但我们可以运行vectorize将原始单元阵列的网上约会档案TF-IDF加权矩阵一箭。

tfidf = LSA.vectorize (profiles.Profile 2);

低秩近似

一旦数据转化为一个矩阵,我们可以应用线性代数技术进一步分析。在文理学院中,您通常应用奇异值分解(圣)找到一个低秩近似。

让我们首先得到圣言的组件。U是圣言文档矩阵,是圣言项矩阵,和S是奇异值。

[U, V] =圣言(tfidf);

如果你方年代除以之和年代平方,得到方差解释的百分比。让我们画出累积值。

解释= cumsum (s ^ 2 / sum (s . ^ 2));图的阴谋(1:尺寸(年代,1),解释)xlim (30 [1]); ylim ([0 1]);线(5[5],[0解释(5)],“颜色”,“r”5)线([0]、[解释(5)解释(5)),“颜色”,“r”)标题(的累积和S ^ 2除以S ^ 2的总和)包含(“列”)ylabel (“%方差解释”)

你看到前5列解释方差的60%。一个5级近似将保留60%的原始矩阵的信息。的myLSA类还提供了lowrank执行计算,并返回一个基于某些标准低秩近似,如列数或比例的方差解释道。

(英国、Sk、Vk) = LSA.lowrank (tfidf, 0.6);

可视化网上约会档案

我们还可以使用前2列绘制计算文档矩阵U和奇异值分解矩阵在二维空间。蓝点代表网上约会档案和周围的词汇语义相关资料。

图()散射(U (: 1), U (:, 2),“填充”)标题(“网上约会档案和文字”)包含(“维度1”)ylabel (《维2》)xlim ([-。3 . 03]);ylim ([-。2点45)i =[1、4、9、12、15、16日,20日,22日,23日,24日,25日,27日,29日,33岁,34岁,35岁,38岁,47岁,48岁,53岁,57岁的58岁64,73,75,77,80,82,83,85,88,97,98103113114116118120125131,136142143156161162166174181185187199200204206212年,234251]文本(V(我,1)。* 3,V(我,2)。* 3、LSA.vocab(我))结束文本(-0.25,0.4,“健康/运动”,“字形大小”12“颜色”,“b”)文本(-0.15,-0.15,“坏男孩/彩色”,“字形大小”12“颜色”,“b”)

你可以看到有两个主要的集群——我称之为“健康/运动”集群和一个叫做“坏男孩/彩色”集群中,基于相关的词汇。这是有道理的,因为劳伦在概要文件生成器提供了两个选择:

  • 典型的空洞的吱吱喳喳地叫
  • 一边疯狂的酱

你能猜出哪个集群属于哪一类?

现在你可以集群一大堆资料,迅速消除那些不适合你的口味。你也可以添加自己的配置文件,看看哪个集群你属于,而且,如果让你在一个错误的集群的配置文件,那么您可能想更新你的资料。

计算相似度

说你找到你感兴趣的一组配置文件。在概要文件你看到,哪一个是最接近你的口味呢?要回答这个问题,我们需要找到一种方法来定义两个文档的相似度。如果你使用向量之间的欧氏距离,长文档和短文件可以有非常不同的值,即使他们共享许多相同的单词。相反,我们可以使用向量之间的夹角来确定相似。这就是所谓的向量空间模型。为了便于计算,使用余弦相似度计算。

cos =点(A, B) /(规范(A) *规范(B))

值越大,越接近(=类似)。

90度角余弦___________ ______ 0度1 0 180度1

在实际实现中,你可以规范化L2范数向量的长度,和计算点积。

cos =点(A /规范(A), B /规范(B))

您可以应用长度归一化的相似度计算。我们将使用的5级近似计算文档矩阵比较网上约会档案的使用正常化

doc_norm = LSA.normalize (U (: 1:5));

现在我们可以计算余弦相似性概要文件分数。让我们来比较一下前五的第一个概要,配置文件。

:LSA.score (doc_norm (1:5), doc_norm (1,:))
ans = 1 0.20974 0.55248 0.97436 0.72994

第一个得分是1,这意味着它是一个完美的匹配,因为我们比较第一个概要文件本身。其他资料得到更低的分数取决于类似他们第一个概要文件。

获得排名的比赛

可能是有用的,如果你可以描述你理想的日期和找到匹配您的概要描述命令相似。这有点像一个搜索引擎。

比较新的文本字符串的预先计算的矩阵,我们需要应用相同的预处理步骤,我们已经看到。查询可以照顾的繁琐细节。

q =“有人出去玩的乐趣,良好的幽默感,喜欢寿司,”;q =[问权力的游戏的手表,看外国电影,听音乐,”];q =[问“做户外活动或健身”];weighted_q = LSA.query (q);

现在我们需要将查询向量转换为5级文档空间。这是通过改变M = U * * V 'U = M * V *年代^ 1和替换米的查询矢量和V年代低秩近似。

q_reduced = weighted_q * V (: 1:5) * (1:5, 1:5) ^ 1;

myLSA类也提供了减少方法执行相同的操作。

q_reduced = LSA.reduce (weighted_q);

然后我们可以length-normalize查询向量和计算点的产品文档。下载188bet金宝搏让我们的余弦相似性降序排序,并检查前三的结果。

q_norm = LSA.normalize (q_reduced);(分数,idx) =排序(LSA.score (doc_norm q_norm),“下”);disp (“前三配置文件”)我= 1:3 profiles.Profile (idx (i))结束
前三概要ans = '股票的人我的幽默感健身牛津com憨厚的笑容……ans = '我的猫我擅长高飞微笑山地自行车。修补米……“ans = '我的眼睛看玩如果你认为我们有什么我……”

我看起来很合理!

在这个例子中,我们应用TF-IDF两document-term频率加权矩阵以及查询向量。然而,您只需要应用IDF只有一次查询以节省计算资源。这种方法被称为lnc.ltc聪明的符号系统。我们已经处理过的查询ltc格式。这是你如何做信号为你的文档,你使用TF代替TF-IDF:

[~,tf] = LSA.vectorize (profiles.Profile 2);doc_reduced = LSA.lowrank (tf, 0.6);doc_norm = LSA.normalize (doc_reduced);

日本的文字呢?

我的日本朋友们可以受益于这种技术吗?是的,当然有。一旦你document-term频率矩阵,其余完全相同。最难的部分是断的,因为在日本文本单词之间没有空格。

幸运的是,有免费工具做到这一点——他们被称为日本的形态分析。最受欢迎的分析器是MeCab。二进制包可用于安装在Windows上,但它是32位,不使用MATLAB在64位。我的日本同事,Takuya大谷编译源代码,在MATLAB 64位Windows上运行它。

MATLAB提供了一个接口共享库dll,我们可以使用loadlibrary将它们加载到内存和访问这些共享库函数。这里是如何调用共享库的一个示例libmecab.dllTakuya编译。

你可能没有任何特别需要处理日本的文本,但它给你一个很好的例子,如何一个DLL加载到MATLAB和调用它的函数。请注意如果你想尝试一些需求:

  • 日本有64位与64位的Windows计算机MATLAB
  • 有一个MATLAB-compatible编译器在您的计算机上安装和启用
  • 遵循Takuya的指示编译自己的64位DLL,并将其在当前文件夹连同它的头文件。
loadlibrary (“libmecab.dll”,“mecab.h”);

当您运行这个命令时,你可能会得到一些警告,但你可以忽略它们。如果你想看看图书馆是否加载,使用libfunctionsviewDLL函数可用来查看功能。

libfunctionsview (“libmecab”)

在DLL调用一个函数,使用calllib。Mecab的情况,您需要先初始化Mecab并获得其指针。

argv = libpointer (“stringPtrPtr”,{“MeCab”});命令行参数个数= 1;mecab = calllib (“libmecab”,“mecab_new”命令行参数个数,argv);

作为一个例子,我们叫一个Mecab功能,您可以使用它来分析日本文本mecab_sparse_tostr

文本=有些日本文字的;结果= calllib (“libmecab”,“mecab_sparse_tostr”、mecab文本);

完成时,明确和卸载DLL的指针的内存使用unloadlibrary

clearvarsmecabunloadlibrary (“libmecab”)

行动呼吁

如果你是单身,愿意尝试在《纽约时报》文章所描述的实验,请报告在这里与你的结果。现在《纽约时报》提供了一个免费的应用程序生成36神奇的问题!

发表与MATLAB®R2015a

|

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。