如果字符串列表不在里面,则获取两个字符串之间的字符串

本文关键字:字符串 之间 两个 获取 列表 在里面 如果 | 更新日期: 2023-09-27 18:30:45

希望标题不会太混乱。

我有一个目录,里面装满了包含故事的文件。只有当两个句子之间的字符串不包含另一个列表中包含的任何句子时,我才需要获取两个句子之间的字符串列表(始终向前)。每个故事。

例如,我有一个列表"大狗","她追了他",安妮咬了嘴唇"等等。

然后我有一个文件,它可能是一个包含谁知道什么的故事。我想找到"他跳到她身后"和"她吻了他"之间的字符串,但前提是它们之间的字符串不包含第一个列表中的任何句子,或者它们自己。

我已经找到了几种方法,但大多数方法都太慢了,做一个文件需要将近一个小时,我相信一定有更好更快的方法来做到这一点。请注意,我没有在此处添加它,因为我不想将解决方案限制在我正在做的事情上,这可能不是最好的方法。

如果字符串列表不在里面,则获取两个字符串之间的字符串

不确定您用来解决您所描述的问题的算法是什么,但在这种情况下我会这样做

预处理:

  • 确保任何空白字符序列都减少到一个(空格、制表符等)。
  • 使整个文本小写或大写。

过程:

  • 将所有标记的单词预加载到内存中(排序列表使用二进制搜索,理论上此过程应该只在第一次创建列表时消耗时间,继续对条目进行排序并以稍后可以加载的格式保留这些条目,任何进一步的添加都应该进行二叉搜索以确定单词是否在列表中并将条目放在相应的位置/插槽中)。
  • 将所有流行短语预加载到内存中(在这里我们可以使用与加载单词相同的方法)。
  • 通过文件,并保持与标记列表匹配的任何单词的偏移量/位置和长度。偏移量应该很长,只是为了考虑到大文件。
  • 查找标记的单词序列。第一个单词之后的任何匹配都是序列的候选者,因为我们删除了所有空白字符序列,因此我们确定 WordN 是序列的一部分,如果该单词的偏移量等于前一个单词的偏移量加上前一个单词长度加 1,这里的 1 表示分隔两个单词的空白字符。单词2偏移量 = 单词1偏移量 + 单词1长度 + 1。
  • 检查找到的任何序列是否与流行短语的开头或匹配匹配。

实施资产:

    单词
  • 一个简单的字符串就足以表示单词。所有单词必须以小写或大写形式存储。
  • 组件
  • :组件是一种结构,它保存一个单词和文件中找到它的文件的偏移量
  • 短语:是两个或多个组件的组合,一个简单的列表就足够了。
  • 一次读取一个字符的文件有助于快速确定单词和单词序列。例如,每个空格都意味着读取了一个新组件,基本上是一个单词,因此我们可以在那里使用 check,如果它匹配并且是第一个匹配,我们不知道它是否是序列的一部分,但是一旦我们读取了第二个或第三个单词并且我们知道是否匹配,我们可以检查当前偏移量是否遵循我们之前描述的规则。

检查阶段

  • 如果未标记任何字词,则不会匹配任何短语。几乎不可能,但谁知道呢。
  • 文件中的任何单词匹配序列都表示短语检查的候选项。
  • 检查单词
  • 长度和后面的单词内容,以检查流行语和候选短语之间的匹配项。在这里,您可以检查部分或整个短语是否匹配。

获取两个序列阶段之间的文本。

由于相位只是一个组件列表,我们只需要从第一个短语的最后一个单词的偏移量和长度之和到第二个短语的第一个单词的偏移量读取文件。

From = PhaseALastWordOffset + PhaseALastWordLength
To = PhaseBFirstWordOffset
内容 = StoryFile.readSegment(From, To);

希望对您有所帮助。