我在网上搜索了关于在文档长度非常不同的情况下标准化 tf 等级的信息 (例如,文档长度从 500 字到 2500 字不等)
我发现的唯一规范化是关于在文档的长度中划分词频,因此导致文档的长度没有任何意义。
虽然这种方法对于规范化 tf.如果有的话,它会导致每个文档的 tf 等级有很大的偏差(除非所有文档都是从几乎相同的字典构建的,使用 tf-idf 时情况并非如此)
例如,让我们拿 2 个文档 - 一个包含 100 个不同的词,另一个包含 1000 个不同的词。 doc1 中的每个单词的 tf 为 0.01,而 doc2 中的每个单词的 tf 为 0.001
这会导致 tf-idf 等级在与 doc1 匹配的单词比与 doc2 匹配时自动变大
有人对更合适的归一化公式有任何建议吗?
谢谢
编辑 我还看到了一种方法,说明我们应该将术语频率除以每个文档的文档的最大术语频率 这也不能解决我的问题
我在想的是计算所有文档的最大词频,然后通过将每个词频除以最大值来归一化所有词
很想知道你的想法
最佳答案
您的分析目标是什么?
如果您的最终目标是比较文档之间的相似性 (et simila),则不应在 tfidf 计算阶段担心文档长度。原因如下。
tfidf 表示您在公共(public)向量空间中的文档。如果您随后计算这些向量之间的余弦相似度,则余弦相似度会补偿不同文档长度的影响。原因是余弦相似性评估向量的方向而不是它们的大小。我可以用 python 告诉你要点: 考虑以下(哑)文档
document1 = "apple apple banana"
document2 = "apple apple apple apple banana banana"
documents = (
document1,
document2)
这些文档的长度不同,但内容相同。 更准确地说,两个文档中术语的相对分布相同,但绝对频率不同。
现在,我们使用tfidf在一个公共(public)向量空间中表示这些文档:
from sklearn.feature_extraction.text import TfidfVectorizer
tfidf_vectorizer = TfidfVectorizer()
tfidf_matrix = tfidf_vectorizer.fit_transform(documents)
并且我们使用余弦相似度来评估这些矢量化文档的相似度,只看它们的方向(或方位)而不关心它们的大小(即长度)。我正在评估文档一和文档二之间的余弦相似度:
from sklearn.metrics.pairwise import cosine_similarity
cosine_similarity(tfidf_matrix[0], tfidf_matrix[1])
结果为 1。请记住,当两个向量具有完全相同的方向时,两个向量之间的余弦相似度等于 1,当它们正交时为 0,当向量具有相反方向时为 -1。
在这种情况下,您可以看到余弦相似度不受文档长度的影响,并且捕获了原始文档中术语的相对分布相同的事实!如果您想将此信息表示为文档之间的“距离”,那么您可以简单地执行以下操作:
1 - cosine_similarity(tfidf_matrix[0], tfidf_matrix[1])
当文档相似时(无论它们的长度如何),该值将趋向于 0,而当它们不相似时,该值将趋向于 1。
关于python - 不同长度的 tf-idf 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39704220/
在我的Rails(2.3,Ruby1.8.7)应用程序中,我需要将字符串截断到一定长度。该字符串是unicode,在控制台中运行测试时,例如'א'.length,我意识到返回了双倍长度。我想要一个与编码无关的长度,以便对unicode字符串或latin1编码字符串进行相同的截断。我已经了解了Ruby的大部分unicode资料,但仍然有些一头雾水。应该如何解决这个问题? 最佳答案 Rails有一个返回多字节字符的mb_chars方法。试试unicode_string.mb_chars.slice(0,50)
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123
我有一个驼峰式字符串,例如:JustAString。我想按照以下规则形成长度为4的字符串:抓取所有大写字母;如果超过4个大写字母,只保留前4个;如果少于4个大写字母,则将最后大写字母后的字母大写并添加字母,直到长度变为4。以下是可能发生的3种情况:ThisIsMyString将产生TIMS(大写字母);ThisIsOneVeryLongString将产生TIOV(前4个大写字母);MyString将生成MSTR(大写字母+tr大写)。我设法用这个片段解决了前两种情况:str.scan(/[A-Z]/).first(4).join但是,我不太确定如何最好地修改上面的代码片段以处理最后一种
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
在Ruby1.9.3(可能还有更早的版本,不确定)中,我试图弄清楚为什么Ruby的String#split方法会给我某些结果。我得到的结果似乎与我的预期相反。这是一个例子:"abcabc".split("b")#=>["a","ca","c"]"abcabc".split("a")#=>["","bc","bc"]"abcabc".split("c")#=>["ab","ab"]在这里,第一个示例返回的正是我所期望的。但在第二个示例中,我很困惑为什么#split返回零长度字符串作为返回数组的第一个值。这是什么原因呢?这是我所期望的:"abcabc".split("a")#=>["bc"
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
我正在使用Ruby,我正在与一个网络端点通信,该端点在发送消息本身之前需要格式化“header”。header中的第一个字段必须是消息长度,它被定义为网络字节顺序中的2二进制字节消息长度。比如我的消息长度是1024。如何将1024表示为二进制双字节? 最佳答案 Ruby(以及Perl和Python等)中字节整理的标准工具是pack和unpack。ruby的packisinArray.您的长度应该是两个字节长,并且按网络字节顺序排列,这听起来像是n格式说明符的工作:n|Integer|16-bitunsigned,network(bi
matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o