Простое обнаружение фраз с разделением по регулярному выражению фразы - PullRequest
2 голосов
/ 04 августа 2020

Я хотел бы разбить строку, например:

Ввод: Bangalore railway line of the Indian Railway. It comes under Nagpur division of the Central Railway.

Выход:

Bangalore 
railway 
line
Indian Railway 
comes
under 
Nagpur 
division
Central Railway

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

У меня проблемы с частью регулярного выражения: split(/(?=\s[a-z]|[A-Z]\s|\.)/)

Как мне заставить его разделить на сценарий «вода 'Музей Tor»?

export function splitByPhrase(text: string) {
  const outputFreq = text
    .split(/(?=\s[a-z]|[A-Z]\s|\.)/)
    .filter(Boolean)
    .map((x) => x.replace(/[.,\/#!$%\^&\*;:{}=\-_`~()]/g, "").trim())
    .filter((x) => !stopWords.includes(x));

  return outputFreq;
}

describe("phrases", () => {
  it("no punctuation", () => {
    expect(splitByPhrase("test. Toronto")).toEqual(["test", "Toronto"]);
  });
  it("no spaces", () => {
    expect(splitByPhrase(" test Toronto ")).toEqual(["test", "Toronto"]);
  });
  it("simple phrase detection", () => {
    expect(splitByPhrase(" water Tor Museum wants")).toEqual(["water", "Tor Museum", "wants"]);
  });
  it("remove stop words", () => {
    expect(splitByPhrase("Toronto a Museum with")).toEqual(["Toronto", "Museum"]);
  });
});

Ответы [ 2 ]

1 голос
/ 04 августа 2020

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

(?= [a-z]|\.|(?<!\b[A-Z][a-z]*) (?=[A-Z]))

Regex демо

const stopWords = [
  "of", "The", "It", "the", "a", "with"
];

function splitByPhrase(text) {
  return text
    .split(/(?= [a-z]|\.|(?<!\b[A-Z][a-z]*) (?=[A-Z]))/)
    .map((x) => x.replace(/[.,\/#!$%^&*;:{}=_`~()-]/g, "").trim())
    .filter((x) => !stopWords.includes(x)).filter(Boolean);
}

[
  "Bangalore railway line of the Indian Railway. It comes under Nagpur division of the Central Railway.",
  "test. Toronto",
  " test Toronto ",
  " water Tor Museum wants",
  "Toronto a Museum with"
].forEach(i => console.log(splitByPhrase(i)));
1 голос
/ 04 августа 2020

В случае разрезания слова в нижнем регистре перед словом в верхнем регистре, я думаю, что split(\s(?=[a-z]|[A-Z]\w+ |\.)) работает для того, что вы хотите.

https://regexr.com/59jfo

Ввод: Bangalore railway line of the Indian Railway. It comes under Nagpur division of the Central Railway.

Выход:

Bangalore
railway
line
of
the
Indian Railway.
It
comes
under
Nagpur
division
of
the
Central Railway.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...