【问题标题】:How to deconstruct a sentence into all possible sub-sentences如何将一个句子解构为所有可能的子句
【发布时间】:2021-04-29 09:39:21
【问题描述】:

如果找不到完整的子句,我有一段代码可以在 Wikipedia 上查找子句。 我对数组切片的理解是,负的 n 参数将从末尾开始,而不是从数组的乞求开始。所以我想我可以在上面做一些 ZigZag 迭代。但是我错了。有人能指出我正确的方向吗?

所以我这样做了:

function splitwords (words, i=0) {
  const parts = words.split(` `);
  const wordcount = parts.length;

  let index = i%((wordcount-1)*2)-(wordcount-1); //zigzag
  let par = parts.slice(index);

  return par;
} 

for (let = 0; i < 10, i++) {
  splitwords('Fresh Prince of Bel Air', i) 
}

我的目标是:

Input: 

Fresh Prince of Bel Air

Output:

      Prince of Bel Air
             of Bel Air
                Bel Air
Fresh Prince of Bel
Fresh Prince of
Fresh Prince
Fresh
      Prince
             of
                Bel
                    Air

PS:我对.slice() 有什么误解?

【问题讨论】:

  • 确保监控index的值。 slice 就像你说的那样工作(虽然你不使用它的第二个参数),但你需要调试......并检查变量。另外:您想要的输出不包括“所有可能的子句”。只列出这些的逻辑是什么?
  • @trincot 我实际上是这样做的,我只是在示例中错误地删除了它,谢谢你得到它。例如,您关于没有所有可能性的权利“贝尔王子”就没有了。在我的情况下,它可以认为,如果函数会返回它,那也很好,但肯定是在 6 个第一个输出之后。

标签: javascript algorithm


【解决方案1】:

所以你想要一个单词列表的所有可能切片?

function *allSlices(a) {
    for (let i = 0; i < a.length; i++)
        for (let k = i + 1; k < a.length + 1; k++)
            yield a.slice(i, k)
}

let words = 'Fresh Prince of Bel Air'.split(' ')

for (let s of allSlices(words))
    console.log(...s)

如果您需要它们以不同的顺序,将附加逻辑保留在生成器函数之外会更容易,例如:

// get all slices first
let slices = [...allSlices(words)]

// use only those that start with the 2nd word
let test = slices.filter(s => s[0] === words[1])

【讨论】:

  • 哇非常优雅。是的,但是:我不需要整个句子,它应该开始切断前面的单词。 (英语有形容词在前的倾向,所以想找句中的宾语)
  • 我不是这个意思。在查找“新鲜的贝尔王子”之前,我需要查找“贝尔艾尔王子”。伟大的功能思想。通过阅读我学到了很多东西。以前从未使用过生成器函数。
  • @meo:你将不得不举更多的例子,因为我并没有真正掌握这里的逻辑。比如,给定A B C D E F G H,其中 A、B、C 是单词,期望的迭代顺序是什么?
  • 你是个野兽!!! B C D E F G H, C D E F G H, D E F G H, E F G H, E F G H, F G H, G H 然后只有B C D E F G, B C D E F, B C D E等,,,>
  • PS:@nirazul 解决方案的输出顺序正确。
【解决方案2】:

虽然它不是最漂亮或性能最好的代码,但它可以解决问题并且易于理解:

const str = "Fresh Prince of Bel Air"
const arr = str.split(' ')
const min = 2
const result = new Set()

// Loop twice for end and start point choice
for (var i = arr.length; i >= min; i--) {
  for (var j = 1; j <= i - min; j++) {
    result.add(arr.slice(j, i).join(' '))
  }
}

// Loop to cut at the end
for (var k = arr.length - 1; k >= min; k--) {
  result.add(arr.slice(0, k).join(' '))
}

// Add all separate words
arr.forEach(item => result.add(item))

for (let item of result) console.log(item);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多