如何获得文本数据中三元组的确切频率?

如何解决如何获得文本数据中三元组的确切频率?

我想知道如何获得三元组的确切频率。我认为我使用的功能更多是为了获得“重要性”。有点像频率,但又不一样。

明确地说,三元组是连续的 3 个单词。标点符号不影响三元组,至少我不想。

我对频率的定义是:我想要三元组所在的评论数量,至少一次。

以下是我通过网络抓取获取数据库方法

import re
import json
import requests
from requests import get
from bs4 import BeautifulSoup
import pandas as pd
import numpy as np
import datetime
import time
import random


root_url = 'https://fr.trustpilot.com/review/www.gammvert.fr'
urls = [ '{root}?page={i}'.format(root=root_url,i=i) for i in range(1,807) ]

comms = []
notes = []
dates = []

for url in urls: 
    results = requests.get(url)

    time.sleep(20)

    soup = BeautifulSoup(results.text,"html.parser")

    commentary = soup.find_all('section',class_='review__content')

    for container in commentary:

        try:
            comm  = container.find('p',class_ = 'review-content__text').text.strip()

        except:
            comm = container.find('a',class_ = 'link link--large link--dark').text.strip()

        comms.append(comm)

        note = container.find('div',class_ = 'star-rating star-rating--medium').find('img')['alt']
        notes.append(note)

        date_tag = container.div.div.find("div",class_="review-content-header__dates")
        date = json.loads(re.search(r"({.*})",str(date_tag)).group(1))["publishedDate"]

        dates.append(date)

data = pd.DataFrame({
    'comms' : comms,'notes' : notes,'dates' : dates
    })

data['comms'] = data['comms'].str.replace('\n','')

data['dates'] = pd.to_datetime(data['dates']).dt.date
data['dates'] = pd.to_datetime(data['dates'])

data.to_csv('file.csv',sep=';',index=False)

这是我用来获取我的 comms_clean函数

def clean_text(text):
    text = tokenizer.tokenize(text)
    text = nltk.pos_tag(text)
    text = [word for word,pos in text if (pos == 'NN' or pos == 'NNP' or pos == 'NNS' or pos == 'NNPS')
]
    text = [word for word in text if not word in stop_words]
    text = [word for word in text if len(word) > 2]
    final_text = ' '.join( [w for w in text if len(w)>2] ) #remove word with one letter
    return final_text

data['comms_clean'] = data['comms'].apply(lambda x : clean_text(x))

data['month'] = data.dates.dt.strftime('%Y-%m')

这是我的数据库的一些行:

database

这里是我用来获取数据库中trigram频率的函数

def get_top_n_gram(corpus,ngram_range,n=None):
    vec = CountVectorizer(ngram_range=ngram_range,stop_words = stop_words).fit(corpus)
    bag_of_words = vec.transform(corpus)
    sum_words = bag_of_words.sum(axis=0) 
    words_freq = [(word,sum_words[0,idx]) for word,idx in vec.vocabulary_.items()]
    words_freq =sorted(words_freq,key = lambda x: x[1],reverse=True)
    return words_freq[:n]

def process(corpus):
    corpus = pd.DataFrame(corpus,columns= ['Text','count']).sort_values('count',ascending = True)
    return corpus

这是这行代码的结果:

trigram = get_top_n_gram(data['comms_clean'],(3,3),10)

trigram = process(trigram)
trigram.sort_values('count',ascending=False,inplace=True)

trigram.head(10)

trigram

让我向您展示它似乎不一致但数量很少。我将展示上图的第 6 个三卦:

df = data[data['comms_clean'].str.contains('très bon état',regex=False,case=False,na=False)]

df.shape

(150,5)



df = data[data['comms_clean'].str.contains('rapport qualité prix',na=False)]

df.shape

(148,5)



df = data[data['comms_clean'].str.contains('très bien passé',na=False)]

df.shape

(129,5)

所以用我的函数,我们有:

146
143
114

当我检查其中包含该卦的评论数量时,我得到了:

150
148
129

不是很远,但我有确切的数字。

所以我想知道:如何获得该卦的确切频率?而不是某种重要性。重要性很好,不要误会我的意思,但我也想知道正确的数字。

我试过了:

from nltk.util import ngrams

for i in range(1,16120):
    Counter(ngrams(data['comms_clean'][i].split(),3))

但我找不到如何连接循环中的所有计数器。

谢谢。

编辑:

stop_words = set(stopwords.words('french'))
stop_words.update(("Gamm","gamm"))

tokenizer = nltk.tokenize.RegexpTokenizer(r'\w+')
lemmatizer = french.Defaults.create_lemmatizer()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?