unix语法_用于基本拼写错误检测的Unix管道

unix语法

介绍

当然,我们可以编写程序来执行大多数所需的操作,但是Unix命令行通常具有执行一系列有用操作所需的一切,而无需编写任何代码。 在今天的Applied NLP课堂上,我演示了如何通过一系列Unix管道从大量原始文本中获取高可信度字典,并且我在此处发布了内容,以便学生以后可以参考并看到一些内容。指向其他有用的Unix资源的指针。

注意:要获取有关任何命令的帮助,只需在Unix提示符下键入“ man <command>”。

检查拼写错误

我们正在将自动拼写更正作为一项课堂练习,并特别强调以下句子: 此Facebook应用显示她是tonw中最喜欢的acress,因此,这存在上下文拼写错误( 存在 ),可能是有效的英语单词,但不是( acress ),并且是违反英语发音模式( tonw )的错误。

拼写纠正的关键要素之一是已知在该语言中有效的单词词典。 假设我们在这里使用英语。 在大多数Unix系统上,您可以在/ usr / share / dict / words中找到英语词典,尽管您发现的单词可能因平台而异。 如果你不能找到任何东西在那里,有许多可用的单词列表在线,如检查出的单词表工程中的吨下载和链接。 我们可以轻松地使用字典和Unix来检查上述句子中没有出现在字典中的单词。 首先,将句子保存到文件中。

$ echo 'This Facebook app shows that she is there favorite acress in tonw' > sentence.txt

接下来,我们需要将唯一的单词类型(而不是标记)按字典顺序排序。 以下Unix管道可以完成此任务。

$ cat sentence.txt | tr ' ' '\n' | sort | uniq > words.txt

分解:

  • cat命令将文件溢出到标准输出。
  • tr命令将所有空格“翻译”为换行。 因此,这给我们每行一个字。
  • sort命令按字典顺序对行进行排序
  • uniq命令通过使相邻的重复项消失而使这些行成为uniq。 (这对于该特定句子不起作用,但是例如,如果您尝试其他具有多个“ the”类型标记的其他句子,则将其放在其中。)

您可以依次执行每个操作,逐步建立管道,从而看到这些效果。

$ cat sentence.txt
This Facebook app shows that she is there favorite acress in tonw
$ cat sentence.txt | tr ' ' '\n'
This
Facebook
app
shows
that
she
is
there
favorite
acress
in
tonw
$ cat sentence.txt | tr ' ' '\n' | sort
Facebook
This
acress
app
favorite
in
is
she
shows
that
there
tonw

现在,我们可以使用comm命令比较文件words.txt和字典。 它产生三列输出:第一列仅在第一个文件中提供行,第二列仅在第二个文件中提供行,第三列是相同的行。 因此,第一列具有我们所需要的,因为这些是我们句子中在词典中找不到的单词。 这是获得该命令的命令。

$ comm -23 words.txt /usr/share/dict/words
Facebook
This
acress
app
shows
tonw

-23选项表示我们应隐藏第2列和第3列,而仅显示第1列。如果仅使用-2 ,则得到句子中的单词,左边是非词典单词,右边是字典单词(尝试它)。

当然,问题在于任何单词列表都会有空白。 这本字典没有Facebookapp之类的最新名词。 它也没有大写的This。 您可以使用-i选项忽略comm的大小写,这样就消失了。 它没有表演,因为它是动词词干表演的一种变体形式,所以不在字典中。 我们可以通过一些形态学分析来解决此问题,但是,我们可以走一条懒惰路线,只抓住一大堆单词。

从语料库中提取高可信度词典

原始文本通常包含拼写错误,但是错误的发生频率不会很高,因此我们通常可以通过计算大量文本上的单词类型频率,然后应用合理的分界点来获得相当不错的扩展单词列表。 (还有许多更完善的方法,但这足以满足当前的需求。)

首先,让我们获取一些数据。 美国国家开放语料库刚刚发布了其手动批注子公司(MASC)的v3.0.0,您可以从此链接中获得。

http://www.anc.org/masc/MASC-3.0.0.tgz

