Notepad ++将标记的文本字符串移动到excel

时间:2014-01-17 21:59:28

标签: regex text notepad++ text-mining excel-2013

因此,对于一个侧面的爱好,我正在使用项目Gutenberg版本的希罗多德的文本挖掘进行一些基本的元数据收集,但我仍然坚持将标记的文本字符串转换为excel。基本上我要做的是创建是希罗多德中提到的所有人,地点和群组/组织的主列表,以及文本中提到的每个人的次数。我想使用此列表在Tableau和/或Powerview中填充一些数据可视化,我有两个。

我已经通过斯坦福NER运行了该文本,该文本至少可以识别几乎所有的人员,组织和地点。然后,我在notepadd ++中手动检查文档,以修复NER在分析古希腊名称和地点时所犯的大量错误。我还从文本中删除了脚注,因为我不关心它们,只关注原始文本。如果您下载附加的.txt,您将看到每个专有名词都标记为/ PERSON,/ LOCATION或/ ORGANIZATION。

现在我陷入困境的是试图将标记的文本字符串转换为excel,以便我可以使用这些数据。一个简单的ctr + f显示,在book1中,有880个/ PERSON标记的单词。基本上我要做的是抓住每个/ PERSON,/ LOCATION或/ ORGANIZATION之前的字符串并将它们复制到excel中。

我查看了notepad ++的Regex表达式,看看我是否可以选择字符串以/ PERSON结尾的所有文本字符串,但我似乎无法弄明白。我可以让正则表达式选择所有“/ PERSON”但我不能理解正则表达式,如果有意义的话,它可以完整地选择所有“name / PERSON”或“place / LOCATION”字符串。

编辑:我忘了询问使用SQL或Python来帮助我解决这个问题。从我的工作中我熟悉在数据库上使用SQL查询。所以这是一个愚蠢的问题,但你甚至可以使用SQL直接查询.txt文件?如果是这样,那么我可以很容易地编写一个SQL语句来提取标记的文本字符串。

我对Python不熟悉,但有可能通过一些python脚本提取我正在寻找的信息吗?

最后我应该在原始问题中提出这个问题。我错了吗?我认为使用Notepad ++来纠正斯坦福NER标签是必要的,但可能直接从标记的.txt到excel是错误的方法。

https://www.dropbox.com/s/k5m8yag6tpae05w/HerodotusB1NER.txt

2ND编辑:所以我终于开始玩你提供的正则表达式,他们几乎完美地工作。但是,我认为它实际上削减了一些结果集。

一个完美的例子是在运行正则表达式搜索后,正在被修剪成“okes / PERSON”的角色“Deïokes”。我认为正则表达式的a-z部分忽略了像Deïokes中的变形金刚一样的特殊字母。

我如何调整正则表达式搜索以容忍那些特殊字符?如果正则表达式不能容纳那些特殊字符,那么我认为进入并修复它们出现在那里的特殊字符并不会过于人工密集。

3 个答案:

答案 0 :(得分:1)

即使您设法使用Notepad ++搜索/替换所有这些名称,我也不知道您打算如何将它们一个一个地复制到Excel。由于SO主要是关于编程,我将提供代码解决方案。这是Perl,如果您不知道它是如何工作的或如何运行它,请不要绝望。无论如何,它可能不是Windows的首选语言。你可以用任何编程语言来构建它。

#!/usr/bin/perl
use strictures;
use Data::Dump;

my $counts;

while (my $row = <DATA>) {
  while ($row =~ m{\b(\w+)/([A-Z]+)}g) {
    $counts->{$2}->{$1}++;
  }
}

dd $counts;
__DATA__
This is the Showing forth of the Inquiry of Herodotus/PERSON of Halicarnassos/LOCATION,

第一段的输出:

{
  LOCATION => { Halicarnassos => 1 },
  ORGANIZATION => { Barbarians => 1, Hellenes => 1 },
  PERSON => { Herodotus => 1 },
}

让我们从底部的__DATA__部分开始。我在那里粘贴了你的完整文本文件,但出于实际原因在这里省略了它。基本上它只是在第一个while循环中逐行读取文件。第二个while循环将正则表达式匹配应用于/g修饰符的每一行,使正则表达式匹配多次。 The pattern means

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  \b                       the boundary between a word char (\w) and
                           something that is not a word char
--------------------------------------------------------------------------------
  (                        group and capture to \1:
--------------------------------------------------------------------------------
    \w+                      word characters (a-z, A-Z, 0-9, _) (1 or
                             more times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )                        end of \1
--------------------------------------------------------------------------------
  /                        '/'
--------------------------------------------------------------------------------
  (                        group and capture to \2:
--------------------------------------------------------------------------------
    [A-Z]+                   any character of: 'A' to 'Z' (1 or more
                             times (matching the most amount
                             possible))
--------------------------------------------------------------------------------
  )                        end of \2

两个捕获组(..)最终位于变量$1$2中。对于找到的每个单词,我们在数据结构$counts中计算一个值。这就像SQL中的GROUP BY计数一样。第一个键($2)是类型(PERSONLOCATION ...),第二个键是实际的词。 ++运算符递增1。

当我们完成后,我们使用Data :: Dump模块的函数dd打印它,它给我们一个很好的按类型分组的计数输出。


感谢您对我这个小小的技术前课程表示感谢。如果它太技术化,请尝试使用优秀的javascript regex工具regex101.com,where I set it up for you。您应该能够从那里复制/粘贴到Excel。我建议使用一个浏览器插件来复制表格列。

答案 1 :(得分:0)

为什么不只提取实际名称:[a-zA-Z]+?(?=\/PERSON)?如果您希望/ PERSON也匹配,请删除(?=)

您甚至可以使用:([a-zA-Z]+?)\/([A-Z]+)将所有内容提取到群组中。然后,您可以输出所需的捕获组。在任何体面的文本编辑器(如SublimeText)中,您可以找到[\s\S]*?([a-zA-Z]+?)\/([A-Z]+)[\s\S]*?并替换为{ $2: $1 },,例如,以创建一个很好的JS对象数组。

答案 2 :(得分:0)

我再试一次,发现了一个非常简单的解决方案,只需将内容复制到Excel即可。我没有Notepad ++,但如果我的IDE不在,我偶尔会使用PSPad。它提供与Notepad ++几乎相同的功能。有些东西它做得更好而有些东西却做得不好。正则表达式搜索非常好,搜索对话框中有一个按钮,显示复制

Find dialogue

我复制了你的文件,并在没有捕获组的情况下从其他答案中使用了我的正则表达式。我们不需要它们,因为它会复制完整的匹配。请记住,\b是一个单词边界,而不是一个将被复制的真实字符。

Copied search results

瞧,我们走了。一个名称列表,其分类应该很容易复制到Excel并在那里拆分成列。