擅长:python、mysql、java
<p>你的代码有几个问题,其中一些已经被指出,而另一些问题(例如在tweet文本中识别标签)没有。下面是一个不包含后一个问题的细节的部分解决方案:</p>
<pre><code>def HASHcount(name, words):
dic = dict.fromkeys(words, 0)
with open(name,"r") as f:
for line in f:
for w in words:
if '#' + w in line:
dic[w] += 1
return dic
</code></pre>
<p>这提供了几个简化,关键在于tweet中的hashtags确实以<code>#</code>开头(你不希望在<code>dic</code>中出现),因此不值得分析每一行,因为{<cd1>}不能出现在文本中。在</p>
<p><strong>然而</strong>在其他答案中,它仍然有一个问题的一小部分(除了刚刚注释掉这个最微妙的部分的那个!-)它可以通过部分匹配得到误报。当检查就像<code>word in linetext</code>时,问题将是巨大的,例如如果一个单词是<code>cat</code>,那么即使它出现在非常普通的文本中(它本身或者作为另一个单词的一部分,例如<code>vindicative</code>),它也会被算作标签。使用<code>'#' +</code>方法会更好一些,但是前缀匹配仍然会导致误报,例如<code>#catalog</code>将错误地计算为<code>cat</code>的命中。在</p>
<p>正如一些人建议的那样,正则表达式可以帮助实现这一点。但是,这里有一个<code>for w in words</code>循环体的替代方案。。。在</p>
^{pr2}$
<p>剩下的唯一问题是确定哪些字符可以作为hashtags的一部分,也就是说,集合<code>chars_acceptable_in_hashes</code>我没有记住Twitter的规范,所以我不知道它是什么,但你肯定可以找到。请注意,这也适用于行尾,因为<code>line</code>有<strong>没有</strong>被剥离,所以它以<code>\n</code>结尾。它不在可接受的集合中(所以在行尾的hashtag也将“正确终止”)。在</p>