自动标记LDA生成的主题

时间:2017-05-15 17:41:16

标签: python nlp lda topic-modeling labeling

我正在尝试对客户反馈进行分类,我在python中运行了一个LDA,得到了以下10个主题的输出:

modelBuilder.Entity<Course>().HasRequired(c => c.Caption).WithRequiredPrincipal(c => c.Course);

有没有办法自动标注它们?我有一个csv文件,其中有手动标记的反馈,但我不想自己提供这些标签。我希望模型创建标签。有可能吗?

1 个答案:

答案 0 :(得分:1)

此处的评论链接到另一个a paper链接的SO答案。假设您想做最少的事情来尝试完成这项工作。这是对我有用的MVP风格的解决方案:在Google中搜索字词,然后在响应中查找关键字。

虽然有些hacky,但这里有一些工作代码:

pip install cssselect

然后

from urllib.parse import urlencode, urlparse, parse_qs
from lxml.html import fromstring
from requests import get
from collections import Counter


def get_srp_text(search_term):
    raw = get(f"https://www.google.com/search?q={topic_terms}").text
    page = fromstring(raw)


    blob = ""

    for result in page.cssselect("a"):
        for res in result.findall("div"):
            blob += ' '
            blob += res.text if res.text else " "
            blob += ' '
    return blob


def blob_cleaner(blob):
    clean_blob = blob.replace(r'[\/,\(,\),\:,_,-,\-]', ' ')
    return ''.join(e for e in blob if e.isalnum() or e.isspace())


def get_name_from_srp_blob(clean_blob):
    blob_tokens = list(filter(bool, map(lambda x: x if len(x) > 2 else '', clean_blob.split(' '))))
    c = Counter(blob_tokens)
    most_common = c.most_common(10)

    name = f"{most_common[0][0]}-{most_common[1][0]}"
    return name

pipeline = lambda x: get_name_from_srp_blob(blob_cleaner(get_srp_text(x)))

然后,您可以从模型中获取主题词,例如

topic_terms = "delivery area mile option partner traffic hub thanks city way"

name = pipeline(topic_terms)
print(name)

>>> City-Transportation

topic_terms = "package address time customer apartment delivery number item support door"

name = pipeline(topic_terms)
print(name)

>>> Parcel-Package

您可以对此进行很多改进。例如,您可以使用POS标签仅找到最常见的名词,然后将其用作名称。或找到最常见的形容词和名词,并命名为“形容词名词”。更好的是,您可以从链接的站点获取文本,然后运行YAKE提取关键字。

无论如何,这演示了一种简单的方法来自动命名集群,而无需使用机器学习直接 (尽管Google肯定会使用它来生成搜索结果,因此您会从中受益)。