2012-03-31 24 views
13

Tôi đang cố gắng tìm các thẻ (từ khóa) cho một công thức bằng cách phân tích cú pháp chuỗi văn bản dài. Các văn bản có chứa các thành phần công thức, hướng dẫn và một blurb ngắn.Kỹ thuật loại bỏ các từ phổ biến (và các phiên bản số nhiều) từ một chuỗi

Bạn nghĩ cách nào là cách hiệu quả nhất để xóa các từ phổ biến khỏi danh sách thẻ?

By từ thông dụng, tôi muốn nói những từ như: 'the', 'at', 'có', 'họ' vv

tôi có 2 phương pháp tôi có thể sử dụng, mà bạn có nghĩ là hiệu quả hơn về tốc độ và bạn có biết cách hiệu quả hơn tôi có thể làm được điều này không?

Phương pháp 1:
- Xác định số lần mỗi từ xảy ra (bằng cách sử dụng bộ sưu tập thư viện)
- Có một danh sách các từ phổ biến và loại bỏ tất cả 'Words Common' từ đối tượng Bộ sưu tập bằng cách cố gắng để xóa khóa đó từ đối tượng Bộ sưu tập nếu nó tồn tại.
- Do đó tốc độ sẽ được xác định bởi độ dài của biến delims

import collections from Counter 
delim  = ['there','there\'s','theres','they','they\'re'] 
# the above will end up being a really long list! 
word_freq = Counter(recipe_str.lower().split()) 
for delim in set(delims): 
    del word_freq[delim] 
return freq.most_common() 

Phương pháp 2:
- Đối với những từ phổ biến mà có thể nhiều, nhìn vào mỗi từ trong chuỗi công thức, và kiểm tra xem nó một phần chứa phiên bản không số nhiều của một từ chung. Ví dụ; Đối với chuỗi "Có một bài kiểm tra", hãy kiểm tra từng từ để xem nó có chứa "đó" hay không và xóa nó nếu có.

delim   = ['this','at','them'] # words that cant be plural 
partial_delim = ['there','they',] # words that could occur in many forms 
word_freq  = Counter(recipe_str.lower().split()) 
for delim in set(delims): 
    del word_freq[delim] 
# really slow 
for delim in set(partial_delims): 
    for word in word_freq: 
     if word.find(delim) != -1: 
      del word_freq[delim] 
return freq.most_common() 
+3

Tôi không thể cung cấp cho bạn câu trả lời đầy đủ ở đây, nhưng tôi muốn đề cập đến điều gì đó có thể giúp bạn. Khi thực hiện bất kỳ loại phân tích văn bản nào, bạn thường muốn có thể điều trị số nhiều, chia động từ và các biến đổi khác như tất cả liên quan đến cùng một 'từ'. Ví dụ: bạn có thể muốn xử lý delimit, delimits, delimited, delimiter, delimiters ... như nhau. Quá trình này được gọi là 'bắt nguồn' và có một số thuật toán được nghiên cứu kỹ lưỡng, với các ví dụ từ nhiều ngôn ngữ lập trình khác nhau, sẽ cố gắng thực hiện điều này cho bạn. Chúc may mắn! Ước gì tôi có thể giúp đỡ nhiều hơn. – soundslikeneon

+2

Thực ra, tôi đề nghị khá nhiều điều ngược lại. Nếu mục đích là hoàn toàn "xóa" các từ "phổ biến" được xác định trước, tôi chỉ cần tạo danh sách đầy đủ, hoàn chỉnh với tất cả các biến thể của từng từ mà bạn muốn xóa. Đừng lo lắng về những từ nào là số nhiều trong đó. Dễ dàng hơn nhiều/nhanh hơn/ít lỗi hơn. –

Trả lời

9

Miền sự cố của bạn là "Natural Language Processing".

Nếu bạn không muốn phát minh lại bánh xe, hãy sử dụng NLTK, tìm kiếm stemming trong tài liệu.

Cho rằng NLP là một trong những đối tượng khó khăn nhất trong khoa học máy tính, tái phát minh bánh xe này là rất nhiều công việc ...

1

Bạn hỏi về tốc độ, nhưng bạn nên quan tâm nhiều hơn với độ chính xác. Cả hai đề xuất của bạn sẽ gây ra rất nhiều lỗi, xóa quá nhiều hoặc quá ít (ví dụ: có rất nhiều từ có chứa chuỗi con "at"). Tôi thứ hai gợi ý để xem xét các module nltk. Trên thực tế, một trong những ví dụ đầu tiên trong số the NLTK book liên quan đến việc xóa các từ phổ biến cho đến khi những từ phổ biến nhất còn lại tiết lộ điều gì đó về thể loại này. Bạn sẽ nhận được không chỉ các công cụ, mà còn hướng dẫn cách thực hiện nó.

Dù sao, bạn sẽ dành nhiều thời gian hơn để viết chương trình của mình hơn là máy tính của bạn sẽ chi tiêu thực hiện nó, vì vậy hãy tập trung vào thực hiện tốt.

23

Tôi chỉ muốn làm một cái gì đó như thế này:

from nltk.corpus import stopwords 
s=set(stopwords.words('english')) 

txt="a long string of text about him and her" 
print filter(lambda w: not w in s,txt.split()) 

mà in

['long', 'string', 'text'] 

và trong điều kiện phức tạp nên O (n) trong số từ trong chuỗi, nếu bạn tin rằng việc tra cứu bộ băm là O (1).

FWIW, phiên bản của tôi về NLTK định nghĩa 127 stopwords:

'all', 'just', 'being', 'over', 'both', 'through', 'yourselves', 'its', 'before', 'herself', 'had', 'should', 'to', 'only', 'under', 'ours', 'has', 'do', 'them', 'his', 'very', 'they', 'not', 'during', 'now', 'him', 'nor', 'did', 'this', 'she', 'each', 'further', 'where', 'few', 'because', 'doing', 'some', 'are', 'our', 'ourselves', 'out', 'what', 'for', 'while', 'does', 'above', 'between', 't', 'be', 'we', 'who', 'were', 'here', 'hers', 'by', 'on', 'about', 'of', 'against', 's', 'or', 'own', 'into', 'yourself', 'down', 'your', 'from', 'her', 'their', 'there', 'been', 'whom', 'too', 'themselves', 'was', 'until', 'more', 'himself', 'that', 'but', 'don', 'with', 'than', 'those', 'he', 'me', 'myself', 'these', 'up', 'will', 'below', 'can', 'theirs', 'my', 'and', 'then', 'is', 'am', 'it', 'an', 'as', 'itself', 'at', 'have', 'in', 'any', 'if', 'again', 'no', 'when', 'same', 'how', 'other', 'which', 'you', 'after', 'most', 'such', 'why', 'a', 'off', 'i', 'yours', 'so', 'the', 'having', 'once' 

rõ ràng là bạn có thể cung cấp thiết lập riêng của bạn; Tôi đồng ý với nhận xét về câu hỏi của bạn rằng có lẽ dễ nhất (và nhanh nhất) để cung cấp tất cả các biến thể bạn muốn loại bỏ trước, trừ khi bạn muốn loại bỏ nhiều từ hơn thế nhưng sau đó nó trở thành một câu hỏi phát hiện những thứ thú vị hơn là loại bỏ những thứ giả mạo.

+3

Đảm bảo thực thi nltk.download() trước để truy xuất kho dữ liệu của bạn. –

Các vấn đề liên quan