wordnet.lookup 是异步函数吗?尝试使用 wordnet 和 natural 为句子中的每个单词构建同义词数组
Is wordnet.lookup an async function? Trying to build an array of synonyms for each word in a sentence with wordnet and natural
所以我第一次尝试使用 wordnet 为我正在处理的基于文本的小型冒险游戏项目构建文本识别脚本。现在,我有这段代码来尝试构建一个对象,该对象由作为键的每个词和作为附加到该键的数组的该词的每个同义词组成:
const natural = require('natural');
const wordnet = new natural.WordNet();
let s = "Inspect the room";
function resultCheck(sentence) {
a = sentence.split(' ');
let sObj = {};
a.forEach(word => {
sObj[word] = [];
wordnet.lookup(word, function (details) {
details.forEach(function (detail) {
sObj[word].push(detail.synonyms);
});
sObj[word] = sObj[word].join().split(',');
console.log(sObj);
});
});
return sObj;
}
let newOb = resultCheck(s);
console.log(newOb);
控制台记录正在正确构建的同义词数组,但返回的对象只是带有空数组的键。我也尝试过以几种方式使用 async/await 但没有成功。有什么想法吗?
它是 ES6 之前的 JS。它不是 async/await 或基于承诺的意义上的异步。 src 但它是异步的,因为它充满了递归回调。
编辑:如何做你想做的事:
虽然我使用 const 和箭头函数,但这是非常老派的做法 Javascript,因为您必须通过嵌套回调来强制执行顺序。另外,很抱歉添加了 lodash,但我总是求助于它;没有它我不知道如何使用JS。
const natural = require('natural');
const _ = require('lodash')
const wordnet = new natural.WordNet();
const tokenizer = new natural.WordTokenizer();
const sent = "Welcome to callback hell."
const setSyns = {}
const handleLookup = (word, syns) => {
setSyns[word] = syns
}
const doLast = () => {
console.log(setSyns)
}
// callback to wordnet.lookup gets passed an array of objects
// one property of which is `synonyms`
// also, use a tokenizer
tokenizer.tokenize(sent).forEach((word, idx, words) => {
wordnet.lookup(word, x => {
synsList = _.flatMapDeep(x, y => y.synonyms)
handleLookup(word, _.uniq(synsList))
if (idx == words.length - 1) {
doLast()
}
})
})
console.log(setSyns) // logs {} because this is executed before the loop is done
所以我第一次尝试使用 wordnet 为我正在处理的基于文本的小型冒险游戏项目构建文本识别脚本。现在,我有这段代码来尝试构建一个对象,该对象由作为键的每个词和作为附加到该键的数组的该词的每个同义词组成:
const natural = require('natural');
const wordnet = new natural.WordNet();
let s = "Inspect the room";
function resultCheck(sentence) {
a = sentence.split(' ');
let sObj = {};
a.forEach(word => {
sObj[word] = [];
wordnet.lookup(word, function (details) {
details.forEach(function (detail) {
sObj[word].push(detail.synonyms);
});
sObj[word] = sObj[word].join().split(',');
console.log(sObj);
});
});
return sObj;
}
let newOb = resultCheck(s);
console.log(newOb);
控制台记录正在正确构建的同义词数组,但返回的对象只是带有空数组的键。我也尝试过以几种方式使用 async/await 但没有成功。有什么想法吗?
它是 ES6 之前的 JS。它不是 async/await 或基于承诺的意义上的异步。 src 但它是异步的,因为它充满了递归回调。
编辑:如何做你想做的事:
虽然我使用 const 和箭头函数,但这是非常老派的做法 Javascript,因为您必须通过嵌套回调来强制执行顺序。另外,很抱歉添加了 lodash,但我总是求助于它;没有它我不知道如何使用JS。
const natural = require('natural');
const _ = require('lodash')
const wordnet = new natural.WordNet();
const tokenizer = new natural.WordTokenizer();
const sent = "Welcome to callback hell."
const setSyns = {}
const handleLookup = (word, syns) => {
setSyns[word] = syns
}
const doLast = () => {
console.log(setSyns)
}
// callback to wordnet.lookup gets passed an array of objects
// one property of which is `synonyms`
// also, use a tokenizer
tokenizer.tokenize(sent).forEach((word, idx, words) => {
wordnet.lookup(word, x => {
synsList = _.flatMapDeep(x, y => y.synonyms)
handleLookup(word, _.uniq(synsList))
if (idx == words.length - 1) {
doLast()
}
})
})
console.log(setSyns) // logs {} because this is executed before the loop is done