类似 Wordle 的词云

类似 Wordle 的词云

沃德尔根据文本中单词的频率创建词云,类似于标签云。它的独特之处在于它可以在任意方向上布局单词,而不会留出太多空白。请参阅画廊举许多例子。

给定一个单词列表及其频率,是否有一些软件包可以提供 (La)TeX 中的至少部分功能?如果没有,是否有某种方法可以滥用 TeX 布局引擎来生成词云?

(这并不是为 wordle 做广告,我只是不知道有任何类似的东西。)

答案1

大多数词云生成器只是根据文本中的相对频率生成一个缩放的单词,然后以一种很好的方式将所有内容打包在一起。Wordle 真正出色的地方在于使用形状每个字母的宽度,而不是边界框。这就是生成的词云中空白空间非常小的原因。

据我所知,TeX 只知道单词的边界框。因此,即使知道 wordle 算法(是吗?),我们也需要更多钩子来在 TeX 中实现它。也许可以使用 luatex+mplib 来访问字形的形状,但我不知道细节。

更简单的选择是使用 worldle 生成 png,然后将 png 包含在您的 tex 文件中。支持 wordle 的引擎的 java 文件可从以下位置获取http://www.alphaworks.ibm.com/tech/wordcloud(您需要先注册)。然后,只需提供一些管道,以便

\begin{wordle}
  lots of text
\end{wordle}

将文本存储在外部文件中,通过 wordle 运行,并包含生成的 png。例如,如果您想在 ConTeXt 中执行此操作

  1. 下载 IBM Word Cloud 引擎。解压文件后,我删除了文件夹名称中的空格,并将其重命名为“IBM-Word-Cloud”。

  2. 下载外部过滤器模块

  3. 然后你可以按如下方式创建词云

    \usemodule[过滤器]

    \定义外部过滤器
      [词云]
      [filtercommand=/opt/java/jre/bin/java -jar $HOME/IBM-Word-Cloud/ibm-word-cloud.jar
        -c $HOME/IBM-Word-Cloud/示例/configuration.txt
        -w 800-h 600
        -o \外部过滤器输出文件\空间
        -i \外部过滤器输入文件,
      输出=\externalfilterbasefile.png,
      读取命令=\ExternalFigure,
      继续=是,
      ]

    \def\外部图#1{\外部图[#1]}

然后使用

 \startwordcloud
  lots of words
 \stopwordcloud

看到这个博客文章更多细节。

答案2

这是我的第一篇帖子。昨天我看到了这个问题,并编写了一些 PERL 代码。我知道这与你想要的并不完全相同,而且我知道用 TeX 来做会更好,但也许这对某些人来说很有用。它有两个选项:

  • 制作索引条目的词云:

    ./latextotagcloud.pl index file.tex > file.html

  • 制作引用作者的词云:

    ./latextotagcloud.pl citea file.tex > file.html

  • 制作引用文档的词云:

    ./latextotagcloud.pl cited file.tex > file.html

新代码 (v 2.0) 更新于 2011 年 10 月 18 日 这个新代码允许彩色图像 我喜欢它们,因为小单词可以通过其颜色突出显示。我在单色云中看到长单词因其宽度而引人注目。

#!/usr/bin/perl -w
#v. 2.0
#(c) Xavier de Blas, 2011. This code is GPL 2.0.
use HTML::TagCloud_colors;

#recommended:
$background = "#ffffff"; $color_small ="#333333"; $color_big ="#ff0000";

#alternatives
#$background = "#000066"; $color_small ="white"; $color_big ="red";
#$background = "#ffffff"; $color_small ="#333333"; $color_big ="blue";