请执行以下操作以获取并进行进一步处理:

$ mkdir masc
$ cd masc
$ wget http://www.anc.org/masc/MASC-3.0.0.tgz
$ tar xzf MASC-3.0.0.tgz

(如果没有wget ,则可以在浏览器中下载MASC文件,然后将其移到上方。)

接下来,我们需要来自data / write目录的所有文本。 find命令对此非常方便。

$ find data/written -name '*.txt' -exec cat {} \; > all-written.txt

要查看有多少,请使用wc命令。

$ wc all-written.txt
   43061  400169 2557685 all-written.txt

因此,有43k行和40万个令牌。 对于我们正在尝试的操作来说,这有点小,但是对于示例来说就足够了。

同样,我将建立一个Unix管道来从该语料库中提取高可信度单词类型。 我将使用head命令在每个阶段仅显示部分输出。

这是原始内容。

$ cat all-written.txt | head

I can't believe I wrote all that last year.
Acephalous

Friday, 07 May 2010

现在,每行得到一个单词。

$ cat all-written.txt | tr -cs 'A-Za-z' '\n' | head

I
can
t
believe
I
wrote
all
that
last

tr转换器的使用非常粗略:基本上,任何不是ASCII字母字符的东西都将换行。 -cs选项指示使用'A-Za-z'参数的补码(相反)并压缩重复项(例如A42,用一行新一行而不是三行变成A)。

接下来,我们像上面一样 uniq进行 排序 ,不同之处在于,我们使用-c选项对uniq进行计数,以便产生计数。

$ cat all-written.txt | tr -cs 'A-Za-z' '\n' | sort | uniq -c | head
   1
 737 A
  22 AA
   1 AAA
   1 AAF
   1 AAPs
  21 AB
   3 ABC
   1 ABDULWAHAB
   1 ABLE

由于MASC语料库包含推文和博客以及其他未编辑的文本,因此我们不信任计数低的单词,例如四个或更少的该类型标记。 我们可以使用awk将其过滤掉。

$ cat all-written.txt | tr -cs 'A-Za-z' '\n' | sort | uniq -c | awk '{ if($1>4) print $2 }' | head
A
AA
AB
ACR
ADDRESS
ADP
ADPNP
AER
AIG
ALAN

Awk使处理文件行变得容易,并为您提供了第一列($ 1),第二列($ 2)等的索引。 您可以做更多的事情,但这显示了如何使用awk有条件地从每行输出一些信息。

您当然可以更改阈值。 您还可以通过在管道中插入另一个tr调用来将所有单词变为小写,例如:

$ cat all-written.txt | tr 'A-Z' 'a-z' | tr -cs 'a-z' '\n' | sort | uniq -c | awk '{ if($1>8) print $2 }' | head
a
aa
ab
abandoned
abbey
ability
able
abnormal
abnormalities
aboard

一切都取决于您在文本中所需要的。

组合和使用字典

让我们对上面的句子进行检查,但同时使用标准字典和从MASC派生的字典。 首先运行以下命令。

$ cat all-written.txt | tr -cs 'A-Za-z' '\n' | sort | uniq -c | awk '{ if($1>4) print $2 }' > /tmp/masc_vocab.txt

然后在保存words.txt的目录中,执行以下操作。

$ cat /usr/share/dict/words /tmp/masc_vocab.txt | sort | uniq > big_vocab.txt
$ comm -23 words.txt big_vocab.txt
acress
tonw

- MASC语料库向我们提供了足够的其他示例单词, 这些单词, This,Facebook,appshows不再被检测为错误。 当然,将那里检测为错误要困难得多,并且需要语言模型等等。

结论

学习使用Unix命令行! 这篇文章只是您可以使用Unix管道完成许多有趣工作的开始。 以下是一些其他资源:

快乐(Unix)黑客!

参考: Bcomposes博客上的JCG合作伙伴 Jason Baldridge提供的 用于基本拼写错误检测的Unix管道

翻译自: https://www.javacodegeeks.com/2013/02/unix-pipelines-for-basic-spelling-error-detection.html

unix语法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值