【问题标题】:In Google Sheets remove serie of ngrams from cells containing lists of comma separated ngrams in primary sheet在 Google 表格中,从包含主表格中逗号分隔的 ngram 列表的单元格中删除一系列 ngram
【发布时间】:2021-10-30 22:28:57
【问题描述】:

一直在 Google 表格中处理包含大约一千条文本的通用表格。在从包含原始“书面”形式的文本的列中派生出来的一列中,是从它们中提取并按字母顺序列出的 ngram(单词等),每个文本对应的 ngram 列表。我一直在尝试从此类 ngram 的这些列表中派生第二列,但没有成功,我想从中删除我有一个列表的某些 ngram 的实例(一个长列表,数百个 ngram,以及一个以后可以补充)。换句话说,从文本挖掘词汇中,我想从标记列表中删除停用词。

我尝试使用 SPLIT 和 REGEXREPLACE 函数,或两者的组合,但没有成功。

=JOIN(",";SORT(TRANSPOSE(SPLIT(REGEXREPLACE(AL3;"\bau\b;\baux\b;\bavec\b;\bce\b;\bces\b;\bdans\b;\bde\b;\bdes\b;\bdu\b;\belle\b;\ben\b;\bet\b;\beux\b;\bil\b;\bje\b;\bla\b;\ble\b;\bleur\b;\blui\b;\bma\b;\bmais\b;\bme\b;\bmême\b;\bmes\b;\bmoi\b;\bmon\b;\bne\b;\bnos\b;\bnotre\b;\bnous\b;\bon\b;\bou\b;\bpar\b;\bpas\b;\bpour\b;\bqu\b;\bque\b;\bqui\b;\bsa\b;\bse\b;\bses\b;\bson\b;\bsur\b;\bta\b;\bte\b;\btes\b;\btoi\b;\bton\b;\btu\b;\bun\b;\bune\b;\bvos\b;\bvotre\b;\bvous\b;\bc\b;\bd\b;\bj\b;\bl\b;\bà\b;\bm\b;\bn\b;\bs\b;\bt\b;\by\b;\bété\b;\bétée\b;\bétées\b;\bétés\b;\bétant\b;\bsuis\b;\bes\b;\best\b;\bsommes\b;\bêtes\b;\bsont\b;\bserai\b;\bseras\b;\bsera\b;\bserons\b;\bserez\b;\bseront\b;\bserais\b;\bserait\b;\bserions\b;\bseriez\b;\bseraient\b;\bétais\b;\bétait\b;\bétions\b;\bétiez\b;\bétaient\b;\bfus\b;\bfut\b;\bfûmes\b;\bfûtes\b;\bfurent\b;\bsois\b;\bsoit\b;\bsoyons\b;\bsoyez\b;\bsoient\b;\bfusse\b;\bfusses\b;\bfût\b;\bfussions\b;\bfussiez\b;\bfussent\b;\bayant\b;\beu\b;\beue\b;\beues\b;\beus\b;\bai\b;\bas\b;\bavons\b;\bavez\b;\bont\b;\baurai\b;\bauras\b;\baura\b;\baurons\b;\baurez\b;\bauront\b;\baurais\b;\baurait\b;\baurions\b;\bauriez\b;\bauraient\b;\bavais\b;\bavait\b;\bavions\b;\baviez\b;\bavaient\b;\beut\b;\beûmes\b;\beûtes\b;\beurent\b;\baie\b;\baies\b;\bait\b;\bayons\b;\bayez\b;\baient\b;\beusse\b;\beusses\b;\beût\b;\beussions\b;\beussiez\b;\beussent\b;\bceci\b;\bcela\b;\bcelà\b;\bcet\b;\bcette\b;\bici\b;\bils\b;\bles\b;\bleurs\b;\bquel\b;\bquels\b;\bquelle\b;\bquelles\b;\bsans\b;\bsoi\b";"");" ")));"")

