Форум программистов, компьютерный форум, киберфорум
Konst2016
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  

Основы препроцессоринга текста для NLP

Запись от Konst2016 размещена 22.01.2022 в 14:14
Показов 1391 Комментарии 0
Метки nlp, python, python3, sklearn

Нажмите на изображение для увеличения
Название: knigi.jpg
Просмотров: 280
Размер:	166.6 Кб
ID:	7377
Здравствуйте дорогие читатели!В этой статье я хочу показать реализованные неким автором By torselllo c сайта nlpx.net http://nlpx.net/archives/57
tf-idf (term frequency-inverse document frequency или на рус., частотность терминов-обратная частотность документов) и и их же реализацию на
sklearn(пакет sklearn.feature_extraction.text) а также bag of words (мешок слов) или count vector(вектор счета)-тот же пакет.
Итак,
Term Frequency
TF — это частотность термина, которая измеряет, насколько часто термин встречается в документе.
Формула:
Bash
1
TF термина а = (Количество раз, когда термин а встретился в тексте / количество всех слов в тексте)
Реализация:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
import collections
 
def compute_tf(text):
#На вход берем текст в виде списка (list) слов
    #Считаем частотность всех терминов во входном массиве с помощью 
    #метода Counter библиотеки collections
    tf_text = collections.Counter(text)
    for i in tf_text:
        #для каждого слова в tf_text считаем TF путём деления
        #встречаемости слова на общее количество слов в тексте
        tf_text[i] = tf_text[i]/float(len(text))
    #возвращаем объект типа Counter c TF всех слов текста
    return tf_text
Bash
1
2
3
4
text = ['hasta', 'la', 'vista', 'baby', 'la', 'vista', 'la']
print compute_tf(text)
Out: Counter({'la': 0.42857142857142855, 'vista': 0.2857142857142857, 
'hasta': 0.14285714285714285, 'baby': 0.14285714285714285})
Inverse Document Frequency
IDF — это обратная частотность документов. Она измеряет непосредственно важность термина. То есть, когда мы считали TF, все термины считаются как бы равными
по важности друг другу. Но всем известно, что, например, предлоги встречаются очень часто, хотя практически не влияют на смысл текста.
И что с этим поделать? Ответ прост — посчитать IDF.
Формула:
Bash
1
IDF термина а = логарифм(Общее количество документов / Количество документов, в которых встречается термин а)
Реализация:
Python
1
2
3
4
5
6
7
8
import math
 
def compute_idf(word, corpus):
#на вход берется слово, для которого считаем IDF
#и корпус документов в виде списка списков слов
        #количество документов, где встречается искомый термин
        #считается как генератор списков
        return math.log10(len(corpus)/sum([1.0 for i in corpus if word in i]))
Bash
1
2
3
4
5
6
        
texts = [['pasta', 'la', 'vista', 'baby', 'la', 'vista'], 
['hasta', 'siempre', 'comandante', 'baby', 'la', 'siempre'], 
['siempre', 'comandante', 'baby', 'la', 'siempre']]
print compute_idf('pasta', texts)
Out: 0.47712125472
Term Frequency — Inverse Document Frequency
А затем мы умножаем TF на IDF и получаем — TF-IDF!
Bash
1
TF-IDF термина а = (TF термина а) * (IDF термина а)
(реализацию пропустил).
Итак поработаем с sklearn для корпуса
Python
1
2
3
4
corpus = [
    "I like this movie, it`s funny", "I hate this movie.",
    "This was awersome!I like it.", "Nice one, I love it."
]
Bag of words:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
from sklearn.feature_extraction.text import CountVectorizer
 
 
corpus = [
    "I like this movie, it`s funny", "I hate this movie.",
    "This was awersome!I like it.", "Nice one, I love it."
]
cv = CountVectorizer()
 
word_count_vector = cv.fit_transform(corpus)
print(word_count_vector.toarray())
"""
->
[[0 1 0 1 1 0 1 0 0 1 0]
 [0 0 1 0 0 0 1 0 0 1 0]
 [1 0 0 1 1 0 0 0 0 1 1]
 [0 0 0 1 0 1 0 1 1 0 0]]
"""
Tf-idf:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.feature_extraction.text import CountVectorizer
 
corpus = [
    "I like this movie, it`s funny", "I hate this movie.",
    "This was awersome!I like it.", "Nice one, I love it."
]
       
cv = CountVectorizer()
 
word_count_vector = cv.fit_transform(corpus)
print(word_count_vector.toarray())
"""
->
[[0 1 0 1 1 0 1 0 0 1 0]
 [0 0 1 0 0 0 1 0 0 1 0]
 [1 0 0 1 1 0 0 0 0 1 1]
 [0 0 0 1 0 1 0 1 1 0 0]]
"""
tfidf_transformer = TfidfTransformer(smooth_idf=True, use_idf=True)
tfidf_transformer.fit(word_count_vector)
print(tfidf_transformer.idf_)
"""
->
[1.91629073 1.91629073 1.91629073 1.22314355 1.51082562 1.91629073
 1.51082562 1.91629073 1.91629073 1.22314355 1.91629073]
 
"""
Метки nlp, python, python3, sklearn
Размещено в Без категории
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Новые блоги и статьи
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
Асинхронный приём данных из COM-порта
Argus19 01.05.2026
Асинхронный приём данных из COM-порта Купил на aliexpress термопринтер QR701. Он оказался странным. Поключил к Arduino Nano. Был очень удивлён. Наотрез отказывается печатать русские буквы. Чтобы. . .
попытка написать игровой сервер на C++
pyirrlicht 29.04.2026
попытка написать игровой сервер на плюсах с открытым бесконечным миром. возможно получится прикрутить интерпретатор питон для кастомизации игровой логики. что есть на текущий момент:. . .
Контроль уникальности выбранного документа-основания при изменении реквизита
Maks 28.04.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРемонтСпецтехники", разработанного в КА2. Задача: уведомлять пользователя, если указанная заявка (документ-основание). . .
Благородство как наказание
Maks 24.04.2026
У хорошего человека отношения с женщинами всегда складываются трудно. А я человек хороший. Заявляю без тени смущения, потому что гордиться тут нечем. От хорошего человека ждут соответствующего. . .
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru