analyze-desumasu-dearu
Advanced tools
Comparing version 3.0.4 to 3.1.0
@@ -29,2 +29,11 @@ // LICENSE : MIT | ||
/** | ||
* デフォルトのオプション値 | ||
* @type {{ignoreConjunction: boolean}} | ||
*/ | ||
var defaultOptions = { | ||
// 接続的な "である" を無視する | ||
// e.g.) 今日はいい天気であるが明日はどうなるかは分からない。 | ||
ignoreConjunction: false | ||
}; | ||
/** | ||
* Type enum | ||
@@ -53,4 +62,50 @@ * @type {{desu: string, dearu: string}} | ||
} | ||
/** | ||
* | ||
* tokenが文末のtokenなのかどうか | ||
* 文末とは"。"やこれ以上後ろにtokenがないケースを示す | ||
* @param {AnalyzedToken} targetToken | ||
* @param allTokens | ||
* @returns {boolean} | ||
*/ | ||
var isLastToken = function isLastToken(targetToken, allTokens) { | ||
var nextPunctureToken = findNextPunctureToken(targetToken, allTokens); | ||
if (nextPunctureToken === undefined) { | ||
return true; | ||
} | ||
var nextPunctureTokenSurface = nextPunctureToken.surface_form; | ||
if (/[\!\?!?。]/.test(nextPunctureTokenSurface)) { | ||
return true; | ||
} | ||
}; | ||
/** | ||
* targetTokenより後ろにあるtokenから切り口となるtokenを探す | ||
* @param targetToken | ||
* @param allTokens | ||
* @returns {AnalyzedToken|undefined} | ||
*/ | ||
var findNextPunctureToken = function findNextPunctureToken(targetToken, allTokens) { | ||
var PUNCTUATION = /、|。/; | ||
var CONJUGATED_TYPE = /特殊/; | ||
var indexOfTargetToken = allTokens.indexOf(targetToken); | ||
// value is collection of these tokens: [ {target}, token, token, nextTarget|PunctuationToken ] | ||
var postTokens = allTokens.slice(indexOfTargetToken + 1); | ||
return find(postTokens, function (token) { | ||
// 接続、末尾なので切る | ||
if (PUNCTUATION.test(token["surface_form"])) { | ||
return true; | ||
} | ||
// 次の特殊・がきたら | ||
if (CONJUGATED_TYPE.test(token["conjugated_type"])) { | ||
return true; | ||
} | ||
// 明示的なtokenがない場合は、名詞がきたらそこで切ってしまう | ||
if (token["pos"] === "名詞") { | ||
return true; | ||
} | ||
return false; | ||
}); | ||
}; | ||
/** | ||
* tokensからAnalyzedTokenにmapを作る | ||
* @param {AnalyzedToken[]}tokens | ||
@@ -65,20 +120,4 @@ * @returns {function(token: AnalyzedToken)} | ||
return function mapTokenToAnalyzedResult(token) { | ||
var PUNCTUATION = /、|。/; | ||
var CONJUGATED_TYPE = /特殊/; | ||
var indexOfTargetToken = tokens.indexOf(token); | ||
// value is collection of these tokens: [ {target}, token, token, nextTarget|PunctuationToken ] | ||
var postTokens = tokens.slice(indexOfTargetToken + 1); | ||
var nextPunctureToken = find(postTokens, function (token) { | ||
if (PUNCTUATION.test(token["surface_form"])) { | ||
return true; | ||
} | ||
if (CONJUGATED_TYPE.test(token["conjugated_type"])) { | ||
return true; | ||
} | ||
// 明示的なtokenがない場合は、名詞がきたらそこで切ってしまう | ||
if (token["pos"] === "名詞") { | ||
return true; | ||
} | ||
return false; | ||
}); | ||
var nextPunctureToken = findNextPunctureToken(token, tokens); | ||
// if has not next token, use between token <--> last. | ||
@@ -105,6 +144,10 @@ var nextTokenIndex = nextPunctureToken ? tokens.indexOf(nextPunctureToken) : tokens.length; | ||
* `text`から敬体(ですます調)と常体(である調)を取り出した結果を返します。 | ||
* @param text | ||
* @param {string} text | ||
* @param {Object} options | ||
* @returns {Promise.<AnalyzedResultObject[]>} | ||
*/ | ||
function analyze(text) { | ||
var options = arguments.length <= 1 || arguments[1] === undefined ? defaultOptions : arguments[1]; | ||
var ignoreConjunction = options.ignoreConjunction !== undefined ? options.ignoreConjunction : defaultOptions.ignoreConjunction; | ||
return getTokenizer().then(function (tokenizer) { | ||
@@ -118,5 +161,11 @@ var tokens = _tokensCacheMap[text] ? _tokensCacheMap[text] : tokenizer.tokenizeForSentence(text); | ||
if (conjugatedType === Types.dearu) { | ||
// "である" を取り出す。この時点では接続なのか末尾なのかは区別できない | ||
if (token["pos"] === "助動詞" && token["conjugated_form"] === "連用形") { | ||
if (nextToken && nextToken["conjugated_type"] === "五段・ラ行アル") { | ||
return true; | ||
// 文末の"である"のみを許容する場合は文末であるかどうかを調べる | ||
if (ignoreConjunction) { | ||
return isLastToken(token, tokens); | ||
} else { | ||
return true; | ||
} | ||
} | ||
@@ -127,3 +176,8 @@ } | ||
if (token["conjugated_form"] === "基本形") { | ||
return true; | ||
// 文末の"です"のみを許容する場合は、文末であるかどうかを調べる | ||
if (ignoreConjunction) { | ||
return isLastToken(token, tokens); | ||
} else { | ||
return true; | ||
} | ||
} | ||
@@ -138,6 +192,9 @@ } | ||
* @param {string} text | ||
* @param {Object} options | ||
* @return {Promise.<AnalyzedResultObject[]>} | ||
*/ | ||
function analyzeDesumasu(text) { | ||
return analyze(text).then(function (results) { | ||
var options = arguments.length <= 1 || arguments[1] === undefined ? defaultOptions : arguments[1]; | ||
return analyze(text, options).then(function (results) { | ||
return results.filter(isDesumasu); | ||
@@ -149,6 +206,9 @@ }); | ||
* @param {string} text | ||
* @param {Object} options | ||
* @return {Promise.<AnalyzedResultObject[]>} | ||
*/ | ||
function analyzeDearu(text) { | ||
return analyze(text).then(function (results) { | ||
var options = arguments.length <= 1 || arguments[1] === undefined ? defaultOptions : arguments[1]; | ||
return analyze(text, options).then(function (results) { | ||
return results.filter(isDearu); | ||
@@ -155,0 +215,0 @@ }); |
@@ -14,3 +14,3 @@ { | ||
}, | ||
"version": "3.0.4", | ||
"version": "3.1.0", | ||
"description": "文の敬体(ですます調)、常体(である調)を解析", | ||
@@ -26,3 +26,3 @@ "main": "lib/analyze.js", | ||
"scripts": { | ||
"build": "babel src --out-dir lib --source-maps", | ||
"build": "NODE_ENV=production babel src --out-dir lib --source-maps", | ||
"watch": "babel src --out-dir lib --watch --source-maps", | ||
@@ -29,0 +29,0 @@ "prepublish": "npm run --if-present build", |
@@ -90,7 +90,21 @@ # analyze-desumasu-dearu [![Build Status](https://travis-ci.org/azu/analyze-desumasu-dearu.svg?branch=master)](https://travis-ci.org/azu/analyze-desumasu-dearu) | ||
### `analyze(text): Promise.<AnalyzedResultObject[]>` | ||
### `analyze(text, options): Promise.<AnalyzedResultObject[]>` | ||
`text`から敬体(ですます調)と常体(である調)を取り出した結果を返します | ||
`options`: 無視オプションを指定できます。 | ||
```js | ||
/** | ||
* デフォルトのオプション値 | ||
* @type {{ignoreConjunction: boolean}} | ||
*/ | ||
const defaultOptions = { | ||
// 接続的な使い方を無視する | ||
// e.g.) 今日はいい天気であるが明日はどうなるかは分からない。 | ||
ignoreConjunction: false | ||
}; | ||
```` | ||
```js | ||
// AnalyzedResultObjectの配列 | ||
@@ -112,3 +126,3 @@ [{ | ||
### `analyzeDesumasu(text): Promise.<AnalyzedResultObject[]>` | ||
### `analyzeDesumasu(text, options): Promise.<AnalyzedResultObject[]>` | ||
@@ -123,13 +137,28 @@ `text`に含まれる文の敬体(ですます調)を解析して、AnalyzedResultObjectの配列を返します。 | ||
* @param {string} text | ||
* @param {Object} options | ||
* @return {Promise.<AnalyzedResultObject[]>} | ||
*/ | ||
export function analyzeDesumasu(text) { | ||
return analyze(text).then(results => results.filter(isDesumasu)); | ||
export function analyzeDesumasu(text, options = defaultOptions) { | ||
return analyze(text, options).then(results => results.filter(isDesumasu)); | ||
} | ||
``` | ||
### `analyzeDearu(text): Promise.<AnalyzedResultObject[]>` | ||
### `analyzeDearu(text, options): Promise.<AnalyzedResultObject[]>` | ||
常体(である調)を解析してAnalyzedResultObjectの配列を返します | ||
`options`: 無視オプションを指定できます。 | ||
```js | ||
/** | ||
* デフォルトのオプション値 | ||
* @type {{ignoreConjunction: boolean}} | ||
*/ | ||
const defaultOptions = { | ||
// 接続的なであるの使い方を無視する | ||
// e.g.) 今日はいい天気であるが明日はどうなるかは分からない。 | ||
ignoreConjunction: false | ||
}; | ||
```` | ||
内部的には`analyze()`を使っています。 | ||
@@ -141,6 +170,7 @@ | ||
* @param {string} text | ||
* @param {Object} options | ||
* @return {Promise.<AnalyzedResultObject[]>} | ||
*/ | ||
export function analyzeDearu(text) { | ||
return analyze(text).then(results => results.filter(isDearu)) | ||
export function analyzeDearu(text, options = defaultOptions) { | ||
return analyze(text, options).then(results => results.filter(isDearu)) | ||
} | ||
@@ -147,0 +177,0 @@ ``` |
@@ -20,2 +20,11 @@ // LICENSE : MIT | ||
/** | ||
* デフォルトのオプション値 | ||
* @type {{ignoreConjunction: boolean}} | ||
*/ | ||
const defaultOptions = { | ||
// 接続的な "である" を無視する | ||
// e.g.) 今日はいい天気であるが明日はどうなるかは分からない。 | ||
ignoreConjunction: false | ||
}; | ||
/** | ||
* Type enum | ||
@@ -44,4 +53,50 @@ * @type {{desu: string, dearu: string}} | ||
} | ||
/** | ||
* | ||
* tokenが文末のtokenなのかどうか | ||
* 文末とは"。"やこれ以上後ろにtokenがないケースを示す | ||
* @param {AnalyzedToken} targetToken | ||
* @param allTokens | ||
* @returns {boolean} | ||
*/ | ||
const isLastToken = (targetToken, allTokens) => { | ||
const nextPunctureToken = findNextPunctureToken(targetToken, allTokens); | ||
if (nextPunctureToken === undefined) { | ||
return true; | ||
} | ||
const nextPunctureTokenSurface = nextPunctureToken.surface_form; | ||
if (/[\!\?!?。]/.test(nextPunctureTokenSurface)) { | ||
return true; | ||
} | ||
}; | ||
/** | ||
* targetTokenより後ろにあるtokenから切り口となるtokenを探す | ||
* @param targetToken | ||
* @param allTokens | ||
* @returns {AnalyzedToken|undefined} | ||
*/ | ||
const findNextPunctureToken = (targetToken, allTokens) => { | ||
const PUNCTUATION = /、|。/; | ||
const CONJUGATED_TYPE = /特殊/; | ||
const indexOfTargetToken = allTokens.indexOf(targetToken); | ||
// value is collection of these tokens: [ {target}, token, token, nextTarget|PunctuationToken ] | ||
const postTokens = allTokens.slice(indexOfTargetToken + 1); | ||
return find(postTokens, token => { | ||
// 接続、末尾なので切る | ||
if (PUNCTUATION.test(token["surface_form"])) { | ||
return true; | ||
} | ||
// 次の特殊・がきたら | ||
if (CONJUGATED_TYPE.test(token["conjugated_type"])) { | ||
return true; | ||
} | ||
// 明示的なtokenがない場合は、名詞がきたらそこで切ってしまう | ||
if (token["pos"] === "名詞") { | ||
return true; | ||
} | ||
return false; | ||
}); | ||
}; | ||
/** | ||
* tokensからAnalyzedTokenにmapを作る | ||
* @param {AnalyzedToken[]}tokens | ||
@@ -56,20 +111,4 @@ * @returns {function(token: AnalyzedToken)} | ||
return function mapTokenToAnalyzedResult(token) { | ||
const PUNCTUATION = /、|。/; | ||
const CONJUGATED_TYPE = /特殊/; | ||
const indexOfTargetToken = tokens.indexOf(token); | ||
// value is collection of these tokens: [ {target}, token, token, nextTarget|PunctuationToken ] | ||
const postTokens = tokens.slice(indexOfTargetToken + 1); | ||
const nextPunctureToken = find(postTokens, token => { | ||
if (PUNCTUATION.test(token["surface_form"])) { | ||
return true; | ||
} | ||
if (CONJUGATED_TYPE.test(token["conjugated_type"])) { | ||
return true; | ||
} | ||
// 明示的なtokenがない場合は、名詞がきたらそこで切ってしまう | ||
if (token["pos"] === "名詞") { | ||
return true; | ||
} | ||
return false; | ||
}); | ||
const nextPunctureToken = findNextPunctureToken(token, tokens); | ||
// if has not next token, use between token <--> last. | ||
@@ -94,6 +133,10 @@ const nextTokenIndex = nextPunctureToken ? tokens.indexOf(nextPunctureToken) : tokens.length; | ||
* `text`から敬体(ですます調)と常体(である調)を取り出した結果を返します。 | ||
* @param text | ||
* @param {string} text | ||
* @param {Object} options | ||
* @returns {Promise.<AnalyzedResultObject[]>} | ||
*/ | ||
export function analyze(text) { | ||
export function analyze(text, options = defaultOptions) { | ||
const ignoreConjunction = options.ignoreConjunction !== undefined | ||
? options.ignoreConjunction | ||
: defaultOptions.ignoreConjunction; | ||
return getTokenizer().then(tokenizer => { | ||
@@ -107,5 +150,11 @@ const tokens = _tokensCacheMap[text] ? _tokensCacheMap[text] : tokenizer.tokenizeForSentence(text); | ||
if (conjugatedType === Types.dearu) { | ||
// "である" を取り出す。この時点では接続なのか末尾なのかは区別できない | ||
if (token["pos"] === "助動詞" && token["conjugated_form"] === "連用形") { | ||
if (nextToken && nextToken["conjugated_type"] === "五段・ラ行アル") { | ||
return true; | ||
// 文末の"である"のみを許容する場合は文末であるかどうかを調べる | ||
if (ignoreConjunction) { | ||
return isLastToken(token, tokens); | ||
} else { | ||
return true; | ||
} | ||
} | ||
@@ -116,3 +165,8 @@ } | ||
if (token["conjugated_form"] === "基本形") { | ||
return true; | ||
// 文末の"です"のみを許容する場合は、文末であるかどうかを調べる | ||
if (ignoreConjunction) { | ||
return isLastToken(token, tokens); | ||
} else { | ||
return true; | ||
} | ||
} | ||
@@ -127,6 +181,7 @@ } | ||
* @param {string} text | ||
* @param {Object} options | ||
* @return {Promise.<AnalyzedResultObject[]>} | ||
*/ | ||
export function analyzeDesumasu(text) { | ||
return analyze(text).then(results => results.filter(isDesumasu)); | ||
export function analyzeDesumasu(text, options = defaultOptions) { | ||
return analyze(text, options).then(results => results.filter(isDesumasu)); | ||
} | ||
@@ -136,6 +191,7 @@ /** | ||
* @param {string} text | ||
* @param {Object} options | ||
* @return {Promise.<AnalyzedResultObject[]>} | ||
*/ | ||
export function analyzeDearu(text) { | ||
return analyze(text).then(results => results.filter(isDearu)) | ||
export function analyzeDearu(text, options = defaultOptions) { | ||
return analyze(text, options).then(results => results.filter(isDearu)) | ||
} |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
33603
388
193