我想提取一个完整的句子“。”把“。”写成一个单词的文件。 例如,给出了这个文本:
Dijkstra的原始算法不使用最小优先级队列。为一个 给定图中的源顶点(节点),算法找到路径 在该顶点和顶点之间具有最低成本(即最短路径) 每隔一个顶点。它也可以用于寻找最短的成本 通过停止从单个顶点到单个目标顶点的路径 算法一旦到达目标顶点的最短路径就具有 已经确定。
我想要包含“graph”的整个句子
对于图中给定的源顶点(节点),算法会找到 该顶点之间成本最低(即最短路径)的路径 和其他每个顶点。
如果它包含图形,那么找到一种在结果中包含起始句子的方法会很有用,因为它之前没有点。
答案 0 :(得分:3)
假设文本文件dijk
实际上并不包含任何换行符,您可以在perl中执行此操作:
perl -MLingua::EN::Sentence=get_sentences -ne '
print "$_\n" for grep { /graph/ } @{get_sentences($_)}' dijk
Lingua::EN::Sentence module非常聪明,可以处理众所周知的缩写,如果需要,您可以添加自己的缩写。
输出:
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)
答案 1 :(得分:1)
原始启发式:
cat text |
tr '\n' ' ' |
sed 's|[[:alpha:]]\{3\}\.[[:blank:]]*|&\'$'\n''|g' |
grep -Fi 'graph'
tr
删除输入文件中的所有行尾(不知道您是否需要这样做)sed
将每个句子放在自己的行上,假设一个前面有三个字母的点表示句子的结尾。根据您的输入文件,您可能需要调整此部分以降低&#34;误报&#34;率grep
将只保留包含所需单词的句子(不区分大小写)。根据您的输入文件,这将产生以下结果:
对于图中给定的源顶点(节点),算法找到该顶点与每个其他顶点之间成本最低(即最短路径)的路径。
这个答案已经与 mklement0 的帮助符合POSIX标准
(见下面的评论)
答案 2 :(得分:0)
grep -o "\.([^.\r\n]+\.)" inputfile > outputfile
如果原始文件中没有换行符,那么它会更简单:
grep -o "\.([^.]+\.)" inputfile > outputfile
答案 3 :(得分:0)
这是一种方法。
tr '\n' ' ' < input.txt | tr '.' '\n' | grep graph > output.txt
它将所有换行转换为空格(以便整个文本在一行中)。然后它将所有.
转换为换行符,以便每行一个句子。然后greps查找相关字符串并将匹配的句子放入输出文件中。
在您的段落上运行时,它会有效,但.
中的i.e.
会混淆它。这可以通过将一些固定字符串(例如i.e.
和e.g.
)更改为ie
和eg
来进行纠正。