getPhrases = {
const MAX = 5
const MIN = 2
const opts = { offset: true, terms: false }
let methods = [
(part) => part.splitBefore('#Preposition'),
(part) => part.splitBefore('#Conjunction'),
(part) => part.splitBefore('(if|which|so|then)'),
(part) => part.splitAfter('#Verb #Adverb+'),
(part) => part.splitBefore('#PresentTense to'),
(part) => part.splitAfter('#Value #Noun+'),
(part) => part.splitAfter('#ProperNoun+'),
(part) => part.splitBefore('#Possessive+'),
(part) => part.splitAfter('#Date+'),
(part) => part.splitBefore('#Pronoun'),
(part) => part.splitAfter('#Copula #Adverb+? #Adjective'),
(part) => part.splitAfter('[#Noun] #Verb', 0),
(part) => part.splitAfter('@hasComma'),
(part) => part.splitAfter('.{5}')
]
const splitOne = function (part) {
for (let i = 0; i < methods.length; i += 1) {
if (part.terms().length <= MAX) {
return part
}
part = methods[i](part)
}
return part
}
const splitList = function (list) {
let out = list.none()
list.forEach((part) => {
out = out.concat(splitOne(part))
})
return out
}
const joinSmalls = function (list) {
let out = list.none()
for (let i = 0; i < list.length; i += 1) {
let part = list.eq(i)
let beside = list.eq(i + 1)
if (part.terms().length < MIN && beside.found && beside.lookBefore('.').found) {
out = out.concat(part.append(beside))
i += 1
} else {
out = out.concat(part)
}
}
return out
}
const getPhrases = function (str) {
let doc = nlp(str)
let list = doc.clauses()
list = list.splitOn(doc.parentheses())
list = list.splitOn(doc.quotations())
list = splitList(list)
list = joinSmalls(list)
return list.json(opts)
}
return getPhrases
}