Учитывая позицию индекса, как я могу выделить предложение, в котором находится эта позиция? - PullRequest
0 голосов
/ 10 октября 2018

Я использую JavaScript, и мой текст:

Dana's places, we're having people coming to us people wanna buy condos. They want to move quickly and we're just losing out on a lot of great places. Really what would you say this?

Если у меня позиция индекса 6, я хочу получить только первое предложение: Dana's places, we're having people coming to us people wanna buy condos.

Если у меня индексная позиция 80, я хочу получить только второе предложение: They want to move quickly and we're just losing out on a lot of great places.

Как я могу разобрать предложение на основе позиции?

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Если я правильно понимаю, вы сможете просто

Разделить по периодам.Получить длину строк.Определите, где индекс находится на основе длины предложения.

Учитывая, что вам нужно разделить на "?,!"Кроме того, вам просто нужно пройтись по предложениям и сгладить их дальше.Ака, снова разделить.

Честно говоря, возможно, чище использовать регулярное выражение и группу.

Вот версия регулярного выражения

    const paragraph = "Dana's places, we're having people coming to us people wanna buy condos. They want to move quickly and we're just losing out on a lot of great places. Really what would you say this?"


    /**
     * Finds sentence by character index
     * @param index 
     * @param paragraph 
     */
    function findSentenceByCharacterIndex(index, paragraph) {

        const regex = /([^.!?]*[.!?])/gm

        const matches = paragraph.match(regex);

        let cursor = 0;

        let sentenceFound;

        for (const sentence of matches) {

            sentenceFound = sentence;

            cursor += sentence.length;

            if( cursor > index )
            {
                break;
            }
        }

        return sentenceFound;
    }


    const found = findSentenceByCharacterIndex(5, paragraph);
0 голосов
/ 10 октября 2018

Вместо того, чтобы пытаться использовать Array.split, может быть лучше сделать какой-нибудь традиционный символьный анализ строки.Так как мы знаем, какой индекс мы ищем, мы можем просто посмотреть начало и конец предложения.

Как заканчивается предложение?Обычно с ., ! или ? - зная это, мы можем проверить эти символы и решить, какую часть строки мы должны вырезать и вернуть обратно в программу.Если перед выбранным нами индексом нет sentence enders (ae ?!. ), мы предполагаем, что начало строки является началом текущего предложения (0) - мы делаем то же самое после выбранногоиндекс, за исключением того, что мы присваиваем str.length, если после индекса нет конечного предложения.

let str = "Dana's places, we're having people coming to us people wanna buy condos. They want to move quickly and we're just losing out on a lot of great places. Really what would you say this?";

let getSentence = (ind, str) => {
  let beg, end, flag, sentenceEnder = ["!", ".", "?"];
  Array.from(str).forEach((c, c_index) => {
  if(c_index < ind && sentenceEnder.includes(c)) {
   beg = c_index + 1;
  }
    if (flag) return;
    if (c_index >= ind && sentenceEnder.includes(c)) {
      end = c_index;
      flag = true;
    }
  });
  end = end || str.length;
  beg = beg || 0;
  return str.slice(beg, end);
}

console.log(getSentence(10, str));
console.log(getSentence(80, str));
0 голосов
/ 10 октября 2018

Если вы разделите на периоды.Строковый объект имеет метод-прототип под названием split, который возвращает массив разделенной строки.В приведенном ниже примере str - это переменная, которая содержит вашу строку.

const str = 'first sentence. Second sentence. third sentence';
const sentences = str.split('.');
sentences[0] // first sentence
sentences[1] // second sentence, etc
...