analyze-desumasu-dearu
Advanced tools
Comparing version 3.1.0 to 4.0.0
@@ -5,3 +5,3 @@ // LICENSE : MIT | ||
Object.defineProperty(exports, "__esModule", { | ||
value: true | ||
value: true | ||
}); | ||
@@ -13,4 +13,8 @@ exports.isDesumasu = isDesumasu; | ||
exports.analyzeDearu = analyzeDearu; | ||
exports.Types = void 0; | ||
var ObjectAssign = require("object.assign"); | ||
var find = require('array-find'); | ||
var find = require("array-find"); | ||
var getTokenizer = require("kuromojin").getTokenizer; | ||
@@ -27,4 +31,5 @@ /** | ||
*/ | ||
// Cache tokens | ||
// Cache tokens | ||
var _tokensCacheMap = {}; | ||
@@ -35,6 +40,7 @@ /** | ||
*/ | ||
var defaultOptions = { | ||
// 接続的な "である" を無視する | ||
// e.g.) 今日はいい天気であるが明日はどうなるかは分からない。 | ||
ignoreConjunction: false | ||
// 接続的な "である" を無視する | ||
// e.g.) 今日はいい天気であるが明日はどうなるかは分からない。 | ||
ignoreConjunction: false | ||
}; | ||
@@ -47,5 +53,7 @@ /** | ||
*/ | ||
var Types = exports.Types = { | ||
desu: "特殊・デス", | ||
dearu: "特殊・ダ" | ||
var Types = { | ||
desu: "特殊・デス", | ||
masu: "特殊・マス", | ||
dearu: "特殊・ダ" | ||
}; | ||
@@ -56,4 +64,8 @@ /** | ||
*/ | ||
function isDesumasu(resultObject) { | ||
return resultObject.type === Types.desu; | ||
exports.Types = Types; | ||
function isDesumasu(_ref) { | ||
var type = _ref.type; | ||
return isDesumasuType(type); | ||
} | ||
@@ -64,6 +76,22 @@ /** | ||
*/ | ||
function isDearu(resultObject) { | ||
return resultObject.type === Types.dearu; | ||
function isDearu(_ref2) { | ||
var type = _ref2.type; | ||
return isDearuType(type); | ||
} | ||
/** | ||
* typeが敬体(ですます調)か常体(である調)かを判定する | ||
* @param {string} type | ||
* @returns {boolean} | ||
*/ | ||
var isDesumasuType = function isDesumasuType(type) { | ||
return type === Types.desu || type === Types.masu; | ||
}; | ||
var isDearuType = function isDearuType(type) { | ||
return type === Types.dearu; | ||
}; | ||
/** | ||
@@ -76,11 +104,16 @@ * tokenが文末のtokenなのかどうか | ||
*/ | ||
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; | ||
} | ||
var nextPunctureToken = findNextPunctureToken(targetToken, allTokens); | ||
if (nextPunctureToken === undefined) { | ||
return true; | ||
} | ||
var nextPunctureTokenSurface = nextPunctureToken.surface_form; | ||
if (/[\!\?!?。]/.test(nextPunctureTokenSurface)) { | ||
return true; | ||
} | ||
}; | ||
@@ -93,23 +126,28 @@ /** | ||
*/ | ||
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; | ||
}); | ||
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; | ||
}); | ||
}; | ||
@@ -121,28 +159,31 @@ /** | ||
*/ | ||
var mapToAnalyzedResult = function mapToAnalyzedResult(tokens) { | ||
/** | ||
* @param {AnalyzedToken} token | ||
* @return {AnalyzedResultObject} | ||
*/ | ||
return function mapTokenToAnalyzedResult(token) { | ||
var indexOfTargetToken = tokens.indexOf(token); | ||
var nextPunctureToken = findNextPunctureToken(token, tokens); | ||
// if has not next token, use between token <--> last. | ||
var nextTokenIndex = nextPunctureToken ? tokens.indexOf(nextPunctureToken) : tokens.length; | ||
var valueTokens = tokens.slice(indexOfTargetToken, nextTokenIndex + 1); | ||
var value = valueTokens.map(function (token) { | ||
return token["surface_form"]; | ||
}).join(""); | ||
return { | ||
type: token["conjugated_type"], | ||
value: value, | ||
surface: token["surface_form"], | ||
// index start with 0 | ||
index: token["word_position"] - 1, | ||
/** | ||
* @type {AnalyzedToken} | ||
*/ | ||
token: ObjectAssign({}, token) | ||
}; | ||
/** | ||
* @param {AnalyzedToken} token | ||
* @return {AnalyzedResultObject} | ||
*/ | ||
return function mapTokenToAnalyzedResult(token) { | ||
var indexOfTargetToken = tokens.indexOf(token); | ||
var nextPunctureToken = findNextPunctureToken(token, tokens); // if has not next token, use between token <--> last. | ||
var nextTokenIndex = nextPunctureToken ? tokens.indexOf(nextPunctureToken) : tokens.length; | ||
var valueTokens = tokens.slice(indexOfTargetToken, nextTokenIndex + 1); | ||
var value = valueTokens.map(function (token) { | ||
return token["surface_form"]; | ||
}).join(""); | ||
return { | ||
type: token["conjugated_type"], | ||
value: value, | ||
surface: token["surface_form"], | ||
// index start with 0 | ||
index: token["word_position"] - 1, | ||
/** | ||
* @type {AnalyzedToken} | ||
*/ | ||
token: ObjectAssign({}, token) | ||
}; | ||
}; | ||
}; | ||
@@ -155,39 +196,41 @@ /** | ||
*/ | ||
function analyze(text) { | ||
var options = arguments.length <= 1 || arguments[1] === undefined ? defaultOptions : arguments[1]; | ||
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultOptions; | ||
var ignoreConjunction = options.ignoreConjunction !== undefined ? options.ignoreConjunction : defaultOptions.ignoreConjunction; | ||
return getTokenizer().then(function (tokenizer) { | ||
var tokens = _tokensCacheMap[text] ? _tokensCacheMap[text] : tokenizer.tokenizeForSentence(text); | ||
_tokensCacheMap[text] = tokens; | ||
var filterByType = tokens.filter(function (token, index) { | ||
var nextToken = tokens[index + 1]; // token[特殊・ダ] + nextToken[アル] なら 常体(である調) として認識する | ||
var ignoreConjunction = options.ignoreConjunction !== undefined ? options.ignoreConjunction : defaultOptions.ignoreConjunction; | ||
return getTokenizer().then(function (tokenizer) { | ||
var tokens = _tokensCacheMap[text] ? _tokensCacheMap[text] : tokenizer.tokenizeForSentence(text); | ||
_tokensCacheMap[text] = tokens; | ||
var filterByType = tokens.filter(function (token, index) { | ||
var nextToken = tokens[index + 1]; | ||
// token[特殊・ダ] + nextToken[アル] なら 常体(である調) として認識する | ||
var conjugatedType = token["conjugated_type"]; | ||
if (conjugatedType === Types.dearu) { | ||
// "である" を取り出す。この時点では接続なのか末尾なのかは区別できない | ||
if (token["pos"] === "助動詞" && token["conjugated_form"] === "連用形") { | ||
if (nextToken && nextToken["conjugated_type"] === "五段・ラ行アル") { | ||
// 文末の"である"のみを許容する場合は文末であるかどうかを調べる | ||
if (ignoreConjunction) { | ||
return isLastToken(token, tokens); | ||
} else { | ||
return true; | ||
} | ||
} | ||
} | ||
} else if (conjugatedType === Types.desu) { | ||
// TODO: can omit? | ||
if (token["conjugated_form"] === "基本形") { | ||
// 文末の"です"のみを許容する場合は、文末であるかどうかを調べる | ||
if (ignoreConjunction) { | ||
return isLastToken(token, tokens); | ||
} else { | ||
return true; | ||
} | ||
} | ||
var conjugatedType = token["conjugated_type"]; | ||
if (isDearuType(conjugatedType)) { | ||
// "である" を取り出す。この時点では接続なのか末尾なのかは区別できない | ||
if (token["pos"] === "助動詞" && token["conjugated_form"] === "連用形") { | ||
if (nextToken && nextToken["conjugated_type"] === "五段・ラ行アル") { | ||
// 文末の"である"のみを許容する場合は文末であるかどうかを調べる | ||
if (ignoreConjunction) { | ||
return isLastToken(token, tokens); | ||
} else { | ||
return true; | ||
} | ||
}); | ||
return filterByType.map(mapToAnalyzedResult(tokens)); | ||
} | ||
} | ||
} else if (isDesumasuType(conjugatedType)) { | ||
// TODO: can omit? | ||
if (token["conjugated_form"] === "基本形") { | ||
// 文末の"です"のみを許容する場合は、文末であるかどうかを調べる | ||
if (ignoreConjunction) { | ||
return isLastToken(token, tokens); | ||
} else { | ||
return true; | ||
} | ||
} | ||
} | ||
}); | ||
return filterByType.map(mapToAnalyzedResult(tokens)); | ||
}); | ||
} | ||
@@ -200,8 +243,9 @@ /** | ||
*/ | ||
function analyzeDesumasu(text) { | ||
var options = arguments.length <= 1 || arguments[1] === undefined ? defaultOptions : arguments[1]; | ||
return analyze(text, options).then(function (results) { | ||
return results.filter(isDesumasu); | ||
}); | ||
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultOptions; | ||
return analyze(text, options).then(function (results) { | ||
return results.filter(isDesumasu); | ||
}); | ||
} | ||
@@ -214,9 +258,10 @@ /** | ||
*/ | ||
function analyzeDearu(text) { | ||
var options = arguments.length <= 1 || arguments[1] === undefined ? defaultOptions : arguments[1]; | ||
return analyze(text, options).then(function (results) { | ||
return results.filter(isDearu); | ||
}); | ||
var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultOptions; | ||
return analyze(text, options).then(function (results) { | ||
return results.filter(isDearu); | ||
}); | ||
} | ||
//# sourceMappingURL=analyze.js.map |
@@ -14,3 +14,3 @@ { | ||
}, | ||
"version": "3.1.0", | ||
"version": "4.0.0", | ||
"description": "文の敬体(ですます調)、常体(である調)を解析", | ||
@@ -30,3 +30,4 @@ "main": "lib/analyze.js", | ||
"test": "mocha", | ||
"example": "cd example && npm it" | ||
"example": "cd example && npm it", | ||
"prettier": "prettier --write \"**/*.{js,jsx,ts,tsx,css}\"" | ||
}, | ||
@@ -38,15 +39,35 @@ "keywords": [ | ||
"devDependencies": { | ||
"babel-cli": "^6.5.1", | ||
"babel-plugin-add-module-exports": "^0.1.2", | ||
"babel-preset-es2015": "^6.5.0", | ||
"babel-preset-power-assert": "^1.0.0", | ||
"babel-register": "^6.8.0", | ||
"mocha": "^2.3.3", | ||
"power-assert": "^1.3.1" | ||
"@babel/cli": "^7.0.0", | ||
"@babel/core": "^7.0.0", | ||
"@babel/preset-env": "^7.0.0", | ||
"@babel/register": "^7.0.0", | ||
"babel-preset-power-assert": "^3.0.0", | ||
"husky": "^1.0.1", | ||
"lint-staged": "^7.3.0", | ||
"mocha": "^5.2.0", | ||
"power-assert": "^1.4.4", | ||
"prettier": "^1.10.2" | ||
}, | ||
"dependencies": { | ||
"array-find": "^1.0.0", | ||
"kuromojin": "^1.2.1", | ||
"object.assign": "^4.0.3" | ||
"kuromojin": "^1.4.0", | ||
"object.assign": "^4.1.0" | ||
}, | ||
"prettier": { | ||
"singleQuote": false, | ||
"printWidth": 120, | ||
"tabWidth": 4 | ||
}, | ||
"lint-staged": { | ||
"*.{js,jsx,ts,tsx,css}": [ | ||
"prettier --write", | ||
"git add" | ||
] | ||
}, | ||
"husky": { | ||
"hooks": { | ||
"post-commit": "git reset", | ||
"pre-commit": "lint-staged" | ||
} | ||
} | ||
} |
@@ -94,3 +94,4 @@ # analyze-desumasu-dearu [![Build Status](https://travis-ci.org/azu/analyze-desumasu-dearu.svg?branch=master)](https://travis-ci.org/azu/analyze-desumasu-dearu) | ||
`options`: 無視オプションを指定できます。 | ||
- `options` | ||
- `ignoreConjunction`: 無視オプションを指定できます | ||
@@ -148,3 +149,4 @@ ```js | ||
`options`: 無視オプションを指定できます。 | ||
- `options` | ||
- `ignoreConjunction`: 無視オプションを指定できます。 | ||
@@ -177,2 +179,8 @@ ```js | ||
## UseCase | ||
以下のツールなどで利用しています。 | ||
- [textlint-ja/textlint-rule-no-mix-dearu-desumasu: textlint rule that check no mix である and ですます.](https://github.com/textlint-ja/textlint-rule-no-mix-dearu-desumasu) | ||
## Tests | ||
@@ -196,2 +204,2 @@ | ||
Thank for [RedPen](http://redpen.cc/ "RedPen"). | ||
Thank for [RedPen](http://redpen.cc/ "RedPen"). |
// LICENSE : MIT | ||
"use strict"; | ||
const ObjectAssign = require("object.assign"); | ||
const find = require('array-find'); | ||
const find = require("array-find"); | ||
const getTokenizer = require("kuromojin").getTokenizer; | ||
@@ -36,4 +36,6 @@ /** | ||
desu: "特殊・デス", | ||
masu: "特殊・マス", | ||
dearu: "特殊・ダ" | ||
}; | ||
/** | ||
@@ -43,5 +45,6 @@ * @param {AnalyzedResultObject} resultObject | ||
*/ | ||
export function isDesumasu(resultObject) { | ||
return resultObject.type === Types.desu; | ||
export function isDesumasu({ type }) { | ||
return isDesumasuType(type); | ||
} | ||
/** | ||
@@ -51,7 +54,15 @@ * @param {AnalyzedResultObject} resultObject | ||
*/ | ||
export function isDearu(resultObject) { | ||
return resultObject.type === Types.dearu; | ||
export function isDearu({ type }) { | ||
return isDearuType(type); | ||
} | ||
/** | ||
* typeが敬体(ですます調)か常体(である調)かを判定する | ||
* @param {string} type | ||
* @returns {boolean} | ||
*/ | ||
const isDesumasuType = type => type === Types.desu || type === Types.masu; | ||
const isDearuType = type => type === Types.dearu; | ||
/** | ||
* tokenが文末のtokenなのかどうか | ||
@@ -131,2 +142,3 @@ * 文末とは"。"やこれ以上後ろにtokenがないケースを示す | ||
}; | ||
/** | ||
@@ -139,5 +151,4 @@ * `text`から敬体(ですます調)と常体(である調)を取り出した結果を返します。 | ||
export function analyze(text, options = defaultOptions) { | ||
const ignoreConjunction = options.ignoreConjunction !== undefined | ||
? options.ignoreConjunction | ||
: defaultOptions.ignoreConjunction; | ||
const ignoreConjunction = | ||
options.ignoreConjunction !== undefined ? options.ignoreConjunction : defaultOptions.ignoreConjunction; | ||
return getTokenizer().then(tokenizer => { | ||
@@ -150,3 +161,3 @@ const tokens = _tokensCacheMap[text] ? _tokensCacheMap[text] : tokenizer.tokenizeForSentence(text); | ||
const conjugatedType = token["conjugated_type"]; | ||
if (conjugatedType === Types.dearu) { | ||
if (isDearuType(conjugatedType)) { | ||
// "である" を取り出す。この時点では接続なのか末尾なのかは区別できない | ||
@@ -163,3 +174,3 @@ if (token["pos"] === "助動詞" && token["conjugated_form"] === "連用形") { | ||
} | ||
} else if (conjugatedType === Types.desu) { | ||
} else if (isDesumasuType(conjugatedType)) { | ||
// TODO: can omit? | ||
@@ -179,2 +190,3 @@ if (token["conjugated_form"] === "基本形") { | ||
} | ||
/** | ||
@@ -189,2 +201,3 @@ * `text` の敬体(ですます調)について解析し、敬体(ですます調)のトークン情報を返します。 | ||
} | ||
/** | ||
@@ -197,3 +210,3 @@ * `text` の常体(である調)について解析し、常体(である調)のトークン情報を返します。 | ||
export function analyzeDearu(text, options = defaultOptions) { | ||
return analyze(text, options).then(results => results.filter(isDearu)) | ||
} | ||
return analyze(text, options).then(results => results.filter(isDearu)); | ||
} |
Sorry, the diff of this file is not supported yet
36609
407
202
10
Updatedkuromojin@^1.4.0
Updatedobject.assign@^4.1.0