我有一个相当复杂的数组,由Google的自然语言API生成。我给它添了一段文字,并提供了很多关于这一段的语言信息。
我的最终目标是从这一段中找到“关键词”,因此,要实现这一点,我想将所有“实体”放入一个平面数组,计算重复数,然后考虑具有最高重复数量的单词成为“关键词”。如果它没有找到任何,那么我会从我认为最重要的实体中挑选一些词。
我已经知道可以存在的实体:
var entities = [
'art',
'events',
'goods',
'organizations',
'other',
'people',
'places',
'unknown'
];
以下是我正在使用的数组的示例结构。
input = [
{
language: {
entities: {
people: [
{
name: "Paul",
type: "Person",
},
{
name: "Paul",
type: "Person",
},
],
goods: [
{
name: "car",
type: "Consumer_good",
}
], //etc
}
}
}
];
output = ["Paul", "Paul", "car"...];
我的问题是 - 将我的初始数组转换为平面数组然后使用一大堆FOR循环找到没有的重复项的最佳方法是什么?
答案 0 :(得分:0)
如果使用动态输入数据,则无法绕过循环或数组函数。
答案 1 :(得分:0)
您可以以递归方式迭代input.language.entities并将所有.name属性收集到数组中。然后你只有一个for循环: - )。
执行此操作后,您可以遍历它以查找重复项。如果您在更容易之前按字母顺序对其进行排序(如果两个或多个连续条目相等,则存在重复项。)
但是如果google更改api或者由于故障而提供垃圾数据可能会有点危险。
不是input.language.entities已经足够扁平化了吗?
答案 2 :(得分:0)
您可以使用以下格式访问所有值:
input[0]["language"]["entities"]["people"][0].name
input = [
{
language: {
entities: {
people: [
{
name: "Paul",
type: "Person",
},
{
name: "Paul",
type: "Person",
},
],
goods: [
{
name: "car",
type: "Consumer_good",
}
], //etc
}
}
}
];
console.log(input[0]["language"]["entities"]["people"][0].name);

然后你可以这样做:
for (var entry in input[0]["language"]["entities"]) {
console.log(entry);
}
或,如果我理解你错了,
您可以使用它将javascript对象转换为数组(需要jquery):
var myObj = {
1: [1, 2, 3],
2: [4, 5, 6]
};
var array = $.map(myObj, function(value, index) {
return [value];
});
console.log(array[0][0]);
console.log(array[0]);
console.log(array);

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
这将输出
1
[1, 2, 3]
[[1,2,3],[4,5,6]]
答案 3 :(得分:0)
我最终做了这样的事情。它并不漂亮,但它完成了工作。
var result = [];
var known_entities = ['art','events','goods','organizations','other','people','places','unknown'];
for(i=0; i < known_entities.length; i++){
var entity = known_entities[i];
if(language.entities[entity]){
for(var j in language.entities[entity]){
var word = language.entities[entity][j].name
result.key_words.push(word);
}
}
}