Tách danh từ riêng trong văn bản

Một phần của tài liệu (LUẬN VĂN THẠC SĨ) Tính toán độ tương tự ngữ nghĩa văn bản dựa vào độ tương tự giữa từ với từ (Trang 43)

CHƢƠNG III ĐỘ TƢƠNG TỰ VĂN BẢN-VĂN BẢN

3.2.2.2.Tách danh từ riêng trong văn bản

3.2. Giải quyết bài toán

3.2.2.2.Tách danh từ riêng trong văn bản

 Đầu vào: văn bản sText là văn bản đã tách từ ghép.

 Đầu ra: văn bản sOutText tách thành văn bản đã đoán nhận các danh từ riêng. - Danh từ riêng: là các từ khơng đứng ở đầu câu gồm ít nhất 2 từ mà chữ cái đầu viết hoa.

- Dùng một vector để lƣu danh sách các danh từ riêng (tên riêng) đã tìm đƣợc.

- Hàm (phƣơng thức) IsName để kiểm tra xem một từ có phải là danh từ riêng (tên riêng) hay không (tức kiểm tra xem chữ cái đầu của từ đó có viết hoa khơng, đồng thời nó khơng phải là từ ghép đã đốn nhận).

 Cách tách nhƣ sau:

 Bƣớc 1: Ngắt văn bản thành các câu phân cách nhau bởi dấu xuống dòng hoặc dấu chấm câu.

 Bƣớc 2: Ngắt mỗi câu thành mảng các từ đơn.  Bƣớc 3: Với mỗi câu văn bản:

 Bỏ qua các từ viết hoa liền nhau ở đầu câu.

 Xét từng từ một, nếu thấy từ dạng tên riêng mà khơng đứng ở đầu câu thì lƣu lại vào biến tạm aName. Khi có 2 từ liền nhau trở lên đƣợc lƣu vào biến tạm, đồng thời từ tiếp theo không phải là dạng tên riêng, thì ta thêm aName vào danh sách danh từ riêng (lƣu vào vector).

 Mỗi lần lƣu một danh từ riêng vào vector xong, ta xóa rỗng biến tạm để chuẩn bị xét đến từ tiếp theo.

 Cứ tiếp tục làm nhƣ vậy cho đến khi hết câu văn.

 Bƣớc 4: Xét ngƣợc lại các trƣờng hợp danh từ đứng ở đầu câu. Nếu một danh từ riêng đã đƣợc xác định ở chỗ khác trong câu thì khi đó, nếu nó xuất hiện ở đầu câu (trƣờng hợp đã bỏ qua khi xét ở trên) thì nó cũng là danh từ riêng.

 Với mỗi từ trong danh sách tên riêng, ta thay dấu cách phân cách từ bằng dấu gạch dƣới và lƣu vào biến realName.

 Với mỗi câu văn bản, ta thay tất cả những tên riêng aName bằng tên riêng realName (ví dụ thay hết các từ dạng “Nguyễn Văn A” thành dạng “Nguyễn_Văn_A”).

 Tiếp tục nhƣ trên cho tới khi hết thay thế hết tất cả các từ trong tất cả các câu văn.

Hạn chế: Đối với các tên riêng chỉ xuất hiện ở đầu câu mà khơng xuất hiện ở những vị

trí khác thì chƣơng trình chƣa phát hiện ra. Ví dụ:

 Văn bản 1: Chủ tịch Hồ Chí Minh vĩ đại sống mãi trong sự nghiệp của chúng ta.  Văn bản 2: Hồ Chí Minh mn năm. Hồ Chí Minh là một danh nhân văn hóa

thế giới.

Khi tính độ tƣơng tự, hai văn bản trên đƣợc tách từ nhƣ sau:

 Văn bản 1: Chủ_tịch Hồ_Chí_Minh vĩ_đại sống mãi trong sự_nghiệp của chúng_ta.

 Văn bản 2: Hồ Chí Minh mn năm. Hồ Chí Minh là một danh_nhân văn_hóa thế_giới.

Ở ví dụ trên, mặc dù từ Hồ Chí Minh xuất hiện 2 lần trong văn bản 2 nhƣng vì đứng ở đầu câu nên nó vẫn khơng đƣợc nhận biết là tên riêng.

Mã nguồn của module này nhƣ sau:

private static String splitNameWords(String sText) { StringBuffer sOutText = new StringBuffer();

Vector<String> vNameList = new Vector<String>(); String[] sParagraphArr = sText.split("\n");

for(String sParaItem: sParagraphArr) { String strWordArr[] = sParaItem.split(" "); boolean isFirstPositionOfParagraph = true; StringBuffer aName = new StringBuffer(); for (int i = 0; i < strWordArr.length; i++) { String currWord = strWordArr[i];

if (isFirstPositionOfParagraph) { if (!isName(currWord)) {

isFirstPositionOfParagraph = false; }

} else {

boolean hasName = false; if (isName(currWord)) { aName.append(currWord + " "); hasName = true; } if (!hasName || i == strWordArr.length - 1) { if (aName.length() > 0) { if (aName.toString().trim().indexOf(' ') > 0) { vNameList.addElement(aName.toString().trim()); }

aName.delete(0, aName.length()); } } } } }

//Xét ngƣợc lại các trƣờng hợp danh từ đứng ở đầu câu. for(String sParaItem: sParagraphArr) {

sParaItem = " " + sParaItem + " "; for (String aName: vNameList) {

String realName = aName.replace(' ', '_');

sParaItem = sParaItem.replace(" " + aName + " ", " " + realName + " "); } sOutText.append(sParaItem.trim() + "\n"); } return sOutText.toString(); } 3.2.3. Tính tốn độ tƣơng tự văn bản

 Đầu vào: Hai văn bản đã tách từ.  Đầu ra: Độ tƣơng tự giữa hai văn bản.

Độ tƣơng tự giữa hai văn bản đƣợc tính theo cơng thức:

Bƣớc 1: Tính tốn giá trị idf của một từ

Idf của một từ đƣợc tính bằng tổng số tồn bộ tài liệu trong tập corpus chia cho tổng số tài liệu chứa từ đó.

Bƣớc 2: Tính độ tƣơng tự lớn nhất của một từ so với một văn bản

Để dễ tính tốn, ta biểu diễn văn bản dƣới dạng mảng các từ (từ ghép + danh từ riêng) riêng lẻ. Sau đó, ta xét các trƣờng hợp nhƣ sau:

 Nếu có 2 từ giống hệt nhau thì trả lại giá trị 1.

 Nếu có 2 từ giống nhau nhƣng khác nhau ở chữ hoa chữ thƣờng thì trả lại giá trị 0.98.

 Nếu có 2 từ khác nhau nhƣng là từ đồng nghĩa thì trả lại giá trị 0.98.

    1 2 1 2 2 1 w{T} w{T} 12 w{T} w{T} axSim(w,T) (w) axSim(w,T) (w) 1 (,) 2 idf(w) idf(w) m idf m idf simTT                     

Bƣớc 3: Tính tốn độ tƣơng tự giữa hai văn bản: dựa vào các tính tốn từ bƣớc 2 và

theo công thức đã nêu ở trên.

 Mã nguồn của module này nhƣ sau: public class Processor {

/*

* Tính tốn IDF của 1 từ

* Giá trị mặc định là 1 (khi là từ mới - chƣa xuất hiện trong tài liệu nào) */

public static double getIDF(String word) {

int total_doc = FileProcessor.VProcessedFiles.size(); String sValue = WordDict.HashDict.get(word);

if (total_doc == 0 || sValue == null || sValue.length() == 0) return 1; int total_appear = sValue.split(";").length;

if (total_appear == 0) return 1;

double result = total_doc / total_appear; return result;

} /*

* Tính độ tƣơng tự lớn nhất của 1 từ so với 1 văn bản (dƣới dạng mảng các từ) * word: từ dùng để so khớp.

* sWordArr: nội dung văn bản đã tách ra thành mảng các String riêng lẻ */

public static double getMaxSim(String word, String[] sWordArr) { double maxValue = 0;

word = word.trim(); //loại bỏ các ký tự thừa ở đầu và cuối if (word.length() == 0) return 0;

Integer value1 = WordDict.CompoundDict.get(word); for (String currWord: sWordArr) {

if (currWord.length() <= 0) continue; if (currWord.equals(word)) { maxValue = 1; break; } else if (currWord.equalsIgnoreCase(word)) { if (maxValue < 0.98) maxValue = 0.98; } else {

Integer value2 = WordDict.CompoundDict.get(currWord);

if (value1!= null && value2!=null && value1.intValue() == value2.intValue()) { if (maxValue < 0.98) { maxValue = 0.98; } } } } return maxValue; } /*

* Tính tốn độ tƣơng tự giữa 2 văn bản * Đầu vào: 2 văn bản s1 + s2

*/

public static double getSim(String s1, String s2) { String sArr1[] = s1.split(" ");

for (int i = 0; i < sArr1.length; i++) { String word = sArr1[i];

double word_idf = getIDF(word); total_idf1 += word_idf;

total_maxsim1 += getMaxSim(word, sArr2) * word_idf; }

double sim1 = 0; if (total_idf1 != 0) {

sim1 = total_maxsim1 / total_idf1; }

double total_maxsim2 = 0; double total_idf2 = 0;

for (int i = 0; i < sArr2.length; i++) { String word = sArr2[i];

double word_idf = getIDF(word); total_idf2 += word_idf;

total_maxsim2 += getMaxSim(word, sArr1) * word_idf; }

double sim2 = 0; if (total_idf2 != 0) {

sim2 = total_maxsim2 / total_idf2; }

return (sim1 + sim2)/2; }

}

