Найти массив значений в другом массиве js?

#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. Огромное спасибо… намного быстрее, чем мое решение 😀