Рассчитайте TF-IDF, используя sklearn для переменных n-граммов в python - PullRequest
2 голосов
/ 15 октября 2019

Проблема: использование scikit-learn для определения количества совпадений переменных n-грамм определенного словаря.

Объяснение. Я получил примеры из здесь .

Представьте, что у меня есть корпус, и я хочу найти, сколько хитов (считая) имеет словарный запас, как следующий:

myvocabulary = [(window=4, words=['tin', 'tan']),
                (window=3, words=['electrical', 'car'])
                (window=3, words=['elephant','banana'])

То, что я называю здесь окном, это длина интервала слов, в котором могут появляться слова. следующим образом:

удар оловянного загара (в пределах 4 слов)

удар оловянного загара (в течение 4 слов)

'загара оловянный догпопадание (в пределах 4 слов)

'загар солнечного затмения автомобиля' НЕ поражен. tin и tan появляются на расстоянии более 4 слов друг от друга.

Я просто хочу посчитать, сколько раз (window = 4, words = ['tin', 'tan']) появляется в тексте ито же самое для всех остальных, а затем добавить результат в панд для расчета алгоритма TF-IDF. Я мог найти только что-то вроде этого:

from sklearn.feature_extraction.text import TfidfVectorizer
tfidf = TfidfVectorizer(vocabulary = myvocabulary, stop_words = 'english')
tfs = tfidf.fit_transform(corpus.values())

, где словарь - это простой список строк, состоящий из отдельных слов или нескольких слов.

помимо от scikitlearn:

class sklearn.feature_extraction.text.CountVectorizer
ngram_range : tuple (min_n, max_n)

Нижняя и верхняя граница диапазона значений n для различных извлекаемых n-граммов. Будут использованы все значения n такие, что min_n <= n <= max_n. </p>

тоже не поможет.

Есть идеи? Спасибо.

1 Ответ

2 голосов
/ 17 октября 2019

Я не уверен, что это можно сделать с помощью CountVectorizer или TfidfVectorizer. Я написал свою собственную функцию для этого следующим образом:

import pandas as pd
import numpy as np
import string 

def contained_within_window(token, word1, word2, threshold):
  word1 = word1.lower()
  word2 = word2.lower()
  token = token.translate(str.maketrans('', '', string.punctuation)).lower()
  if (word1 in token) and word2 in (token):
      word_list = token.split(" ")
      word1_index = [i for i, x in enumerate(word_list) if x == word1]
      word2_index = [i for i, x in enumerate(word_list) if x == word2]
      count = 0
      for i in word1_index:
        for j in word2_index:
          if np.abs(i-j) <= threshold:
            count=count+1
      return count
  return 0

SAMPLE:

corpus = [
    'This is the first document. And this is what I want',
    'This document is the second document.',
    'And this is the third one.',
    'Is this the first document?',
    'I like coding in sklearn',
    'This is a very good question'
]

df = pd.DataFrame(corpus, columns=["Test"])

ваш df будет выглядеть так:

    Test
0   This is the first document. And this is what I...
1   This document is the second document.
2   And this is the third one.
3   Is this the first document?
4   I like coding in sklearn
5   This is a very good question

Теперь вы можете применить contained_within_window следующим образом:

sum(df.Test.apply(lambda x: contained_within_window(x,word1="this", word2="document",threshold=2)))

И вы получите:

2

Вы можете просто запустить цикл for для проверки различныхэкземпляров. И вам это нужно, чтобы построить своих панд df и применить к ним TfIdf, что прямо вперед.

Надеюсь, это поможет!

...