#javascript #arrays #find
Вопрос:
Здравствуйте, мне нужно прочитать текст почти из 300 000 слов и определить глобальную частоту каждого слова из входного словаря и создать один массив.. У меня есть файл предложений и файл словаря со словами и их частотой… Это мой код:
const sentenceFreq = [];
let text = [];
for (const sentence of srcSentences) {
// remove special characters
const sentenceWithoutSpecial = sentence.srcLangContent
.replace(/[`~!@#$%^amp;*„“()_| -=?;:'",.<>{}[]\/]/gi, "");
text = text sentenceWithoutSpecial " ";
}
const words = text.replace(/[.]/g, "").split(/s/);
words.map(async (w, i)=>{
const frequency = eng.filter((x) => x.word.toLowerCase() === w.toLowerCase());
if (frequency[0]) {
sentenceFreq.push({[frequency[0].freq]: w});
} else {
sentenceFreq.push({0: w});
}
});
Это словарь английского языка
let eng = [
{word:"the",freq:23135851162},
{word:"of",freq:13151942776},
{word:"and",freq:12997637966},
{word:"to",freq:12136980858},
{word:"a",freq:9081174698},
{word:"in",freq:8469404971}
....]
Поэтому, если мой текст «Сегодня прекрасный день», код должен искать каждое слово, находить его в словаре английского языка и возвращать его частоту, чтобы результат был [{1334:"today"},{521:"is"},{678854:"beautiful"},{9754334:"day"}]
Таким образом, эти числа 1334,521...
являются частотами, найденными в словаре английского языка.
Проблема в том, что это слишком медленно, так как у меня 300 000 слов… это любой более эффективный способ прочитать массив слов и найти его в массиве файловых английских слов… Итак, если у меня есть массив ['today', 'is', 'good', 'day']
, могу ли я автоматически искать все значения в массиве eng, а не проходить каждое слово с помощью цикла?
Комментарии:
1. Вы можете попробовать что-то вроде этого: res = arr1.фильтр(элемент => arr2.включает(элемент));
Ответ №1:
Вместо того, чтобы использовать массив объектов, как [ {word1: "text", frequency: 4} ]
для поиска, попробуйте создать один объект, где имена свойств-это слова, а количество-их частота. Затем вы можете сопоставить свой массив слов с конечным выводом:
const myString = "Today is beautiful day. I like to walk and go in the forest.";
const cleanText = myString.replace(/[`~!@#$%^amp;*„“()_| -=?;:'",.<>{}[]\/]/gi, "");
const eng = [
{word:"the",freq:23135851162},
{word:"of",freq:13151942776},
{word:"and",freq:12997637966},
{word:"to",freq:12136980858},
{word:"a",freq:9081174698},
{word:"in",freq:8469404971}
];
const myEng = eng.reduce((obj, {word, freq}) => { // reduce all the values in the "eng" array to a single object
obj[word] = freq; // assuming there are no duplicates, each word should have a new entry
return obj; // return the object for the next iteration to use
}, {} // these brackets here are the "obj" value on the first loop, in this case an empty object
);
console.log("New object with fast lookup:n", myEng);
const wordsArr = cleanText.split(" ");
const out = wordsArr.map((word) => {
const freq = myEng[word] || 0; // freq = myEng[word] if it exists, else 0
return { [freq]: word }; // replace the word in the array with an object in format { frequency : word }
});
console.log("Output:n", out);
.as-console-wrapper { min-height: 100% } /* Change the console output size. */
Это будет значительно быстрее, так как время поиска будет сокращено для каждого слова, которое вы хотите проверить.
Комментарии:
1. Огромное спасибо… намного быстрее, чем мое решение 😀