3.3. Xây dựng hệ thống

Hình 8: Giao diện chính của hệ thống

3.3.1. Nhập trực tiếp 2 văn bản

Trong tab đầu tiên là tính độ tƣơng tự 2 văn bản, ta có thể gõ trực tiếp nội dung của hai văn bản. Sau đó nhấn nút “Tính độ tƣơng tự” ta sẽ đƣợc kết quả cần tìm.

 Ví dụ trƣớc khi nhấn nút:

Hình 9: Giao diện cho phép nhập trực tiếp hai văn bản

 Sau khi nhấn nút tính, văn bản đƣợc tách từ và ta có kết quả độ tƣơng tự giữa hai văn bản Sim(text1, text2) (là một số nằm trong khoảng [0,1]).

Hình 10: Giao diện kết quả độ tƣơng tự sau khi nhập hai văn bản

 Khi nhấn nút “Reset”, văn bản đƣợc thiết lập lại trạng thái lúc đầu khi ngƣời dùng nhập vào (tức văn bản khi chƣa tách từ).

 Khi nhấn nút “Văn bản khác”, hai văn bản đƣợc chọn ngẫu nhiên trong phần mã nguồn, giúp ta có thể test nhanh chƣơng trình.

 Khi nhấn nút “Xóa”, hệ thống cho phép ngƣời dùng nhập vào hai văn bản mới.

3.3.2. Nhập 2 văn bản từ file

Để tính độ tƣơng tự giữa hai file văn bản lƣu trong máy tính, ta chọn tab thứ hai trong phần giao diện chính: “Độ tƣơng tự 2 files”. Giao diện của lựa chọn này nhƣ sau:

Hình 11: Giao diện nhập hai văn bản từ file

 Đầu tiên, muốn chọn hai file văn bản nào, ta nháy vào nút “…”, sau đó chọn đƣờng dẫn tới file cần nhập.

 Sau đó, ta nháy vào nút “Lấy nội dung các file”, toàn bộ nội dung của hai file này sẽ đƣợc hiển thị trong phần Text 1 và Text 2.

 Cuối cùng nhấn nút “Tính độ tƣơng tự” để xem kết quả Sim(text1, text2).

Hình 12: Giao diện kết quả sau khi nhập hai văn bản từ file

3.3.3. Lấy nội dung 2 văn bản từ URL

Phần này có sử dụng mã nguồn mở từ một dự án nghiên cứu khác, trong mã nguồn mở này có sử dụng thƣ viện phân tích nội dung HTML của dự án VietSpider (file VSHTMLParser.jar).

Địa chỉ gốc của tiện ích phân tích và bóc tách nội dung một số trang tin tức Việt Nam: http://code.google.com/p/vn-news-parser/downloads/list. Đây là một project mã nguồn mở, tuy đơn giản nhƣng nó có đủ các tính năng để cài đặt phục vụ test chƣơng trình.

Bộ phân tích nội dung HTML (HTMLParser) lấy từ dự án phần mềm miễn phí VietSpider tại địa chỉ: http://sourceforge.net/projects/binhgiang/files/. VietSpider là bộ phần mềm khai thác, tổng hợp thông tin từ Internet, ở đây chỉ sử dụng một file thƣ viện trong bộ phần mềm này.

Hình 13: Giao diện tính độ tƣơng tự nội dung của hai trang Web  Đầu tiên, ta nhập địa chỉ của hai trang web vào URL 1 và URL 2.

 Nhấn nút “Xử lý lấy nội dung” để lấy ra nội dung văn bản của hai trang web này. Khi đó, tồn bộ nội dung của chúng sẽ đƣợc hiển thị lần lƣợt tại Text 1 và Text 2.

 Nhấn nút “Tính độ tƣơng tự” để tìm kết quả Sim(text1, text2).

 Muốn lấy nội dung của hai trang web khác, nhấn vào nút “Xét URL khác”.  Nhấn nút “Thoát” để ra khỏi hệ thống.

