Я пытаюсь создать независимый от домена инструмент, который будет читать список документов (обзоры продуктов, отзывы, твиты, абзацы из книги) и возвращать матрицу, в которой каждая строка является документом, каждый столбец является понятным ключевым словом, тема, или биграмма, и каждая запись в матрице является горячей, отмечая 1, если ключевое слово существует в документе, или 0, если его нет.
Подход к скрытому распределению Дирихле кажется наиболее подходящим, но я не уверен, как обращаться с нерелевантными документами. Самая большая проблема - интерпретировать результаты, когда их кормят мусором, поскольку они, кажется, вписываются в тему. Если я пытаюсь создать k тем, а затем подать список документов, чтобы увидеть, как они охватываются между темами, я получаю много ошибок с короткими или не относящимися к делу документами. Я считаю, что LDA пытается присвоить все теме, независимо от актуальности. Идеальное решение должно просто выводить все 0.
Учитывая список документов (например, обзоры продуктов на зубную пасту), выведите ключевые темы, обсуждаемые в документах, и двоичный флаг, если тема присутствует в документе. Так например зубная паста отзывов =
toothpaste_data = [
['Love the toothpaste but I ordered a four pack and received one tube.']
,['This works so well on my teeth! I drink a lot of coffee and tea this is perfect for the stains!']
,['After always having a yellow stains cast to my teeth this product took it away, it really, really works.']
,['A bumble bee stung me on the face!']
]
Первые три комментария относятся к зубной пасте, а четвертый комментарий - нет.
Латентное распределение Дирихле пытается назначить тему, даже если представлен не относящийся к делу документ. Например, если использовать LDA, это может привести к появлению 2 столбцов ключевых тем, таких как («действительно работает зубы») и («хорошо окрашивает зубную пасту»). При представлении не относящегося к делу документа низкого качества, такого как [«Шмель задел меня в лицо!»], LDA может попытаться присвоить ему 90% тему 1, 10% тему 2. В идеале это должно быть 0% для обеих тем.
Биграмная точечная взаимная информация кажется многообещающей, и результаты выглядят точными. Единственная проблема, с которой я здесь сталкиваюсь, заключается в том, что в списке документов результаты редки (10 биграмм в списке из 700 документов могут охватывать только 50 комментариев с помощью фильтра freq). Поэтому мне нужно больше освещать темы, которые отсутствуют в биграммах из-за их редкого характера.
Последнее решение, с которым я играл, - это униграммы (отдельные слова) путем суммирования их общих баллов TF-IDF по всему корпусу, а затем фильтрации с использованием частей речи для существительных и глаголов. Я полагаю, что суммирование баллов TF-IDF отрицательно сказывается на цели TF-IDF, «сливая» знаменатель, таким образом, выявляя слова низкого качества. Слова были также очень общими, не давая понимания темы.
Какие-нибудь другие методы извлечения текста на уровне корпуса, которые легко понять? Распределение скрытых дирихлетов - самое близкое рабочее решение, которое у меня есть, я просто не могу сделать его исчерпывающим из моего списка документов и игнорировать документы низкого качества.