如何建设小型直播平台
在上一篇文章中,我在一个小型站点上工作,您可以在其中搜索唐纳德·特朗普最近的演讲,并获得有关他使用某些单词或短语的频率,何时使用以及最常说某些话的统计信息。 作为参考,他是我正在构建的网站的工作原型:
https://trumpspeechdata.herokuapp.com/
现在,假设我要添加一个功能,以便您可以搜索一个主题,并返回有关该主题的所有发言。 现在,您是否曾经在给定站点上搜索过某些内容,而搜索结果与您的实际想法不太接近? 我们可能以前都曾经发生过。 如果我们有成千上万的数据,我要提出的建议可能不可行,但是对于像本网站这样的较小数据块,这既合理,又使我们可以返回更准确的搜索结果。
如果您想继续,这是我到目前为止的数据:
https://www.dropbox.com/s/u4vuwazx609uvvw/trumpspeeches.json?dl=0
我们当前的数据结构如下所示:
{
"speechtitle": "Title of Speech",
"speechdate": "Date of Speech",
"speechlocation": "Location of Speech",
"text": "Entire transcript of Speech",
}
如果用户搜索特定主题,则如果他们的搜索与语音主题匹配,我们可能希望将所有数据返回给用户。 首先,让我们使用以下用户故事:
鲍勃(Bob)的用户搜索“预算”,因此他可以查看唐纳德·特朗普(Donald Trump)在《预算》上的讲话。
我们可以这样做的一种方法是:
let matchingSpeeches = [];
for (var i = 0; i < api.length; i++) {
if(api[i].speechtitle.indexOf(inputValue) > -1) {
matchingspeeches.push([
api[i].speechtitle,
api[i].speechdate,
api[i].speechlocation,
api[i].text,
])
}
}
这基本上是说:“如果语音标题包含要搜索的单词或短语,则将其推入匹配的语音数组中”。 然后,我们将能够将数组的结果格式化为User。 回到鲍勃,这会给他带来想要的东西吗? 是的,只要演讲标题中包含“预算”即可。 但是,如果有关于预算案的演讲,但预算未出现在演讲标题中怎么办? 抱歉,鲍勃,你是SOL。
也许我们可以做与上述相同的事情,但也包括对语音文本的搜索,如下所示:
let matchingSpeeches = [];
for (var i = 0; i < api.length; i++) {
if(api[i].speechtitle.indexOf(inputValue) > -1 || api[i].text.indexOf(inputValue) > -1) {
matchingspeeches.push([
api[i].speechtitle,
api[i].speechdate,
api[i].speechlocation,
api[i].text,
])
}
}
这里我们说的是:“好吧,如果搜索值出现在语音标题或语音文本中,我们会将其推入数组。” 更好吧? 好吧,是的,不是。 如果演讲只涉及堕胎或枪支管制,却只提及预算一次该怎么办? 演讲根本不是关于预算的,但我们仍将其退还给鲍勃,让他整理一下那堆烂摊子。 或者,如果演讲是关于预算的,但在演讲中使用了另一个词,例如“支出”,却没有真正提及“预算”怎么办? 我们可以将用户Bob置于一种情况下,即他得到了有关堕胎的演讲,但没有得到有关Spending的演讲。 对于我们的最终用户Bob来说,这不是一件好事。 这是另一个想法。 让我们在数据结构中添加一个称为“标签”的字段。 然后,对于每个演讲,我们可以添加主题标签。 例如,让我们从JSON数据中获取以下条目:
{
"speechtitle": "Remarks by President Trump at Tax Reform Event",
"speechdate": "September 2017",
"speechlocation": "Indiana",
"text": "speech text here",
}
我们可以将其修改为以下内容:
{
"speechtitle": "Remarks by President Trump at Tax Reform Event",
"speechtags": ["budget", "taxes"],
"speechdate": "September 2017",
"speechlocation": "Indiana",
"text": "speech text here",
}
然后,当Bob进行搜索时,我们可以使用之前的代码,然后遍历这些标签,并返回与搜索输入匹配的标签。 但是,尽管这可能更有针对性,并且从理论上讲我们的搜索结果更好,但我们仍然可能在这里遇到问题。 例如,如果鲍勃搜索“支出”而不是“预算”,该怎么办。 同样,即使它们很接近,由于查询不匹配,该语音也不会发送给bob。 因此,这是我们可以解决该问题的一种方法。 我们要做的是归纳出许多受欢迎的搜索词。 因此,如果用户搜索“支出”,“预算”,“税制改革”或“赤字”,我们仍然会向用户发送带有“预算”标签的结果,因为这非常匹配。 我们要做的是建立一个单词Object。 然后,我们可以将所需的任何单词放入对象中。 该结构将如下所示:
var mapObj = {
"a" : "b",
"c" : "b",
"d" : "b",
"e" : "b",
}
这里的想法是,如果用户Bob搜索“ a”,我们将给他“ b”。 如果他搜索“ c”,“ d”或“ e”,我们仍将其赋予“ b”。 这就是我们上面描述的。 基本上,如果他搜索“支出”,我们将返回“预算”。 但是,如果他搜索“税制改革”或“赤字”或“预算”,我们仍将返回包含“预算”的结果,因为这仍然是一个很好的匹配。
现在,我们需要添加一些正则表达式以匹配输入字符串。 代码如下所示:
var mapObj = {
"spending" : "budget",
"tax reform" : "budget",
"deficit" : "budget",
"budget" : "budget",
};
var re = new RegExp(Object.keys(mapObj).join("|"), "gi");
keyWord = str.replace(re, function(matched) {
return mapObj[matched.toLowerCase()];
});
我们使用正则表达式来匹配用户搜索的内容,然后将其替换为其他内容。 因此,现在我们可以在前面的代码中使用变量“ keyWord”,并使用我们创建的speechtags字段:
let matchingSpeeches = [];
for (var i = 0; i < api.length; i++) {
if(api[i].speechtags.indexOf(keyWord) > -1) {
matchingspeeches.push([
api[i].speechtitle,
api[i].speechdate,
api[i].speechlocation,
api[i].text,
])
}
}
现在,正如我前面提到的,这可能无法在很大的范围内很好地工作,但是我认为在这种情况下它可以工作,因为我们的范围非常有限。 因为主题是政治,所以用户可能输入的搜索词太多。 而且,如果我们没有得到与他们输入的任何匹配,我们总是可以在其中放置一些代码来返回给用户。 例如,如果Bob搜索“鸡肉汤”,我们可能没有很多数据可用。 由于可能的搜索词受到一定程度的限制,因此我们可以修改搜索对象以包含尽可能多的可能性,以匹配我们正在使用的所有标签,例如:
var mapObj = {
"spending" : "budget",
"tax reform" : "budget",
"deficit" : "budget",
"budget" : "budget",
"abortion" : "abortion",
"women's rights" : "abortion",
"pro life" : "abortion",
"pro choice" : "abortion",
"healthcare" : "healthcare",
"obamacare" : "healthcare",
"health reform" : "healthcare",
"medicaid" : "healthcare",
};
var re = new RegExp(Object.keys(mapObj).join("|"), "gi");
keyWord = str.replace(re, function(matched) {
return mapObj[matched.toLowerCase()];
});
然后,我们可以返回并在每个语音中添加标签,以匹配我们正在使用的关键字。 我们可以手动执行此操作,特别是在我们的数据集很小的情况下,或者可以使用JavaScript或Python或其他任何方法,但在此不做介绍。 同样,即使在这种情况下,我们仍然会遇到一些问题,但是如果您正在寻找一种快速的方法来使返回的结果更具针对性,这也不错,尤其是对于较小的数据集。
翻译自: https://hackernoon.com/creating-more-accurate-search-results-for-small-sites-436e64da79b6
如何建设小型直播平台