if( @ARGV != 2 or ( $ARGV[0] ne "index" and $ARGV[0] ne "citea" and $ARGV[0] ne "cited") ) {
  print STDERR "Usage:\n ./latextotagcloud.pl option file.tex > file.html     \n(option: index or citea or cited)\n";
  exit(0);
}
$option = shift(@ARGV);
open(IN,shift(@ARGV));
undef $/;
while(<IN>) {
  if($option eq "index") {
  while($_ =~ /\\index{([^@!}\|]*)([^}]*)}/g) {
#   while($_ =~ /\\index{([^!}\|]*)([^}]*)}/g) {        
      $matched = $1;
      unless ($2 =~ m/^\|see/) { #don't use the "see other concept" entries
        $matched =~ s/ /-/g;     #Converts: Index A B -> Index-A-B
#        if($matched =~ m/@/) { ($matchedSorting, $matched)=split(/@    /,$matched); }
        $seen{$matched}++;
        }
    }
  } elsif($option eq "citea") {
      #next line gets "Bosco" in "Bosco1993", but "W3Schools" is written to match "W3Schools2001"
      while($_ =~ /\\cite[^{]*{(W3Schools|[A-Za-z'\-]+)[^}]*}/g) {
        $seen{$1}++;
      }
  } elsif($option eq "cited") {
  while($_ =~ /\\cite[^{]*{([A-Za-z0-9'\-]+)[^}]*}/g) {
    $seen{$1}++;
  }
  }
}
print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
print "<style type=\"text/css\">\n  \@import       url(latextotagcloud.css);\n</style>";

$maxLevels = 1;
foreach(keys %seen) {
        if($seen{$_} > $maxLevels) { $maxLevels = $seen{$_}; }
}
my $cloud = HTML::TagCloud->new(levels=>$maxLevels);
foreach(sort keys %seen) {
        $latinized = $_;
        $latinized =~ s/'a/á/g;
        $latinized =~ s/'e/é/g;
        $latinized =~ s/'i/í/g;
        $latinized =~ s/'o/ó/g;
        $latinized =~ s/'u/ú/g;
        $cloud->add("$latinized", "", $seen{$_});
}


print $cloud->html_and_css();#if put a value, limit to that number of tags

open RFILE,">colors.R";
print RFILE "as.data.frame(colorRampPalette(c('$color_small', '$color_big'))($maxLevels+1))";   #ELMILLOR
close RFILE;

system("R CMD BATCH --slave --no-timing colors.R latextotagcloud_pre.css");

open CSSFILE1,"latextotagcloud_pre.css";
open CSSFILE2,">latextotagcloud.css";

$/="\n";
$line = 0;
print CSSFILE2 "<style type=\"text/css\">\n
#htmltagcloud {
  text-align:  center;
  line-height: 1; 
}
body { background: $background; } 
";

while(<CSSFILE1>){
        unless($line == 0) {
                $_ =~ /#(......)/;
                print CSSFILE2 "span.tagcloud" . ($line-1) ." a {text-decoration: none; color: #$1;}\n";
        }
        $line ++;
}
print CSSFILE2 "</style>";

close CSSFILE1;
close CSSFILE2;

这是旧代码(v 1.0),请勿使用!

#!/usr/bin/perl -w
#(c) Xavier de Blas, 2011. This code is GPL 2.0.
use HTML::TagCloud;

if( @ARGV != 2 or ( $ARGV[0] ne "index" and $ARGV[0] ne "citea" and $ARGV[0] ne "cited") ) {
  print STDERR "Usage:\n ./latextotagcloud.pl option file.tex > file.html \n(option: index or citea or cited)\n";
  exit(0);
}
$option = shift(@ARGV);
open(IN,shift(@ARGV));
undef $/;
while(<IN>) {
  if($option eq "index") {
    while($_ =~ /\\index{([^@!}\|]*)[^}]*}/g) {
      ($underscored = $1) =~ s/ /_/g;   #Converts: Index A B -> Index_A_B
      $seen{$underscored}++;
    }
  } elsif($option eq "citea") {
      #next line gets "Bosco" in "Bosco1993", but "W3Schools" is written to match "W3Schools2001"
      while($_ =~ /\\cite[^{]*{(W3Schools|[A-Za-z\-]+)[^}]*}/g) {
        $seen{$1}++;
      }
  } elsif($option eq "cited") {
      while($_ =~ /\\cite[^{]*{([A-Za-z0-9\-]+)[^}]*}/g) {
        $seen{$1}++;
      }
  }
}
my $cloud = HTML::TagCloud->new();
foreach(sort keys %seen) { $cloud->add("$_", "", $seen{$_}); }
print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
print $cloud->html_and_css();

保存在名为的文件中:

latextotagcloud.pl

然后执行:

chmod +x latextotagcloud.pl

您需要安装 libhtml-tagcloud-perl(显然还有 perl)。

使用新的 2.0 代码,您将需要安装 R(例如在 debian/ubuntu 系统上安装 r-base)使用新的 2.0 代码,您还需要修改 libtagcloud。Debian/Ubuntu 说明:

  1. dpkg -L libhtml-tagcloud-perl
  2. 查找:TagCloud.pm
  3. 在 Linux Mint(Debian/Ubuntu)中位于:/usr/share/perl5/HTML/TagCloud.pm
  4. 转到 /usr/share/perl5/HTML 并复制文件:
  5. sudo cp TagCloud.pm TagCloud_colors.pm
  6. 在 TagCloud_colors 中更改此项:
foreach my $level (0 .. $self->{levels}) {
  my $font = 12 + $level; 

对此:

my $fontMin = 12; 
my $fontMax = 36;
my $fontRang = $fontMax - $fontMin; 
foreach my $level (0 .. $self->{levels}) {
  #my $font = 12 + $level;    
  my $font = $fontMin + ( $fontRang * $level / $self->{levels} );  

这样,您将拥有一个 html 云,为了让它在您的文档中看起来更美观,您可以:

  1. 在浏览器中打开,打印为 PDF。
  2. 在 Inkscape 中打开 PDF,选择所有单词(截断空白纸)、属性(调整到选择),打印为 PDF。
  3. 在您的 LaTeX 或 LyX 文档中包含 PDF。

这是今天我的博士论文(v1.0)中引用的作者的结果:

在此处输入图片描述

(v2.0)的结果:

在此处输入图片描述

在此处输入图片描述

也许您可以使用相同的方法并连接到 Wordle,我没有这样做,因为 Worlde 不是免费软件。

希望能帮助到你

答案3

由于 wordle 似乎很难找到,所以这里是另一个(非 LaTeX)工具创建可供下载的精美图像。它非常可定制(您可以为文本定义多个方向,并选择字体、大小动态、螺旋形状、字数……)

它基于开源d3-云算法原理解释这里,以防有人想尝试在 Tikz 中实现它 ^^

例子:

在此处输入图片描述

在此处输入图片描述

相关内容