我正在编写一个程序,该程序从Twitter收集推文,并评估文本以查找热门话题。我正计划使用NLTK来阻止术语并对数据进行一些其他操作。
我需要一个可以确定是否应该将一条推文中的两个相邻单词视为一个术语的工具。例如,如果Twitter上流行“假新闻”,那么我不想将这两个词视为不同。再举一个例子,如果每个人都在推特上谈论“计算机科学”,那么将计算机和科学视为两个不同的术语是没有意义的,因为它们指的是同一主题。是否存在可以找到此类术语的工具?
答案 0 :(得分:1)
您需要的是一个称为“ bi-gram”的数据集,它将为您提供给定单词对在特定语言中一起出现的频率(即频率)的等级。频率越高,该对是一个术语的可能性越大。
例如,查看COCA中可搜索和可下载的语料库。 Google有类似的数据集。有3克和4克,通常称为 n-grams 。
在COCA数据集中,计算机科学的频率额定值为1604; 假新闻有828,苹果汽车有2。因此,您需要确定阈值频率以接受该对作为项。
答案 1 :(得分:0)
要解决的有趣问题,假设还没有可以利用的有意义的复合词词典。而且,我很希望将“计算机科学”作为一个热门话题。
让我们采取一种方法,我们对英语复合词一无所知,“停止符号”是否与“停止”和“符号”一样有意义 “做得更好”来自“做得更好”
打破它,您想构建一个流程:
这是准确的描述吗? 如果是这样,我认为您要求的工具将在(4)或(5)中。对于4),请以Python的Orange库中的关联规则为起点。您也可以使用scikit-learn中的TF-IDF。对于5),您可以将4)的输出显示为带有计数的字符串列表,集合或字典。
答案 2 :(得分:0)
您可以定义一组特殊组合并在标记化之前对短语进行预处理:
import nltk
def preprocess_text(original_text):
specials = {"computer vision": "computer_vision",
"fake news": "fake_news"}
out = original_text.lower()
for k in specials:
out = out.replace(k, specials[k])
return out
def main():
txt = preprocess_text("Computer vision has nothing to do wiht fake news")
tokens = nltk.word_tokenize(txt)
nltk.FreqDist(tokens).tabulate()
if __name__ == "__main__":
main()
不过,最好有专门的标记。