一千萬個為什麽

搜索

檢測文本樣本中的樣板

我有一個非結構化文本語料庫,由於來自不同來源的串聯,我有想要刪除的樣板元數據。例如:

作者提供的描述:我的目標......

     

作者提供:我的目標...

     

我的目標... END OF TRANSCRIPT

     

我的目標...結束,由XYZ公司贊助

     

我的目標......贊助商:XYZ公司,保留所有權利,日期:10/21

可以假設該樣板發生在每個樣品的開始或結束時。什麽是一些強大的方法來解決這個數據?

最佳答案

這可能會讓你開始。短語長度由range()函數決定。基本上這會標記並創建n-gram。然後它計算每個令牌。在所有文檔中具有高平均值的標記(經常跨文檔出現)在最後一行打印出來。

from sklearn.feature_extraction.text import CountVectorizer
import numpy as np
import nltk

text = """DESCRIPTION PROVIDED BY AUTHOR: The goal of my a...
Author provided: The goal of my b...
The goal of my c... END OF TRANSCRIPT
The goal of my d... END SPONSORED BY COMPANY XYZ
The goal of my e... SPONSORED: COMPANY XYZ All rights reserved date: 10/21
"""

def todocuments(lines):
    for line in lines:
        words = line.lower().split(' ')
        doc = ""
        for n in range(3, 6):
            ts = nltk.ngrams(words, n)
            for t in ts: doc = doc + " " + str.join('_', t) 
        yield doc

cv = CountVectorizer(min_df=.5)

fit = cv.fit_transform(todocuments(text.splitlines()))
vocab_idx = {b: a for a, b in cv.vocabulary_.items()}

means = fit.mean(axis=0)
arr = np.squeeze(np.asarray(means))
[vocab_idx[idx] for idx in np.where(arr > .95)[0]]
# ['goal_of_my', 'the_goal_of', 'the_goal_of_my']

轉載註明原文: 檢測文本樣本中的樣板