统计词频时能否合并两个词计算?附Python实现代码
关于词频统计中合并词语的问题解答
当然可以啊!把固定搭配或者特定的两个词合并成一个整体再统计词频,在很多场景下特别实用——比如处理专业术语、常用短语的时候,这样统计出来的结果会更贴合实际语义,而不是把原本关联的两个词拆分开来统计,丢失了搭配的含义。
结合你给出的top_N高频词统计代码,我给你调整一下,加入合并指定词对的逻辑:
首先,咱们先明确要合并的词对(比如把"customer service"合并成"customer_service",后续统计时就会当作一个独立词),然后在预处理阶段先完成替换,再走原来的统计流程。修改后的代码如下:
import string import pandas as pd from collections import Counter from sklearn.feature_extraction.text import ENGLISH_STOP_WORDS as stopwords # 定义需要合并的词对(这里可以根据你的需求添加更多) target_word_pairs = [ ("customer", "service"), ("machine", "learning"), ("data", "analysis") ] top_N = 100 words = review_tip['user_tip'].dropna() words = words.astype(str) # 第一步:先替换需要合并的词对为整体(用下划线连接避免拆分) for pair in target_word_pairs: # 构造要替换的短语,比如"customer service" → "customer_service" phrase = ' '.join(pair) merged_word = '_'.join(pair) words = words.str.replace(phrase, merged_word, regex=False) # 接下来是你原来的预处理流程 words = words.str.replace('[{}]'.format(string.punctuation), '') words = words.str.lower().apply(lambda x: ' '.join([word for word in x.split() if word not in stopwords])) # 处理|符号和停用词(这里注意RE_stopwords需要你提前定义,如果是额外的停用词表) words = words.str.lower().replace([r'\|', RE_stopwords], [' ', ''], regex=True).str.cat(sep=' ').split() # 生成高频词统计结果 rslt = pd.DataFrame(Counter(words).most_common(top_N), columns=['Word', 'Frequency']) print(rslt)
关键说明:
- 替换词对的时候用
regex=False是为了避免特殊字符干扰,确保精准匹配短语 - 用下划线连接合并后的词,是因为后续拆分的时候不会把它拆回两个词,统计时会被当作一个独立的单元
- 如果有更多需要合并的词对,直接在
target_word_pairs列表里添加就行
如果你的需求是自动识别文本中的高频双词搭配(而不是手动指定),那还可以用nltk的工具来自动挖掘,比如:
from nltk.collocations import BigramCollocationFinder from nltk.metrics import BigramAssocMeasures # 先把文本处理成单词列表(这里用你预处理后的words列表) finder = BigramCollocationFinder.from_words(words) # 过滤掉出现次数太少的搭配 finder.apply_freq_filter(5) # 计算点互信息,获取Top 20的双词搭配 top_bigrams = finder.nbest(BigramAssocMeasures.pmi, 20) # 后续可以把这些搭配合并成整体再统计词频,具体实现可以根据需求调整预处理流程
不过手动指定词对的方式更直接可控,适合你已经明确知道要合并哪些短语的场景。
内容的提问来源于stack exchange,提问作者user9415956
相关产品推荐
相关产品推荐