3.4. Kết quả thử nghiệm và đánh giá 3.4.1. Một số ví dụ cụ thể 3.4.1. Một số ví dụ cụ thể

Độ tƣơng tự ngữ nghĩa văn bản đƣợc minh họa bởi một số ví dụ sau:  Ví dụ 1:

Văn bản 1 (Text 1):

Một cơn giơng bão dữ dội chỉ cịn cách Trƣờng Sa khoảng năm bảy km. Đừng chần chờ chống bão.

Văn bản 2 (Text 2):

Truyện thơ là những truyện kể bằng thơ, biểu hiện cảm nghĩ bằng ngơn ngữ giàu hình ảnh, cảm xúc, chứa đựng vấn đề xã hội. Có sƣ kết hợp yếu tố tự sự và trữ tình, dung lƣợng lớn, mang tính chất cố sự của truyện kể dân gian, biểu hiện dƣới hình thức thơ ca với màu sắc trữ tình đậm.

 Độ tƣơng tự giữa hai văn bản: Sim(Text1, Text2) = 0.0016756471374935402 Về mặt thực tế, văn bản 1 nói về tin tức dự báo thời tiết, cịn văn bản 2 nói về đặc điểm của truyện thơ. Hai nội dung này hồn tồn khác nhau, khơng có từ nào trùng nhau và khơng có bất cứ mối liên hệ nào về mặt ý nghĩa.

Cịn theo thực nghiệm trên máy, chúng ta có độ tƣơng tự giữa hai văn bản trên là 0.0016756471374935402. Độ đo này tƣơng đối hợp lý vì hai văn bản trên khác nhau hồn tồn.

Ví dụ 2:

Văn bản 1 (Text 1):

Nhận án chung thân, ơng Sĩ cịn bị điều tra “bỏ túi” 2 triệu USD

Dù ông Sĩ một mực cho rằng khơng nhận hối lộ từ PCI nhƣng tịa vẫn khẳng

định có đủ căn cứ buộc tội nên tuyên phạt mức án chung thân. Tòa còn kiến nghị tiếp tục điều tra về cáo buộc nhận hơn 2 triệu USD trƣớc đó của ơng này.

Theo HĐXX, hồ sơ vụ án đã thể hiện, để đƣợc trúng thầu gói thầu “Tƣ vấn thiết kế”, “Tƣ vấn giám sát” và đƣợc ƣu ái những điều kiện có lợi, các quan chức PCI đã

nhiều lần hối lộ ông Sĩ.

Ngoài ra, tịa buộc ơng Sĩ phải nộp lại 262.000 USD phạm tội. Do ông Sĩ đang phải chịu mức án 6 năm tù về tội “lợi chức vụ quyền hạn trong khi thi hành công vụ” nên HĐXX gộp chung hai bản án, buộc ông Sĩ phải nhận mức án chung thân cho cả

hội tội.

Cơ quan xét xử cũng kiến nghị cơ quan điều tra và VKSND Tối cao tiếp tục

làm rõ hành vi nhận 6 lần tiền trƣớc đó (hơn 2 triệu USD) từ phía PCI.

Văn bản 2 (Text 2):

Đề nghị ông Sĩ tù chung thân

Đến phút cuối, ông Huỳnh Ngọc Sĩ vẫn cho rằng mình khơng có tội, mong

HĐXX xem xét, làm rõ, đánh giá từng chi tiết để minh oan.

Tiếp tục phiên tịa sơ thẩm xét xử ơng Huỳnh Ngọc Sĩ, nguyên phó giám đốc Sở GTVT kiêm giám đốc Ban Quản lý dự án đại lộ Đông Tây và môi trƣờng nƣớc TPHCM (gọi tắt là BQLDA), về tội nhận hối lộ, ngày 16-10, VKSND TPHCM đƣợc ủy quyền của VKSND Tối cao thực hành quyền công tố tại tòa nhận định trong quá

các quan chức PCI..., đã đủ cơ sở kết luận ông Sĩ đã nhận 262.000 USD và làm theo yêu cầu của ngƣời đƣa hối lộ. Vị công tố đề nghị tù chung thân đối với bị cáo Sĩ.  Hai văn bản trên về mặt nội dung không hồn tồn giống nhau nhƣng có một số từ bị lặp lại ở cả hai văn bản (các từ in đậm). Theo thực nghiệm trên máy ta có độ tƣơng tự giữa hai văn bản: Sim(Text1, Text2) = 0.36826248198851375

