3

我想提取一个完整的句子“。” 到 ”。” 到给定单词的文档中。因此,例如给定以下文本:

Dijkstra 的原始算法不使用最小优先级队列。对于图中的给定源顶点(节点),该算法会找到该顶点与所有其他顶点之间成本最低的路径(即最短路径)。一旦确定了到目标顶点的最短路径,它也可以用于通过停止算法来查找从单个顶点到单个目标顶点的最短路径的成本。

我想要包含“graph”的整个句子

对于图中的给定源顶点(节点),该算法会找到该顶点与所有其他顶点之间成本最低的路径(即最短路径)。

此外,如果它包含图形,则找到一种将起始句子包含在结果中的方法将很有用,因为它之前没有点。

4

4 回答 4

4

假设文本文件dijk实际上不包含任何换行符,您可以在 perl 中执行此操作:

perl -MLingua::EN::Sentence=get_sentences -ne '
print "$_\n" for grep { /graph/ } @{get_sentences($_)}' dijk

Lingua::EN::Sentence 模块足够智能,可以处理众所周知的缩写,如有必要,您可以添加自己的缩写。

输出:

For a given source vertex (node) in the graph, the algorithm finds the path with lowest cost (i.e. the shortest path) between that vertex and every other vertex.

如果输入中确实存在换行符,则应该可以轻松地调整脚本。


编辑

如果输入中有换行符,您可以这样做:

perl -MLingua::EN::Sentence=get_sentences -00 -e '
$t = <>;         # slurp the whole file
$t =~ tr{\n}{ }; # convert newlines to spaces
print "$_\n" for grep { /graph/ } @{get_sentences($t)}' dijk

当然,现在这看起来更像是一个成熟的 perl 脚本,而不是单行代码!

或者,正如@mklement0 所述,您可以使用外部工具tr执行翻译并将结果传递给原始脚本:

perl -MLingua::EN::Sentence=get_sentences -ne '
print "$_\n" for grep { /graph/ } @{get_sentences($_)}' <(tr '\n' ' ' < dijk)
于 2014-07-11T11:29:50.673 回答
1

粗略的启发式:

cat text |
    tr '\n' ' ' |
    sed 's|[[:alpha:]]\{3\}\.[[:blank:]]*|&\'$'\n''|g' |
    grep -Fi 'graph'
  • 首先,tr删除输入文件中的所有行尾(不知道您是否需要这样做)
  • 然后,sed将每个句子放在自己的行上,假设前面有三个字母的点表示句子的结尾。根据您的输入文件,您可能需要调整这部分以降低“误报”率
  • 最后,一个简单的grep将只保留包含所需单词的句子(不区分大小写)。

给定您的输入文件,这将产生以下结果:

对于图中的给定源顶点(节点),该算法会找到该顶点与所有其他顶点之间成本最低的路径(即最短路径)。


在mklement0 的帮助下,这个答案符合 POSIX 标准
(见下面的评论)

于 2014-07-11T10:39:56.677 回答
0

grep -o "\.([^.\r\n]+\.)" inputfile > outputfile

如果原始文件中没有换行符,则更简单一些:

grep -o "\.([^.]+\.)" inputfile > outputfile

于 2014-07-11T10:14:46.217 回答
0

这是一种方法。

tr '\n' ' ' < input.txt | tr '.' '\n' | grep graph > output.txt

它将所有换行符转换为空格(以便整个文本在一行上)。然后它将所有.s 转换为换行符,以便每行一个句子。然后它会搜索相关字符串并将匹配的句子放入输出文件中。

在您的段落上运行时,它有点工作,但.ini.e.混淆了它。这可以通过改变一些固定的字符串来纠正,比如i.e.and e.g.into ieand egfor the process。

于 2014-07-11T11:37:41.923 回答