NLP: một số gói phổ biến cho mã thông báo nhiều từ là gì?


7

Tôi dự định token hóa một số văn bản mô tả công việc. Tôi đã thử mã thông báo tiêu chuẩn bằng cách sử dụng khoảng trắng làm dấu phân cách. Tuy nhiên tôi nhận thấy rằng có một số biểu thức nhiều từ được phân tách bằng khoảng trắng, điều này có thể gây ra vấn đề chính xác trong quá trình xử lý tiếp theo. Vì vậy, tôi muốn có được tất cả các collocations thú vị / thông tin nhất trong các văn bản này.

Có gói nào tốt để thực hiện mã thông báo nhiều từ, bất kể ngôn ngữ lập trình cụ thể không? Ví dụ: "Anh ấy học Công nghệ thông tin" ===> "Anh ấy" "học" "Công nghệ thông tin".

Tôi đã nhận thấy NLTK (Python) có một số chức năng liên quan.

Sự khác biệt giữa hai điều này là gì?

Lớp MWETokenizer trong mô-đun nltk.tokenize.mwe dường như hoạt động hướng tới mục tiêu của tôi. Tuy nhiên, MWETokenizer dường như yêu cầu tôi sử dụng phương thức xây dựng và phương thức .add_mwe để thêm các biểu thức nhiều từ. Có cách nào để sử dụng từ vựng biểu thức nhiều từ bên ngoài để đạt được điều này không? Nếu vậy, có bất kỳ từ vựng nhiều từ?

Cảm ơn!

Câu trả lời:


2

Mã thông báo đa từ 'nltk.tokenize.mwe' về cơ bản hợp nhất một chuỗi đã được chia thành các mã thông báo, dựa trên từ vựng, từ những gì tôi hiểu từ tài liệu API.

Một điều bạn có thể làm là token hóa và gắn thẻ tất cả các từ bằng thẻ part-of-speech (PoS) được liên kết của nó, sau đó xác định các biểu thức chính quy dựa trên các thẻ PoS để trích xuất các cụm từ khóa thú vị.

Chẳng hạn, một ví dụ được điều chỉnh từ Sách NLTK Chương 7bài đăng trên blog này :

def extract_phrases(my_tree, phrase):
   my_phrases = []
   if my_tree.label() == phrase:
      my_phrases.append(my_tree.copy(True))

   for child in my_tree:
       if type(child) is nltk.Tree:
            list_of_phrases = extract_phrases(child, phrase)
            if len(list_of_phrases) > 0:
                my_phrases.extend(list_of_phrases)

    return my_phrases



def main():
    sentences = ["The little yellow dog barked at the cat",
                 "He studies Information Technology"]

    grammar = "NP: {<DT>?<JJ>*<NN>|<NNP>*}"
    cp = nltk.RegexpParser(grammar)

    for x in sentences:
        sentence = pos_tag(tokenize.word_tokenize(x))
        tree = cp.parse(sentence)
        print "\nNoun phrases:"
        list_of_noun_phrases = extract_phrases(tree, 'NP')
        for phrase in list_of_noun_phrases:
            print phrase, "_".join([x[0] for x in phrase.leaves()])

Bạn đã xác định một ngữ pháp dựa trên regex trên các thẻ PoS:

grammar = "NP: {<DT>?<JJ>*<NN>|<NNP>*}"
cp = nltk.RegexpParser(grammar)

Sau đó, bạn đã áp dụng nó cho một câu được mã hóa và được gắn thẻ, tạo Cây:

sentence = pos_tag(tokenize.word_tokenize(x))
tree = cp.parse(sentence)

Sau đó, bạn sử dụng extract_phrases(my_tree, phrase)để phân tích đệ quy Cây và trích xuất các cây con được dán nhãn là NP. Ví dụ trên sẽ trích xuất các cụm danh từ sau:

Noun phrases:
(NP The/DT little/JJ yellow/JJ dog/NN) The_little_yellow_dog
(NP the/DT cat/NN) the_cat

Noun phrases:
(NP Information/NNP Technology/NNP) Information_Technology

Có một bài đăng blog tuyệt vời của Burton DeWilde về nhiều cách khác để trích xuất các cụm từ khóa thú vị: Giới thiệu về trích xuất cụm từ khóa tự động


1

Quá trình mã thông báo không nên thay đổi ngay cả khi bạn quan tâm đến nhiều từ. Rốt cuộc, các từ vẫn là các mã thông báo cơ bản. Những gì bạn nên làm điều đó để tìm cách kết hợp các từ thích hợp thành thuật ngữ.

