0

我正在编写一个程序,该程序从 Twitter 收集推文,并评估文本以找到热门话题。我计划使用 NLTK 来阻止条款并对数据进行一些其他操作。

我需要的是一个工具,它可以确定推文中的两个相邻单词是否应该被视为一个词。例如,如果“假新闻”在 Twitter 上流行,我不想将这两个词视为不同的词。另一个例子,如果每个人都在推特上谈论“计算机科学”,那么将计算机和科学视为两个不同的术语是没有意义的,因为它们指的是同一个主题。是否存在可以找到此类术语的工具?

4

3 回答 3

1

您需要的是一个名为“bi-gram”的数据集,它可以评估给定的一对单词在给定语言中一起出现的频率(即频率)。频率越高,该对越有可能是一个术语。

例如,查看COCA以获得可搜索和可下载的语料库。谷歌也有类似的数据集。有 3-gram 和 4-gram,一般称为n-gram

在 COCA 数据集中,计算机科学的频率等级为 1604;假新闻有 828 个,而苹果汽车有 2 个。所以你需要确定阈值频率来接受这对作为一个术语。

于 2018-10-09T22:06:39.083 回答
0

有趣的问题,假设你还没有可以利用的有意义的复合词词典。我很乐意将“计算机科学”视为一个热门话题。

让我们采取一种我们对英语中的复合词一无所知的方法,“stop sign”是否与“stop”和“sign”有明显的区别,就像“does better”与“does”和“better”一样

分解它,您想要构建一个流程:

  1. 识别共同定位的对
  2. 删除任何明显不相关的复合词(即词性、专有名称或标点符号)
  3. 保存候选对
  4. 分析候选对的频率
  5. 教您的系统寻找最有价值的候选对

这是一个准确的描述吗?如果是这样,我认为您要求的工具将在 (4) 或 (5) 中。对于 4),以 Python 的 Orange 库中的关联规则为起点。你也可以使用 scikit-learn 的 TF-IDF。对于 5),您可以将 4) 的输出公开为带有计数的字符串的列表、集合或字典。

于 2018-10-09T21:38:17.503 回答
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()

不过,最好有一个专门的标记化。

于 2018-10-09T21:45:01.987 回答