Dumky here 做了一些巧妙的事情,编写了一个带有自定义函数的脚本,它做了几件事,其中包括从辅助表调用一个列表,以清理这些 ngrams-words-tokens 列表,但他有什么done 超出了我想做的事情以及我自己在 Google 表格中可以做的事情。

停用词列表示例(要删除的 ngram): à,ai,aie,aient,aies,ait,as,au,aura,aurai,auraient,aurais,aurait,auras,aurez,auriez,aurions,aurons,auront,aux,avaient,avais,avait,avec,avez, aviez,avions,avons,ayant,ayez,ayons,c,ce,ceci,cela,celà,ces,cet,cette,d,dans,de,des,du,elle,en,es,est,et,étaient, étais,était,étant,été,étée,étées,êtes,étés,étiez,étions,eu,eue,eues,eûmes,eurent,eus,eusse,eussent,eusses,eussiez,eussions,eut,eût,eûtes,eux, fûmes,furent,fus,fusse,fussent,fusses,fussiez,fussions,fut,fût,fûtes,ici,il,ils,j,je,l,la,le,les,leur,leurs,lui,m,ma, mais,me,même,mes,moi,mon,n,ne,nos,notre,nous,on,on,on,ou,par,pas,pour,qu,que,quel,quelle,quelles,quels,qui,s, sa,sans,se,sera,serai,seraient,serais,serait,seras,serez,seriez,serions,serons,seront,ses,soi,soient,sois,soit,sommes,son,sont,soyez,soyons,suis, sur,t,ta,te,tes,toi,ton,tu,un,une,vos,votre,vous,y

我正在寻找的输出示例——

从短文本派生的 ngram 列表: 10,11,21,à,à,ami,ami,amour,aux,baiser,brusko,brusko,car,ce,comme,comme,compagnon,de,de,déclare,déclare,déteste,électricité,elle,en, est,est,est,et,étudiant,fluide,gare,germes,heures,idealistes,il,infectueux,je,l,l,la,la,le,lumière,médecine,meilleur,moi,moi,mon,montréal, pée,pensez,poète,que,que,qui,rancune,répondez,sans,science,ses,sic,un,un,vébicule,vôtre,vous

输出: ami,ami,amour,baiser,brusko,brusko,car,comme,comme,compagnon,déclare,déclare,déteste,électricité,étudiant,fluide,gare,germes,heures,idealistes,infectueux,lumière,médecine,meilleur,montréal, pée,pensez,poète,rancune,répondez,科学,原文如此,vébicule,vôtre

【问题讨论】:

  • 可能我不够聪明。您能否做一个简短的样本:您拥有的细胞和您想要拥有的细胞?不需要使用所有数百个单词和那些 ngram。只是几个,5-10,例如。如果它适用于 5 个单词,它也适用于 500 或 5000 个单词。
  • 您好@YuriKhristich,感谢您考虑我的问题。我已根据您的要求编辑问题以提供示例。
  • 看起来我的答案中的代码可以完成这项工作。下一步是让它与您的电子表格一起使用。你有这个问题吗?唯一可能的问题是,如果文本真的很大,脚本可能会超出最大运行时间。
  • 所有行的“停用词”列表都相同吗?
  • 最长的列表有 6000 多纳克。这大约只要它可以得到。我不希望出现这种问题。实际上,所有行的停用词列表都是相同的。但是,随着时间的推移,我可能不得不对其进行多次添加。您提供的代码 sn-p 看起来完美地完成了工作!

标签: google-apps-script google-sheets nlp google-sheets-formula stop-words


【解决方案1】:

我不确定我是否理解正确。如果你想从某个字符串中删除一些单词,那么基本上可以这样做:

var txt = "a,b,c,d,aa,bb,cc,dd";

var to_remove = "a,bb,d,dd".split(',');

results = txt.split(',').filter(word => !to_remove.includes(word)).join();

console.log(results); //output: 'b,c,aa,cc'

但当然需要额外的步骤才能使其与电子表格数据一起使用。

更新

与测试数据相同的代码:

var txt = "10,11,21,à,à,ami,ami,amour,aux,baiser,brusko,brusko,car,ce,comme,comme,compagnon,de,de,déclare,déclare,déteste,électricité,elle,en,est,est,est,et,étudiant,fluide,gare,germes,heures,idéalistes,il,infectueux,je,l,l,la,la,le,lumière,médecine,meilleur,moi,moi,mon,montréal,pée,pensez,poète,que,que,qui,rancune,répondez,sans,science,ses,sic,un,un,vébicule,vôtre,vous";

var to_remove = "à,ai,aie,aient,aies,ait,as,au,aura,aurai,auraient,aurais,aurait,auras,aurez,auriez,aurions,aurons,auront,aux,avaient,avais,avait,avec,avez,aviez,avions,avons,ayant,ayez,ayons,c,ce,ceci,cela,celà,ces,cet,cette,d,dans,de,des,du,elle,en,es,est,et,étaient,étais,était,étant,été,étée,étées,êtes,étés,étiez,étions,eu,eue,eues,eûmes,eurent,eus,eusse,eussent,eusses,eussiez,eussions,eut,eût,eûtes,eux,fûmes,furent,fus,fusse,fussent,fusses,fussiez,fussions,fut,fût,fûtes,ici,il,ils,j,je,l,la,le,les,leur,leurs,lui,m,ma,mais,me,même,mes,moi,mon,n,ne,nos,notre,nous,on,ont,ou,par,pas,pour,qu,que,quel,quelle,quelles,quels,qui,s,sa,sans,se,sera,serai,seraient,serais,serait,seras,serez,seriez,serions,serons,seront,ses,soi,soient,sois,soit,sommes,son,sont,soyez,soyons,suis,sur,t,ta,te,tes,toi,ton,tu,un,une,vos,votre,vous,y".split(',');

results = txt.split(',').filter(word => !to_remove.includes(word)).join();

console.log(results);

这是一个简单的脚本,它遍历所有行(从第二行开始),从 B 列获取停用词,从 C 列获取文本,并将结果放入 D 列:

function myFunction() {
  var sheet    = SpreadsheetApp.getActiveSheet();
  var last_row = sheet.getLastRow();
  var range    = sheet.getRange('B2:C' + last_row);
  var data     = range.getValues();
  var output   = [];

  for (row of data) {
    var stop_words = row[0].split(',');
    var txt        = row[1].split(',');
    var result     = txt.filter(word => !stop_words.includes(word)).join();
    output.push([result]);
  }

  sheet.getRange('D2:D'+last_row).setValues(output);
}

如果每一行的停用词都相同,则脚本可以更简单、更短、更快:

function myFunction2() {
  var sheet      = SpreadsheetApp.getActiveSheet();
  var last_row   = sheet.getLastRow();
  var stop_words = sheet.getRange('B2').getValue().split(','); // get stop words from B2
  var data       = sheet.getRange('C2:C' + last_row).getValues().flat();
  
  var output = data.map(row => 
    [row.split(',').filter(word => !stop_words.includes(word)).join()]
  );

  sheet.getRange('D2:D'+last_row).setValues(output);
}

更新 2

如果你想要一个自定义函数,它就在这里:

function NGRAMSFILTER(stop_words, ngrams) {
  var stop_words = stop_words.split(',');
  return ngrams.split(',').filter(word => !stop_words.includes(word)).join();
}

它需要一个带有停用词的单元格和带有“ngrams”的单元格,并返回不在停用词中的“ngrams”。

更新 3

这是从 B 列收集所有“停用词”的自定义函数:

function NGRAMSFILTER_ALL(ngrams) {
  var sheet      = SpreadsheetApp.getActiveSheet();
  var last_row   = sheet.getLastRow();
  var stop_words = sheet.getRange('B2:B' + last_row).getValues().flat().join(',').split(',');
  return ngrams.split(',').filter(word => !stop_words.includes(word)).join();
}

从技术上讲,它是有效的。但实际上,如果单词和行太多,它可能会经常冻结。而且我认为没有办法加快速度。我建议对此类任务使用静态脚本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-27
    相关资源
    最近更新 更多