Một cách đơn giản để làm như vậy là tìm kiếm thuật ngữ trong đó xác suất của thuật ngữ cao hơn so với mã thông báo độc lập. Ví dụ: P ("Nhà trắng")> P ("Trắng") * P ("Nhà") Chọn các giá trị phù hợp của nhu cầu nâng, số lần xuất hiện và phân loại thuật ngữ có thể được suy luận nếu bạn có bộ dữ liệu thuật ngữ tạo thành miền . Nếu bạn không có tên miền như vậy thì yêu cầu ít nhất 10 lần xuất hiện và mức tăng ít nhất là 2 (thường là cao hơn nhiều vì mỗi xác suất mã thông báo thấp) sẽ hoạt động khá tốt.

Trong trường hợp của bạn cũng có thể trích xuất các thuật ngữ bằng cách kết hợp các bối cảnh có liên quan đến tên miền của bạn (ví dụ: "nghiên cứu X", "thực hành Y").

Một lần nữa, bạn có thể xây dựng các mô hình phức tạp và thanh lịch cho điều đó nhưng thông thường, tìm kiếm một vài từ tiếp theo sau các chỉ số ngữ cảnh sẽ rất có lợi.


1

Đối với vấn đề của bạn tôi nghĩ gensim có thể rất hữu ích, những gì có thể được thực hiện với thư viện Gensim là phát hiện cụm từ. Nó tương tự như n-gram, nhưng thay vì lấy tất cả n-gram bằng cách trượt cửa sổ, nó phát hiện các cụm từ được sử dụng thường xuyên và gắn chúng lại với nhau. Nó thống kê đi qua văn bản văn bản và xác định các từ xuất hiện song song phổ biến.
Sau đây là cách tính toán mã thông báo nhiều từ phù hợp nhất. nhập mô tả hình ảnh ở đây

Sau đây là mã để sử dụng nó. nó tính toán hai mã thông báo từ.

from gensim.models.phrases import Phrases, Phraser

tokenized_train = [t.split() for t in x_train]
phrases = Phrases(tokenized_train)
bigram = Phraser(phrases)

và đây là cách bạn sẽ sử dụng nó

nhập mô tả hình ảnh ở đây

Lưu ý từ "new_york" được ghép nối, vì trong kho văn bản, bằng chứng thống kê của cả hai từ "mới" và "york" đi cùng nhau là rất quan trọng.

Hơn nữa, bạn có thể tăng tối đa n-gram cho điều này không chỉ là bi-gram. Đây là bài viết giải thích chi tiết.


0

Phần mở rộng này của Stanford CoreNLP để nắm bắt Biểu thức MultiWord (MWE) hoạt động như một cơ duyên cho một trong những nhiệm vụ của tôi. Đối với người dùng Python, hãy chuẩn bị để viết một số mã trình kết nối hoặc hack mã Java.



0

Sử dụng thư viện Stanford CoreNLP để mã thông báo nhiều từ. Tôi đã tìm thấy nó khi tôi đang làm nhiệm vụ tương tự và nó hoạt động khá tốt!

Đã cập nhật: Bạn có thể sử dụng đường ống Stanford CoreNLP bao gồm mô hình mã thông báo nhiều từ. Liên kết demo để đào tạo mạng lưới thần kinh với dữ liệu của riêng bạn ở đây


Có lẽ bạn cũng có thể thêm một đoạn mã nhỏ để cho OP biết cách sử dụng nó.
TASos

Có, nhưng thông tin chi tiết về cách sử dụng và đào tạo với dữ liệu riêng được cung cấp trong liên kết được đề cập. Tôi cũng đã thêm một liên kết cụ thể cung cấp bản demo để đào tạo mô hình của họ cho mã thông báo nhiều từ
Noman

Đó là một điều phổ biến mà các câu trả lời liên kết nên tránh vì nhiều lý do. Ví dụ: nội dung của trang có thể thay đổi hoặc liên kết sẽ không thể truy cập được trong tương lai. Khi người dùng mới truy cập trang này, sẽ có thể nhận được thông tin mà OP yêu cầu. Chỉ là thực hành tốt nhất.
TASos

Oh bây giờ tôi nhận được nó, cảm ơn đã chỉ ra. Tôi sẽ cố gắng tìm mã của mình để sử dụng mô hình mwt CoreNLP hoặc tôi sẽ mã lại và dán vào đây (trong vài ngày) vì thông tin của cộng đồng!
Noman
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.