Инструмент Python для поиска значимых пар слов в документе
Я пишу программу, которая собирает твиты из Twitter и оценивает текст, чтобы найти актуальные темы. Я планирую использовать NLTK для ограничения условий и выполнения некоторых других операций с данными.
Мне нужен инструмент, который может определить, следует ли рассматривать два смежных слова в твите как один термин. Например, если в Твиттере появляются "поддельные новости", я не хочу относиться к этим двум словам как к разным. Другой пример: если все пишут в Твиттере о "компьютерных науках", не имеет смысла рассматривать компьютер и науку как два разных термина, поскольку они относятся к одной и той же теме. Существует ли инструмент, который может найти такие термины?
3 ответа
То, что вам нужно, это набор данных, называемый "би-грамм", который даст вам оценку того, как часто данная пара слов встречается вместе (то есть частота) в данном языке. Чем выше частота, тем больше вероятность, что пара является термином.
Например, посмотрите на COCA для поиска и загрузки корпуса. У Google есть подобный набор данных. Есть 3 грамма и 4 грамма, обычно называемые н-граммами.
В наборе данных COCA информатика имеет рейтинг частоты 1604; у поддельных новостей 828, а у apple car - 2. Поэтому вам нужно выбрать пороговую частоту, чтобы принять пару в качестве термина.
Вы можете определить набор специальных комбинаций и предварительно обработать вашу фразу перед токенизацией:
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()
Хотя было бы лучше иметь специализированную токенизацию.
Интересная проблема для игры, если предположить, что лексикона значимых сложных слов, которые вы могли бы использовать, уже нет. И я бы хотел видеть "информатику" в качестве актуальной темы.
Давайте рассмотрим тот подход, в котором мы ничего не знаем о составных словах в английском языке: "Стоп знак" так же значимо отличается от "стоп" и "знак", как "делает лучше" от "делает" и "лучше"
Разбивая его, вы хотите построить процесс, который:
- Определяет совмещенные пары
- Отбрасывает любые, которые явно не связаны как составные слова (то есть части речи, собственные имена или знаки препинания)
- Сохраняет пары кандидатов
- Анализирует пары кандидатов на частоту
- Обучает вашу систему искать наиболее ценные пары кандидатов
Это точное описание? Если это так, я думаю, что инструмент, который вы запрашиваете, будет в (4) или (5). Для 4) рассмотрим ассоциативное правило в библиотеке Python Orange как начало. Вы также можете использовать TF-IDF из scikit-learn. Для 5) вы можете выставить вывод из 4) в виде списка, набора или словаря строк со счетчиками.