Я работаю над анализом настроений в C #, я выполнил предварительную обработку, а следующая часть - анализ на основе лексики, для которого я нашел английский лексикон из примерно 6800 слов словарь профессора Бинга Лю, который содержит два текстовых файла: один для положительных, а другой - для отрицательных.

Я думал, что мне нужно просто найти каждое слово (эмоциональное слово) из этих файлов, которое либо определенное слово является положительным, либо отрицательным. но проблема в том, что эти файлы содержат слова без пробелов и без какого-либо формата (это означает, что отдельные слова не могут быть распознаны из файла).

Итак, как мне найти слово в файле? Или есть какой-нибудь другой способ, которым я могу легко с этим работать?

2
Adnan Ali 16 Окт 2015 в 17:33

3 ответа

Лучший ответ

В файле используется \n в качестве разделителя строк (в отличие от стандартного Windows \r\n). Так что просто не открывайте его с помощью Блокнота или подобного, сделайте это с помощью WordPad .

Чтобы загрузить файл в коллекцию (пусть это будет HashSet<String> - вы, вероятно, захотите проверить, находится ли слово в положительных словах или нет), вы можете использовать Linq :

  HashSet<String> positives = new HashSet<String>(File
    .ReadLines(@"C:\positive-words.txt")
    .Where(item => !String.isNullOrEmpty(item) && !item.StartsWith(";")));

  ....

  String testWord = ...

  if (positives.Contains(testWord)) {
    ...
  }

Фактическое содержимое файла

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 
; Opinion Lexicon: Positive
...
;       frequently in social media content. 
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

a+
abound
abounds
abundance
...
zenith
zest
zippy
1
Dmitry Bychenko 16 Окт 2015 в 16:21

Кажется, что файл содержит слова, разделенные символом перевода строки (\n), поэтому простейшим подходом было бы прочитать файл с помощью File.ReadAllLines.

var fileContents = File.ReadAllLines("negative-words.txt");
var words = new HashSet<string>(fileContents.SkipWhile(x => x.StartsWith(";") || x == String.Empty));

var containsWord = words.Contains("2-faced"); // The first valid word...

Помещение содержимого в HashSet позволяет запрашивать содержимое, вам не нужен словарь.

1
David Kirkland 16 Окт 2015 в 15:21

На самом деле файл содержит по одному слову в строке, но окончания строк выполнены в стиле Unix, а не Windows, поэтому некоторые редакторы (например, Блокнот) будут отображать все в одной строке.

Вы можете легко прочитать слова с помощью File.ReadAllLines (игнорируйте строки, начинающиеся с ;, это комментарии).

1
Gabriel Negut 16 Окт 2015 в 14:53