在 Google 工作表中,从包含主要 sheet 中逗号分隔的 ngram 列表的单元格中删除 ngram 系列

In Google Sheets remove serie of ngrams from cells containing lists of comma separated ngrams in primary sheet

一直在 Google 表格中工作,一般 table 包含大约一千篇文章。在一列派生形式中,包含原始“书面”形式文本的列是从中提取的 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 做了一些巧妙的事情,用自定义函数编写了一个脚本来做几件事,其中包括从辅助 sheet 调用列表,以清理此类 ngrams-文字标记,但他所做的既超过了我想做的,也超过了我自己在 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,aviions,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,eûse,eussent,eusses,eussiez,eutes,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

我正在寻找的输出示例 —

从短文本派生的 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,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

输出: ami,ami,amour,baiser,brusko,brusko,car,comme,comme,compagnon,déclare,déclare,déteste,électricité,étudiant,fluide,gare,germes,heures,idéalistes,infectueux,lumière,médecine,meilleur,montréal, pée,pensez,poète,rancune,répondez,science,sic,vébicule,vôtre

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

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”的单元格,returns不在停用词中的“ngrams”。

更新 3

这是从 B 列收集所有 'stop words' 的自定义函数:

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();
}

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