Ví dụ 3:

Văn bản 1:

Huỳnh Ngọc Sĩ: “Cáo trạng hồn tồn khơng đúng”

Ra trƣớc vành móng ngựa, bị cáo Huỳnh Ngọc Sĩ đã phản đối toàn bộ nội dung bản cáo trạng của Viện Kiểm sát nhân dân tối cao truy tố bị cáo nhận hối lộ.

Bƣớc vào phần thẩm vấn, khi Chủ tọa phiên tòa vừa hỏi Huỳnh Ngọc Sĩ, cáo trạng truy tố đúng hay sai? Bị cáo Sĩ đã phản ứng gay gắt: "Tơi phản bác hồn tồn nội dung cáo trạng truy tố tôi nhận hối lộ. Việc đƣa nhận hối lộ chỉ là lời khai của các cá

nhân PCI; khơng có nhân chứng, chứng cứ trực tiếp”. Bị cáo Sĩ cũng khẳng định:

“Bốn vấn đề mà cáo trạng nêu tôi làm lợi cho PCI là hồn tồn khơng đúng, quy kết

tội cho tơi”.

Văn bản 2:

Huỳnh Ngọc Sĩ: “Tôi không nhận hối lộ”

(Dân trí) - “Việc PCI rút tiền từ ngân hàng Tokyo chi nhánh TPHCM, đem tiền từ Nhật qua và trả lƣơng… không đồng nghĩa là tiền hối lộ. Tơi hồn tồn không nhận tiền hối hộ”, bị cáo Huỳnh Ngọc Sĩ liên tục “phản pháo” HĐXX.

Huỳnh Ngọc Sĩ nói: “Lời khai nhƣ thế là không đúng. Tơi khơng tiếp ai tại

phịng làm việc riêng hay thƣơng lƣợng với ai tại khách sạn cả”. Suốt phiên tòa, bị cáo

Sĩ đều khơng thừa nhận mình đã nhận “bơi trơn” số tiền 262.000 USD. Sĩ khai mình

khơng hề biết đến ơng Takasu Kunio, nguyên giám đốc điều hành PCI (ngƣời đƣợc

xác định đã đƣa tiền hối lộ cho ông Sĩ).

Bị cáo Sĩ vẫn giữ nguyên quan điểm: “Khơng chính xác. Khơng đúng sự thật. Khơng nhận…”. Để làm rõ sự việc, cơ quan điều tra cho các quan chức PCI nhận dạng

thì họ nhận đúng hình và vẽ đúng sơ đồ phịng làm việc của ơng Sĩ.

Bị cáo Sĩ quả quyết: “Việc PCI rút tiền từ ngân hàng Tokyo chi nhánh

TPHCM, đem tiền từ Nhật qua và trả lƣơng… không đồng nghĩa là tiền hối lộ. Tơi

hồn tồn khơng nhận tiền hối hộ”.

Hai văn bản trên có số từ ngữ bị lặp lại không nhiều nhƣng về mặt ý nghĩa chúng cũng có điểm tƣơng đồng. Độ tƣơng tự của chúng là 0.5206761702244165 cũng phản ánh đƣợc phần nào nội dung đó.

Ví dụ 4

Văn bản 1 (Text 1):

Bán chung cƣ Văn Phú Victoria-Hà Nội LH: 0943212996

Dự án nằm giữa khu đô thị Văn Phú, quận Hà Đông, TP.Hà Nội, đƣợc tƣ vấn thiết kế và giám sát bởi các công ty Nhật Bản với phong cách độc đáo, hiện đại. Khu vực: Q. Hà Đơng, Hà Nội .

Tổng diện tích: 94,1 ha Khởi cơng: 2009

Dự kiến hồn thành: 2012 Trạng thái dự án: Đang thi công

Chủ đầu tƣ: Công ty cổ phần đầu tƣ Văn Phú-invest

+ Căn hộ 95,3m2: 01 Phòng khách, 01 bếp, 01 Phòng ăn, 02 Phòng ngủ, 02 phòng WC. + Căn hộ 116,2 m2: 01 Phòng khách, 01 Phòng bếp, 01 Phòng ăn, 02 Phòng ngủ, 02 Phòng WC. + Căn hộ 117m2: 01 Phòng khách, 01 bếp, 01 Phòng ăn. 03 Phòng ngủ, 02

Một phần của tài liệu (LUẬN VĂN THẠC SĨ) Tính toán độ tương tự ngữ nghĩa văn bản dựa vào độ tương tự giữa từ với từ (Trang 43)