在字符串中查找句子的开头

Posted

技术标签:

【中文标题】在字符串中查找句子的开头【英文标题】:Find beginning of sentence in String 【发布时间】:2010-09-16 12:43:27 【问题描述】:

我想在带有标题和简短描述的网站中显示搜索查询的结果。简短描述应该是包含搜索词的页面的一小部分。我想做的是: 1 在页面中去除标签 2 找到seachterm的第一个位置 3 从那个位置,回去找到那个句子的开头(如果有的话)。 4 从第 3 步中找到的位置开始并显示即从那里开始的 200 个字符

第 3 步我需要一些帮助。我想我需要一个正则表达式来找到第一个大写字母或点...

【问题讨论】:

【参考方案1】:

即使这样最终也会失败。给定句子“我们去了史密斯博士的办公室”,如果您的搜索词是“办公室”,那么您使用的几乎任何标准都会将“史密斯办公室”作为您的句子。

【讨论】:

我发布了对策略的细微改动...你能看到其中的任何错误吗?【参考方案2】:

我会这样做,我会解析页面...

    跳过所有以'

    当您遇到“.”时或 [A-Z],开始将其放入缓冲区,直到找到另一个“。”

    如果缓冲的字符串有搜索关键字,那就是你的字符串!别的。在“。”处开始缓冲你遇到过并重复。

编辑:正如 James Curran 指出的那样,这种策略在某些情况下会失败......所以解决方案如下:

你可以做的是从页面开始(标签之后)开始X个字符

然后搜索您的关键字,缓冲前两个单词。当你找到它时, 做这样的事情:X ... prev-2 next-2

例子:这个星球有——或者更确切地说有——一个问题,那就是:大多数生活在它上面的人在相当长的时间里都不快乐。针对这个问题提出了许多解决方案,但其中大多数主要关注绿色小纸片的运动,这很奇怪,因为总的来说不是绿色小纸片不开心。

搜索关键字:“建议”

结果:这个星球有 - 或者说有 - 一个问题......许多解决方案 建议 这个问题......

【讨论】:

【参考方案3】:

对于第 3 步:如果您反转结束您想要向后搜索的子字符串,则获取第一个 '.' 的位置。并从搜索字符串的位置子跟踪该值。

$offset = stripos( strrev(substr($string, $searchlocation)), '.');
$startloc = $searchlocation - $offset;
$finalstring = substr($string, $startloc, 200);

这可能会偏离 1,但我认为它会完成工作。似乎应该有更短的方法。

【讨论】:

James Curran 的回答也适用于此,这对于 Smith 博士的办公室来说仍然会失败。【参考方案4】:

我认为与其尝试查找句子,不如考虑我在单词中需要的搜索词周围的上下文量。然后倒退这个单词数量的一部分(或回到开头)并转发剩余的单词数量以选择上下文的其余部分。这样,您只需在空格上拆分整个语料库,找到第一次出现的术语(可能使用模糊匹配来查找子术语并考虑标点符号),然后应用上述算法。如果第一个未选择的术语没有以标点符号等结尾,您甚至可以创造性地引入省略号。

【讨论】:

以上是关于在字符串中查找句子的开头的主要内容,如果未能解决你的问题,请参考以下文章

如何编写一个函数,将句子中每个单词开头的所有辅音字符串转换为“r”,直到它变成元音?

检测句子开头的双空格[关闭]

匹配字符串开头的字符串

Lua - 使用 string.find 查找句子?

在Oracle中查找以字母数字开头的字符串

在字符串中查找特定单词的位置