我正在编写一个程序,该程序从 Twitter 收集推文,并评估文本以找到热门话题。我计划使用 NLTK 来阻止条款并对数据进行一些其他操作。
我需要的是一个工具,它可以确定推文中的两个相邻单词是否应该被视为一个词。例如,如果“假新闻”在 Twitter 上流行,我不想将这两个词视为不同的词。另一个例子,如果每个人都在推特上谈论“计算机科学”,那么将计算机和科学视为两个不同的术语是没有意义的,因为它们指的是同一个主题。是否存在可以找到此类术语的工具?
我正在编写一个程序,该程序从 Twitter 收集推文,并评估文本以找到热门话题。我计划使用 NLTK 来阻止条款并对数据进行一些其他操作。
我需要的是一个工具,它可以确定推文中的两个相邻单词是否应该被视为一个词。例如,如果“假新闻”在 Twitter 上流行,我不想将这两个词视为不同的词。另一个例子,如果每个人都在推特上谈论“计算机科学”,那么将计算机和科学视为两个不同的术语是没有意义的,因为它们指的是同一个主题。是否存在可以找到此类术语的工具?
您需要的是一个名为“bi-gram”的数据集,它可以评估给定的一对单词在给定语言中一起出现的频率(即频率)。频率越高,该对越有可能是一个术语。
例如,查看COCA以获得可搜索和可下载的语料库。谷歌也有类似的数据集。有 3-gram 和 4-gram,一般称为n-gram。
在 COCA 数据集中,计算机科学的频率等级为 1604;假新闻有 828 个,而苹果汽车有 2 个。所以你需要确定阈值频率来接受这对作为一个术语。
有趣的问题,假设你还没有可以利用的有意义的复合词词典。我很乐意将“计算机科学”视为一个热门话题。
让我们采取一种我们对英语中的复合词一无所知的方法,“stop sign”是否与“stop”和“sign”有明显的区别,就像“does better”与“does”和“better”一样
分解它,您想要构建一个流程:
这是一个准确的描述吗?如果是这样,我认为您要求的工具将在 (4) 或 (5) 中。对于 4),以 Python 的 Orange 库中的关联规则为起点。你也可以使用 scikit-learn 的 TF-IDF。对于 5),您可以将 4) 的输出公开为带有计数的字符串的列表、集合或字典。
您可以定义一组特殊组合并在标记化之前预处理您的短语:
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()
不过,最好有一个专门的标记化。